在抽象类中自动装配不同的bean

时间:2014-10-19 17:58:25

标签: java spring spring-annotations spring-bean

我有以下问题:

假设我有一个抽象类,可以说:

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并为每个bean引用相应的类,但这仍然会返回NoUniqueBeanDefinitionException

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

使用Field注入的另一种方法是不对基类中的字段进行自动装配,而是创建一个抽象方法来获取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; }
}