@Autowired在Spring组件中无法正常运行

时间:2018-09-03 11:41:05

标签: spring spring-mvc spring-boot configuration autowired

我有一个非常简单的配置和一个很大的困惑,需要我解决。

我有一个用@RestController注释的BaseController。在此类中,我有一个返回String并用@GetMapping注释的方法。我正在从中读取属性文件并显示应用程序值。直到这里,所有作品都很好。以下是我的文件,

@RestController
public class BaseController {

    @Autowired
    Environment env;

    @GetMapping("/hello")
    public String hello() {
        String myAppName = env.getProperty("spring.application.name");
        return "From Controller -> " + myAppName;
    }
}

我的application.properties文件

server.servlet.context-path=/BootEnv
server.port=8085
spring.application.name=EnvironmentAPITester

当我点击时,

  

http://localhost:8085/BootEnv/hello

,我得到如下正确答复,

From Controller -> EnvironmentAPITester

在代码中,环境变量为 org.springframework.core.env.Environment

直到这里一切都很好。

现在,我创建了一个名为@Configuration的新ApplicationConfig类。我也想从该类读取属性文件并返回值。所以下面是我所做的更改,

@RestController
public class BaseController {

    @Autowired
    Environment env;

    @GetMapping("/hello")
    public String hello() {
        String myAppName = env.getProperty("spring.application.name");
        return "From Controller -> " + myAppName;
    }

    @GetMapping("/helloConf")
    public String getDetails() {
        ApplicationConfig conf = new ApplicationConfig();
        String fromConfig = conf.details();
        return "From Config -> "+fromConfig;
    }
}

以及下面的课程

@Configuration
public class ApplicationConfig{

    @Autowired
    Environment env;

    public String details() {
        return env.getProperty("spring.application.name");
    }
}

现在当我按下时,

  

http://localhost:8085/BootEnv/helloConf

我得到一个空指针异常,因为Environment变量为空并且没有自动配置。怎么样?为什么?

谷歌搜索后,我想到了一个解决方案,要求我实现EnvironmentAware接口并以这种方式设置Environment变量。因此,下面是我必须对ApplicationConfig类进行的更改,

@Configuration
public class ApplicationConfig implements EnvironmentAware{

    @Autowired
    Environment env;

    public String details() {
        return env.getProperty("spring.application.name");
    }

    @Override
    public void setEnvironment(Environment environment) {
        this.env = environment;     
    }
}

在完成此操作之后,对于相同的Environment变量值,它仍然给了我空指针异常。然后,我发现不仅必须删除@Autowire批注,而且我还需要使该变量static起作用。所以当我这样做时,

//@Autowired
static Environment env;

它完美地工作。当我点击时,

  

http://localhost:8085/BootEnv/helloConf

我得到适当的答复,

From Config -> EnvironmentAPITester

困惑是为什么我需要将其设置为static才能填充值?为什么EnvironmentAware实现在Environment不变的情况下仍无法设置@Autowired变量?

为什么首先在类@Autowired被标记为Environment的情况下,ApplicationConfig没有填充@Configuration变量?即使我将此类注释更改为@Service@Repository@Component,同样的问题仍然存在,未能@Autowire Environment变量失败。怎么会来?

我知道这是一篇很长的文章。但是,对此的任何澄清都值得赞赏,因为我很难理解这一点。

谢谢您的帮助。

0 个答案:

没有答案