将SessionFactory从SpringXML配置注入Java配置

将SessionFactory从SpringXML配置注入Java配置,java,spring,Java,Spring,出于某种原因,我将springbeans配置为java配置,其他一些bean也是用xml定义的。 现在,我想将xml配置中定义的SessionFactorybean注入java配置中的bean。 不幸的是,sessionfactory为null,我得到了一个NullPointerException。 发生了什么?我使用的是Spring3.2.5。此外,@Inject或@Autowired代替@Resource也不起作用 以下是相关部分 Java配置: @Configuration @Compon

出于某种原因,我将springbeans配置为java配置,其他一些bean也是用xml定义的。 现在,我想将xml配置中定义的SessionFactorybean注入java配置中的bean。 不幸的是,sessionfactory为null,我得到了一个NullPointerException。 发生了什么?我使用的是Spring3.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
几乎完整的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>

...
...
...
MyEntity

注释SessionFactoryBean是一个
FactoryBean
,这意味着它创建了一个
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;
   }
如果您真的想要
注释SessionFactoryBean
,您将不得不求助于一些命名技巧。您必须注入一个名为“&sessionFactory”的bean,注意
&
这是一个标记,用于向spring指示您希望
FactoryBean
而不是
FactoryBean
的结果

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

AnnotationSessionFactoryBean
是一个
FactoryBean
,这意味着它创建了一个
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;
   }
如果您真的想要
注释SessionFactoryBean
,您将不得不求助于一些命名技巧。您必须注入一个名为“&sessionFactory”的bean,注意
&
这是一个标记,用于向spring指示您希望
FactoryBean
而不是
FactoryBean
的结果

@Autowired
@Qualifier("&sessionFactory")
private AnnotationSessionFactoryBean sessionFactory;
问题在于:

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

因此,在声明myAppConfig静态之后,它就可以工作了

@Bean
public static MyAppConfig myAppConfig() {...}
问题在于:

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

因此,在声明myAppConfig静态之后,它就可以工作了

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

我无法复制这个。您确定
beans sessionfactory.xml
包含您向我们展示的
AnnotationSessionFactoryBean
bean定义吗?当然,它也适用于我的xml配置的应用程序。仅对于另一个使用Java配置和xml配置的应用程序,它不起作用。正如前面所解释的,有一个NPE。另外,从xml连接其他bean也不起作用(NPE)。您能给我们展示一下您的项目或类路径的图像吗?我还想查看
beans sessionfactory.xml
的完整内容。不要注入
AnnotationSessionFactoryBean
,而是注入
sessionfactory
。我无法复制此内容。您确定
beans sessionfactory.xml
包含您向我们展示的
AnnotationSessionFactoryBean
bean定义吗?当然,它也适用于我的xml配置的应用程序。仅对于另一个使用Java配置和xml配置的应用程序,它不起作用。正如前面所解释的,有一个NPE。另外,从xml连接其他bean也不起作用(NPE)。您能给我们展示一下您的项目或类路径的图像吗?我还想查看
beans sessionfactory.xml的完整内容。不要注入
AnnotationSessionFactoryBean
,而是注入
sessionfactory