java - Spring Java Config 使用 Autowired 导致 NPE

标签 java spring configuration

我很难理解为什么在 Spring Java Config 中使用 @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构造函数被调用,传入的两个Beans都是null。如果您不遵循我上面制定的命名约定,那么这两个 bean 都将由单独的 Java Config 配置文件创建。另请注意,所有 都正确连接 - 我知道这一点,因为当 @Autowired 时一切正常标签位于 Module3Bean1 中相应的私有(private)成员字段上.

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

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

@Configuration
public class Module3ConfigClass {

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

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

最佳答案

我认为您遇到了我刚刚遇到的同样问题。在我的例子中,问题是无效的 xml 配置。在我的模块 B 中,我的配置如下:

<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>

配置类属性的 Autowiring 开始工作。

关于java - Spring Java Config 使用 Autowired 导致 NPE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15392344/

相关文章:

java - 在 Interface Java 中设置内容

mysql - 无法在 XAMPP phpmyadmin 中编辑 MySQL 表 - 行中没有编辑/更改/插入/删除按钮

asp.net - 在统一配置部分与通用生命周期管理器一起工作

java - Java中有没有类似于Android中的android.os.Handler的类?

java - 线程 java.util.NoSuchElementExcpetion 中的异常 java

java - 数据库与spring roo的关系

java - spring security - 编写自定义 SPEL 访问表达式。我的方法正确吗?

spring - Hibernate 3.6 动态方言解析器

java - JNI 和构造函数

spring - 尝试在 URL 拦截器中设置安全性 ="none"时 SaxParseException