@Component
public class BeanA {
...
}
@Component
public class BeanB {
@Autowired
BeanA beanA;
public BeanB() {
// Use beanA
beanA.method();
}
}
我们可以假设在调用BeanB构造函数之前创建并初始化BeanA吗? (我知道我们可以将BeanA作为构造函数arg传递给BeanB,这更多是了解spring / java初始化序列的好奇心问题)
答案 0 :(得分:3)
设置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)
不,春天非常聪明,但不是那么神奇......在内部,春天:
但是创建使用了一个构造函数,当时它被称为属性尚未设置。
答案 2 :(得分:0)
不,自动装配由BeanPostProcessor处理,该BeanPostProcessor将在新创建的bean的构造函数之后运行。如果由于某种原因,您需要自动装配某些字段然后运行一些初始化,则可以使用@PostConstruct注释方法。在注入所有依赖项之后将调用它。在大多数情况下@Autowiring一个构造函数(也许,使对象不可变)仍然是最好的选择。
答案 3 :(得分:0)
简而言之,您可以在标有@PostConstruct的方法中访问@Autowired。