【问题标题】:autowire distinct beans in abstract class在抽象类中自动装配不同的bean
【发布时间】:2014-12-14 17:24:20
【问题描述】:

我有以下问题:

假设我有一个抽象类让我们说:

public abstract class AbstractHbmDao implements SomeInterface {
    @Autowired
    protected SessionFactory sessionFactory;
    //getters & setters

    //interface stuff
}

然后是 SomeInterface 的几个实现 -> A_InterfaceB_Interface 等。如果我对每个实现都使用相同的 SessionFactory,这没关系。

问题是我想将不同的SessionFactory 用于不同的实现组,我不想用@Qualifier 指定。由于我需要更改代码,因此定义这些组的灵活性会降低。也可以通过将SessionFactory 放在抽象类中,如果无法使用@Qualifier 注释来指定。

有没有办法在 xml bean 定义中做到这一点?我尝试声明两个 SessionFactory bean,然后为每个 ref 对应的类,但这仍然会返回 NoUniqueBeanDefinitionException

【问题讨论】:

    标签: java spring spring-annotations spring-bean


    【解决方案1】:

    字段注入本身就很脆弱,应尽可能首选构造函数注入。这是干净的解决方案:在您的基类上创建一个抽象 (protected) 构造函数,将您的 bean 作为参数,并在子类构造函数上使用 @Qualifier

    【讨论】:

      【解决方案2】:

      使用字段注入的另一种方法是不在基类中自动装配字段,而是创建一个抽象方法来获取 SessionFactory 并在子类中自动装配字段。

      public abstract class AbstractHbmDao implements SomeInterface {
          protected abstract SessionFactory getSessionFactory();
      }
      

      并在子类中实现此方法:

      public MyDao extends AbstractHbmDao {
          @Autowired
          @Qualifier("my-qualifier")  // add qualifier as needed now
          private SessionFactory sessionFactory;
      
          protected SessionFactory getSessionFactory() { return sessionFactory; }
      }
      

      【讨论】:

        猜你喜欢
        • 2017-03-14
        • 2011-05-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多