2

我在一个非常精简的 XML 应用程序中有一个 Spring MVC 控制器,我们使用了很多注释和尽可能少的配置。控制器正在工作,它还注入了许多资源值。但是我用这个控制器经历了一个非常奇怪的行为;不会注入引用其他组件的带注释的私有字段。这行不通。

@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 而不是私有字段,则控制器按预期工作。

@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注入对象很重要?我认为私有字段注入直接跟在构造和设置器之后,我开始认为在这种情况下我错了......

4

1 回答 1

4

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

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

@Controller
public class EntranceUnitController {

    @Autowired
    private HttpClientFactory httpClientFactory;

    @PostConstruct
    public void init() {
        httpClientFactory  //should not be null
    }
于 2012-10-24T20:47:52.617 回答