4

SpringJavaConfigで使用しているもの@Autowiredが機能しない理由を理解するのに苦労しています。

まず、@AutowiredJavaConfigクラスのすべてのアノテーションを移動しようとしています。これは、私の「POJO」を実際のPOJOに戻す効果があります。そうすれば、Springコンテキストの外でそれらを簡単にテストできるだけでなく、モックオブジェクトを簡単かつ簡単に使用することもできます。

だから私は最初にこれを試しました:

@Configuration
public class Module3ConfigClass {

    @Autowired
    private Module1Bean1 module1Bean1;

    @Autowired
    private Module2Bean1 module2Bean1;

    @Bean
    public Module3Bean1 module3Bean1() {
        return new Module3Bean1(module1Bean1, module2Bean1);
    }
}

ただし、Module3Bean1コンストラクターが呼び出されると、Beanに渡される両方がnullになります。上記の私の作成した命名規則に従わなかった場合、これらのBeanは両方とも別個のJavaConfig構成ファイルによって作成されます。また、すべてが正しく配線されていることにも注意してください。@Autowiredタグが内の対応するプライベートメンバーフィールドにある場合、すべてが完全に機能するため、これはわかっていますModule3Bean1

@DependsOnFWIW、メソッドにアノテーションを追加しようとしましmodule3Bean1()たが、同じ結果になりました。私はこの振る舞いを本当に理解したいと思います、それは正しいですか(私はそれが正しいと思いますが、なぜですか)?

最後に、ここに示す許容可能な回避策を見つけました。

@Configuration
public class Module3ConfigClass {

    @Bean
    @Autowired
    public Module3Bean1 module3Bean1(Module1Bean1 module1Bean1, Module2Bean1 module2Bean1) {
        return new Module3Bean1(module1Bean1, module2Bean1);
    }
}

これは私には問題ないように思えますが、誰かがそれについてコメントしたいのであれば、それも歓迎されます。

4

2 に答える 2

0

同じ問題があり、 a が関与する循環依存関係があったためにエラーが発生したという結論に達しましたBeanPostProcessor

  • PropertyPlaceholderConfigurer (BeanPostProcessor) は、別の Bean を使用してその propertiesArray プロパティを設定するように構成されています。

    <bean id="globalPropertyPlaceholderConfigurer"
        class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"
        lazy-init="false" depends-on="javaLoggingConfigurer">
        <property name="locations">
            <list>
                <value>classpath:config/host/${env.instance}.properties</value>
                <value>WEB-INF/config/host/${env.instance}.properties</value>
            </list>
        </property>
        <property name="ignoreResourceNotFound" value="true" />
        <property name="propertiesArray" value="#{springPropertyFinder.findProperties()}" />
    </bean>
    
  • propertiesArray を設定するために使用される springPropertyFinder Bean はBeanPostProcessor ではなく、すべての Properties インスタンスを収集する「通常の」Bean です。

    public Properties[] findProperties() {
        Map<String, Properties> propertiesMap = applicationContext.getBeansOfType(Properties.class);
    
        for (String title : propertiesMap.keySet()) {
            PropertiesLoggerUtil.logPropertiesContent(logger, "Springcontext Properties ("+title+")", propertiesMap.get(title));
        }
    
        return propertiesMap.values().toArray(new Properties[propertiesMap.size()]);
    }
    
  • @Configuration クラスには、Properties タイプの Bean が含まれていました

したがって、PropertyPlaceholderConfigurer は @Configuration クラスのプロパティ Bean に依存する springPropertyFinder に依存するため、@Configuration クラスは ConfigurationClassPostProcessor (BeanPostProcessor も) によって処理されることなく作成されたと仮定します。これらの状況では、BeanPostProcessors の順序が適切に設定されていない可能性があります。

この説明された設定は XML では機能しましたが、Java 構成では機能しませんでした。

于 2013-11-20T12:20:40.267 に答える