我有一个Spring应用程序,它同时连接到两个数据库。所以我为每个连接提供了两个LocalSessionFactoryBean实例,如下所示:
@Bean
public LocalSessionFactoryBean firstSessionFactory() {
final LocalSessionFactoryBean lsfb = new LocalSessionFactoryBean();
lsfb.setPackagesToScan("ro.mycompany.myproject.classes");
lsfb.setDataSource(dataSourceOne);
lsfb.setEntityInterceptor(auditInterceptor1);
lsfb.setHibernateProperties(getHibernateProperties1());
return lsfb;
}
@Bean
public LocalSessionFactoryBean secondSessionFactory() {
final LocalSessionFactoryBean lsfb = new LocalSessionFactoryBean();
lsfb.setPackagesToScan("ro.mycompany.myproject.classes2");
lsfb.setDataSource(dataSourceTwo);
lsfb.setEntityInterceptor(auditInterceptor2);
lsfb.setHibernateProperties(getHibernateProperties2());
return lsfb;
}
对于DAO层,我有一个类,它会像这样注入SessionFactory对象。
public class GenericDAOImpl extends HibernateDAOSupport implements GenericDAO {
@Autowired
private SessionFactory sessionFactory;
//Other methods goes here
}
我在配置文件中实例化bean,如下所示:
@Bean
public GenericDAO firstGenericDAO() {
final GenericDAOImpl genericDAO = new GenericDAOImpl();
return genericDAO;
}
@Bean
public GenericDAO secondGenericDAO() {
final GenericDAOImpl genericDAO = new GenericDAOImpl();
return genericDAO;
}
如何在不创建setter方法的情况下让firstGenericDAO使用firstSessionFactory和secondGenericDAO来使用secondSessionFactory?我想同时使用这两个连接,所以Spring配置文件也无法帮助我。 谢谢
答案 0 :(得分:1)
除@Qualifier("...")
外,使用@Autowired
或仅使用@Resource(name = "...")
。我个人更喜欢使用@Resource,因为它用单个注释取代了两个注释。
在您的情况下,分别为@Resource(name = "firstSessionFactory")
和@Resource(name = "secondSessionFactory")
。
答案 1 :(得分:1)
对于您的代码,
public class GenericDAOImpl extends HibernateDAOSupport implements GenericDAO {
@Autowired
private SessionFactory sessionFactory;
//Other methods goes here
}
应该清楚知道Spring将自动装配哪个bean。这意味着,应该有setter方法或其他一些变量来区分你的sessionFactory1和sessionFactory2。
就像你说的那样,基于xml仍然是功能而不是注释。如果您不想使用基于XML,也不想使用setter方法,我认为可以通过另一个变量初始化sessionFactory来识别使用的bean。
例如,
public class GenericDAOImpl extends HibernateDAOSupport implements GenericDAO {
private SessionFactory sessionFactory;
public GenericDAOImpl(boolean tag) {
super();
ApplicationContext apx = new AnnotationConfigApplicationContext(xxxx.class);
sessionFactory = tag ? (SessionFactory) apx.getBean("sessionFactory1")
: (SessionFactory) apx.getBean("sessionFactory1");
}
}
当然,您需要为@Bean(name = "sessionFactory1")
和@Bean(name = "sessionFactory2")