将Spring XML-Config中的SessionFactory注入Java-Config

时间:2013-12-03 22:53:31

标签: java spring

出于某种原因,我将我的spring bean配置为java配置,并且还在xml中定义了一些其他bean。 现在我想将在xml config中定义的sessionfactory bean注入到java config中的bean中。 不幸的是,sessionfactory为null,我得到一个NullPointerException。 怎么了?我正在使用Spring 3.2.5。另外@Inject或@Autowired而不是@Resource不起作用。

以下是相关部分......

Java配置:

@Configuration
@ComponentScan
@ImportResource({ "classpath:beans-sessionfactory.xml" })
public class MyJavaConfig {

   // defined in 'beans-sessionfactory.xml'
   @Resource
   //@Inject => also NPE
   //@Autowired => also NPE
   private AnnotationSessionFactoryBean sessionFactory;

   @Bean
   public MyDao getMyDao() {
      final MyDao dao = new MyDao();
      // Why is sessionFactory null?
      dao.setSessionFactory(this.sessionFactory.getObject());
      return dao;
   }

   // MyAppConfig extends PropertyPlaceholderConfigurer
   @Bean
   public MyAppConfig myAppConfig() {...}
...

XML-配置:

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
...
</bean

单元测试:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = { MyJavaConfig.class })
public class MyBeanWiringTest {
   // test fails with NPE
}

几乎完成的beans-sessionfactory.xml:

<?xml version="1.0" encoding="ISO-8859-15"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
                           http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd">

  <bean id="myDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" lazy-init="true">...</bean>

  <bean id="myProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean">...</bean>

  <bean id="hibernateProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean">...</bean>

  <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
    <property name="dataSource" ref="myDataSource"/>
    <property name="hibernateProperties" ref="hibernateProperties"/>
    <property name="annotatedClasses">
      <list>
        <value>MyEntity</value>
      </list>
    </property>
  </bean>

  <bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory"/>
  </bean>

  <tx:annotation-driven transaction-manager="txManager"/>

</beans>

2 个答案:

答案 0 :(得分:1)

AnnotationSessionFactoryBeanFactoryBean<SessionFactory>,这意味着它会创建SessionFactory。您可以注入结果而不是工厂。

@Configuration
@ComponentScan
@ImportResource({ "classpath:beans-sessionfactory.xml" })
public class MyJavaConfig {

   @Autowired
   private SessionFactory sessionFactory;

   @Bean
   public MyDao getMyDao() {
      final MyDao dao = new MyDao();
      // Why is sessionFactory null?
      dao.setSessionFactory(this.sessionFactory);
      return dao;
   }

如果你真的想要AnnotationSessionFactoryBean,你将不得不诉诸一些命名技巧。你必须注入一个名为'&amp; sessionFactory'的bean,注意&这是标记,表示你要FactoryBean而不是FactoryBean的结果。

@Autowired
@Qualifier("&sessionFactory")
private AnnotationSessionFactoryBean sessionFactory;

答案 1 :(得分:0)

问题在于:

  

Bean方法MyJavaConfig.myAppConfig是非静态的并返回一个   可分配给Spring的BeanFactoryPostProcessor接口的对象。   这将导致无法处理注释,例如   @Autowired,@ Resource和@PostConstruct在方法的声明中   @Configuration类。将'static'修饰符添加到此方法中   避免这些容器生命周期问题;请参阅@Bean Javadoc以获取完整信息   细节

因此,在声明myAppConfig static后,它可以正常工作。

@Bean
public static MyAppConfig myAppConfig() {...}