1

したがって、構成クラスの 1 つに (Testing/Production)DatabaseConfig クラスの両方が含まれており、アクティブなプロファイルによって適切なクラスが選択されます。しかし、DatabaseConfig クラスが実行されると、dataSource ivar が null になります。

デバッグを行いました。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

わかりましたので、最初にこれを間違って実行したに違いありませんが、解決策は、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 に答える
0

物事は魔法のようにうまくいくだけではないようです! 構成クラスに ivar を自動配線させたい場合は、それを正しく構成する必要があります。この場合は、自動配線を行う別の Bean を用意する必要があります。

AutowiredAnnotationBeanPostProcessor Bean を作成する必要があります。

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

また

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