4

我很难理解为什么 Spring Java Config using 中的某些东西@Autowired不起作用。

首先,我试图@Autowired在 Java Config 类中移动我的所有注释。这具有使我的“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 都将由单独的 Java Config 配置文件创建。另请注意,所有内容都已正确连接 - 我知道这一点,因为当@Autowired标签位于Module3Bean1.

FWIW,我尝试向方法添加@DependsOn注释module3Bean1(),但结果相同。我想我真的很想了解这种行为,它是否正确(我怀疑它是,但为什么)?

最后,我找到了一个可以接受的解决方法:

@Configuration
public class Module3ConfigClass {

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

这对我来说似乎很好,但如果有人愿意对此发表评论,那也将受到欢迎。

4

2 回答 2

1

我想你遇到了我刚刚遇到的同样问题。在我的情况下,问题是无效的 xml 配置。在我的模块中,BI 的配置如下:

<beans>
      <context:component-scan base-package="com.moduleB"/>
      <import resource="classpath:applicationContext-moduleA.xml"/>
</beans>

在 moduleA 上下文中,我放置了“context:annotation-config”注释。当我将导入/上下文顺序更改为:

<beans>
      <import resource="classpath:applicationContext-moduleA.xml"/>
      <context:component-scan base-package="com.moduleB"/>
</beans>

配置类属性的自动装配开始起作用。

于 2013-07-01T11:12:35.517 回答
0

我们遇到了同样的问题,并得出的结论是错误的出现是因为我们有一个BeanPostProcessor涉及 a 的循环依赖。

  • 一个 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 而是一个“普通”bean,它收集所有 Properties 实例:

    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 类包含一个属性类型的 bean

所以我们的假设是@Configuration类已经创建,没有经过ConfigurationClassPostProcessor(也是一个BeanPostProcessor)的处理,因为PropertyPlaceholderConfigurer依赖于springPropertyFinder,而springPropertyFinder又依赖于@Configuration类中的properties bean。在这些情况下,可能没有正确设置 BeanPostProcessors 的顺序。

此描述的设置适用于 XML,但不适用于 Java 配置。

于 2013-11-20T12:20:40.267 回答