1

因此,我的配置类之一包括(测试/生产)DatabaseConfig 类,并且活动配置文件选择了正确的类。但是当 DatabaseConfig 类运行时,它的 dataSource ivar 为空。

我做了一个调试,我的 TestingDatabaseConfig 的 dataSource() 方法在 DatabaseConfig 的 localContainerEntityManagerFactoryBean() 运行之前运行。

我想我的问题是,为什么这不起作用,它应该起作用,我做错了什么?

@Configuration
@Profile({"testing-db", "production-db"})
@Import({TestingDatabaseConfig.class, ProductionDatabaseConfig.class})
@EnableTransactionManagement
public class DatabaseConfig
{
    @Resource
    private DataSource dataSource;

    @Bean(name = "entityManager")
    public LocalContainerEntityManagerFactoryBean localContainerEntityManagerFactoryBean()
    {
        LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean();

        entityManagerFactoryBean.setDataSource(this.dataSource);

        // other config

        return entityManagerFactoryBean;
    }

    // ... other db related beans stuff ...
}

@Configuration
@Profile("testing-db")
public class TestingDatabaseConfig implements DatabaseConfigInterface
{
    @Bean(name="dataSource")
    public DataSource dataSource()
    {
        JDBCDataSource dataSource = new JDBCDataSource();
        dataSource.setDatabase("jdbc:hsqldb:mem:testing");
        dataSource.setUser("sa");

        return dataSource;
    }
}
4

3 回答 3

2

当然,它们不会在调用构造函数之前被注入。

使用@PostConstruct。这是一个很好的例子:http ://www.mkyong.com/spring/spring-postconstruct-and-predestroy-example/

于 2012-07-03T02:01:16.737 回答
0

似乎事情不只是神奇地起作用!如果你想让配置类自动装配它们的 ivars,你必须正确配置它,或者在这种情况下,有另一个 bean 来进行自动装配。

您需要创建 AutowiredAnnotationBeanPostProcessor bean。

@Bean
public AutowiredAnnotationBeanPostProcessor autowiredAnnotationBeanPostProcessor()
{
    return new AutowiredAnnotationBeanPostProcessor();
}

或者

<bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor" />
于 2012-07-03T22:58:49.910 回答
0

好的,所以我第一次肯定做错了,但解决方案是让 bean 作为参数自动装配,而不是尝试将它们作为 ivar 注入。我必须更改才能使其正常工作的虚假差异......</p>

-    @Resource
-    private DataSource dataSource;

- public LocalContainerEntityManagerFactoryBean localContainerEntityManagerFactoryBean()
+ public LocalContainerEntityManagerFactoryBean localContainerEntityManagerFactoryBean(DataSource dataSource)

-    entityManagerFactoryBean.setDataSource(this.dataSource);
+    entityManagerFactoryBean.setDataSource(dataSource);

最终比我尝试做的更干净=)

于 2012-07-03T02:22:12.933 回答