在子包中的@Component内使用@Autowire Environment的空指针

时间:2018-05-17 14:57:05

标签: spring spring-mvc spring-boot

我有一个简单的Spring Boot项目,其目录结构如下:

.
├── src
│   ├── main
│   │   ├── java
│   │   │   └── com
│   │   │       ├── example
│   │   │       │   └── base
.   .   │       │       ├── db
.   .   │       │       │   ├── entity
.   .   │       │       │   │   └── SomeComponent.java
.   .   │       │       │   ├── repository
        │       │       │   └── util
        │       │       └── development
        │       └── MainApplication.java     
        └── resources
            └── application.properties

MainApplication基本上是默认值:

package com.example.base;

@SpringBootApplication
public class MainApplication {

    @Autowired
    private Environment env;

    public static void main(String[] args) {
        SpringApplication application = new SpringApplication(MainApplication.class);
        application.run(args);
    }
    ...

在MainApplication.java中,我实际上对环境有一种有效的敬意,我实际上可以正确访问它,但是我在SomeComponent.class中得到 null

package com.example.base.db.entity;

@Component
public class SomeComponent {

    @Autowired
    private Environment env;

    public SomeComponent() {}

    public void foo() {
        System.out.println(env);
    }

}

这应该可以正常工作,因为SomeComponent.java位于 com.example.base 的子包中,应该由默认配置@SpringBootApplication自动扫描吗?我不明白为什么会失败。

在此先感谢,任何帮助将不胜感激

2 个答案:

答案 0 :(得分:1)

感谢您的评论,我发现自己是个问题,我使用new(作为菜鸟错误)实例化我的组件。我将以下Bean添加到我的MainApplication.class中,一切都开始流动。

@Bean
public SomeComponent someComponent() {
    return new SomeComponent();
}

当我需要它时,我只使用context.getBean(SomeComponent.class)

答案 1 :(得分:0)

Spring Boot简化了此过程。您可以使用以下代码访问属性文件中的值:

@PropertySource(ignoreResourceNotFound = true, value = "classpath:otherprops.properties")
@Controller
public class ClassA {
    @Value("${myName}")
    private String name;

    @RequestMapping(value = "/xyz")
    @ResponseBody
    public void getName(){
        System.out.println(name);
    }
}

查看this stackoverflow post以获取更多参考资料。