簡體   English   中英

將SessionFactory從Spring XML-Config注入Java-Config

[英]Inject SessionFactory from Spring XML-Config into Java-Config

由於某種原因,我將我的spring bean配置設為java config,並且在xml中定義了其他一些bean。 現在,我想將在xml配置中定義的sessionfactory bean注入到Java配置中的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>

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 ,則必須采取一些命名技巧。 你必須注入名為“和SessionFactory的”通知的Bean &這是表明春天要標記FactoryBean而不是結果FactoryBean

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

問題在這里:

Bean方法MyJavaConfig.myAppConfig是非靜態的,並返回可分配給Spring的BeanFactoryPostProcessor接口的對象。 這將導致無法在方法的聲明@Configuration類中處理諸如@ Autowired,@ Resource和@PostConstruct之類的注釋。 在此方法中添加“靜態”修飾符可避免這些容器生命周期問題; 有關完整的詳細信息,請參見@Bean Javadoc

因此,在聲明myAppConfig靜態后,它可以工作。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM