Spring Bean:在构造函数之前初始化autowired属性吗?

时间:2014-10-07 07:13:38

标签: spring

@Component
public class BeanA {
...
}


@Component
public class BeanB {

    @Autowired
    BeanA beanA;

    public BeanB() {
        // Use beanA
        beanA.method();
    }
}

我们可以假设在调用BeanB构造函数之前创建并初始化BeanA吗? (我知道我们可以将BeanA作为构造函数arg传递给BeanB,这更多是了解spring / java初始化序列的好奇心问题)

4 个答案:

答案 0 :(得分:3)

查看http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#beans-autowired-annotation-qualifiers

设置bean的属性会在之后发生,它是通过构造函数或工厂方法构造的。默认情况下,bean的名称为autowired,值使用setter方法设置。因此,在您的情况下,该字段将在构造函数之后设置。

这是因为

@Autowired
BeanA beanA;

实际上意味着您要自动装配该类实例的字段。在你的情况下beanA并不是一个构造函数arg。 (嗯,这是一个简单的问题,编译后是否保留了构造函数参数名称?是否有与此相关的调试标志?)

正如spring documentation中的示例所示,您可以将@Autowired应用于构造函数和字段:

public class MovieRecommender {

    @Autowired
    private MovieCatalog movieCatalog;

    private CustomerPreferenceDao customerPreferenceDao;

    @Autowired
    public MovieRecommender(CustomerPreferenceDao customerPreferenceDao) {
        this.customerPreferenceDao = customerPreferenceDao;
    }

    // ...

}

如果您需要更多帮助,请与我们联系。

哦,只是一个小问题。您似乎在构造函数中的beanA上调用method()。如果可以覆盖该方法,那不是一个好主意。我知道这只是你在这里记下的一个例子,但只是提醒一下。

答案 1 :(得分:1)

不,春天非常聪明,但不是那么神奇......在内部,春天:

  • 创建一个实例
  • 设置实例属性
  • 最终将bean存储在相关范围内(针对原型bean)和/或将其提供给调用者

但是创建使用了一个构造函数,当时它被称为属性尚未设置。

答案 2 :(得分:0)

不,自动装配由BeanPostProcessor处理,该BeanPostProcessor将在新创建的bean的构造函数之后运行。如果由于某种原因,您需要自动装配某些字段然后运行一些初始化,则可以使用@PostConstruct注释方法。在注入所有依赖项之后将调用它。在大多数情况下@Autowiring一个构造函数(也许,使对象不可变)仍然是最好的选择。

答案 3 :(得分:0)

简而言之,您可以在标有@PostConstruct的方法中访问@Autowired。