@Autowired in Spring MVC @Controller不适用于私有领域

时间:2012-10-24 17:25:13

标签: spring spring-mvc

我在一个非常纤薄的应用程序中有一个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是很重要的?我认为私人领域的注射是由建筑师和制定者直接跟随的,我开始认为我错了......

1 个答案:

答案 0 :(得分:4)

似乎你的依赖项实际上是注入的,你只是在错误的时刻(太早)放置一个断点,并且依赖关系不会被注入尚未,尽管已经创建了类。

请记住,除非您使用构造函数注入,否则可以使用注入依赖项的第一个位置是@PostConstruct方法:

@Controller
public class EntranceUnitController {

    @Autowired
    private HttpClientFactory httpClientFactory;

    @PostConstruct
    public void init() {
        httpClientFactory  //should not be null
    }