工厂方法

Jul 11, 2017 10:17:31 PM

作者:wendal

什么是工厂方法?

工厂方法,就是通过一个"虚拟"构造方法,供调用者获取特定的实例. 至于返回的是什么实例, 得看环境和传入的参数,及方法内的业务逻辑了.

例如, 希望在生产环境用Product目录下的配置文件,开发环境用dev目录下的配置文件

使用Iocbean的factory

通过IocBean注解内的factory参数,可以自定义工厂类及工厂method

factory参数的规则是, 以井号分隔,井号之前的是类名或ioc bean名称, 后面是方法名称.

  1. @IocBean(factory="net.wendal.mqtt.MqttAbcServiceFactory#create", args={"refer:dao"})
  2. public class AbcService extends Service {
  3. ...
  4. }
  5. // 无任何注解
  6. public class MqttAbcServiceFactory {
  7. public static AbcService create(Dao dao) {
  8. return new XXXXAbcService(dao);
  9. }
  10. }

通过其他bean生成此bean, 区别就是用$对象名称 代替 上一个例子的类名

  1. @IocBean(factory="$snakerConfigure#build")
  2. public class SnakerService{}
  3. @IocBean(name="snakerConfigure")
  4. public class SnakerConfigure {
  5. public SnakerService build() {
  6. return ....;
  7. }
  8. }

使用IocBean实例方法

先看示例. 这个功能是1.r.62新增.

相比@IocBean的factory参数, 这种方式是声明"其他"bean的生成, 而不是自身.

  1. @IocBean // 首先,它自己必须加@IocBean, 可以使用@IocBean/@Inject的全部功能.
  2. public class MyBeanFactory {
  3. //@Inject
  4. //public PropertiesProxy conf; // 像普通对象那么注入任何你需要的东西,这个conf也可是其他IocBean类,但不能是这个类了,否则死循环了
  5. @IocBean
  6. public PropertiesProxy getConf() {
  7. if ("product".equals(System.getProperty("nutz.runmode"))) {
  8. return new PropertiesProxy("/etc/nutz/custom");
  9. } else {
  10. return new PropertiesProxy("custom/");
  11. }
  12. }
  13. // 生成一个名为dataSource的bean. 命名规则是: IocBean(name=XXX) > 方法名去掉get/build后首字母小写.
  14. @IocBean
  15. public SimpleDataSource getDataSource(PropertiesProxy conf) {
  16. SimpleDataSource ds = new SimpleDataSource();
  17. ds.setJdbcUrl(conf.get("db.url", "jdbc:h2:mem:nutztest"));
  18. return ds;
  19. }
  20. @IocBean
  21. public Dao buildDao(DataSource dataSource) { // 带参数, 默认是按类型注入
  22. return new NutDao(dataSource);
  23. }
  24. @IocBean(name="dao2") // 自定义bean的名字,这样方法名就随便起了
  25. public Dao xxxgetDao2(DataSource dataSource) {
  26. return new NutDao(dataSource);
  27. }
  28. @IocBean(name="dao3")
  29. public Dao xxyyy(@Inject("refer:dataSource")DataSource ds) { // 参数加@Inject,可以像属性加上@Inject一样注入值
  30. return new NutDao(ds);
  31. }
  32. @IocBean(name="dao3", create="init", depose="depose") // 事件也是支持的
  33. public UserService makeUserService(Dao dao) {
  34. return new UserServiceImpl(dao);
  35. }
  36. }

优缺点

  • 可以完全不使用js进行ioc配置
  • 可以更灵活地根据配置信息生成对象
  • 通过这种方式生成的对象,暂不支持Aop注入

本页面的文字允许在知识共享 署名-相同方式共享 3.0协议GNU自由文档许可证下修改和再使用。

原文: http://nutzam.com/core/ioc/ioc_factory.html