不同的spring bean实例的相同类

时间:2016-01-25 11:12:20

标签: java spring hibernate

我有一个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配置文件也无法帮助我。 谢谢

2 个答案:

答案 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")

指定LocalSessionFactoryBean的bean名称