我在一个非常纤薄的应用程序中有一个Spring MVC Controller,我们使用了很多注释和尽可能少的配置。 Controller正在运行,它还注入了许多资源值。但是我对这个控制器经历了一个非常奇怪的行为;将不会注入引用其他组件的带注释的私有字段。 这不起作用。
@Controller
public class EntranceUnitController {
@Value("${remote.baseUrl}")
private String baseUrl = "http://localhost";
@Value("${remote.port}")
private String pushPort = "8080";
@Autowired
private HttpClientFactory httpClientFactory;
...
当设置私有字段时,httpClientFactory
似乎还没有出现,如果我设置了一个断点来检查值,那么在创建控制器时当然会设置null
。
但是,如果我为组件创建一个setter并注释set-method而不是private字段,则控制器按预期工作。
@Controller
public class EntranceUnitController {
@Value("${remote.baseUrl}")
private String baseUrl = "http://localhost";
@Value("${remote.port}")
private String pushPort = "8080";
private HttpClientFactory httpClientFactory;
@Autowired
public void setHttpClientFactory(HttpClientFactory httpClientFactory) {
this.httpClientFactory = httpClientFactory;
}
...
对我来说,这真的很烦人。注入值的自动接线注入是否与注入点无关?即为什么对象注入了setter是很重要的?我认为私人领域的注射是由建筑师和制定者直接跟随的,我开始认为我错了......
答案 0 :(得分:4)
似乎你的依赖项实际上是注入的,你只是在错误的时刻(太早)放置一个断点,并且依赖关系不会被注入尚未,尽管已经创建了类。
请记住,除非您使用构造函数注入,否则可以使用注入依赖项的第一个位置是@PostConstruct
方法:
@Controller
public class EntranceUnitController {
@Autowired
private HttpClientFactory httpClientFactory;
@PostConstruct
public void init() {
httpClientFactory //should not be null
}