我曾经读到过,对于setter注入,依赖项直到需要时才会被注入。但是,当我对此运行一个小测试时,我发现在使用setter注入时,依赖项是在应用程序启动时注入的。实际上,在Spring bean生命周期中何时调用setter注入?“依赖关系只有在需要时才会被注入”是什么意思?
@Service
public class MainService {
private DependencyService dependencyService;
@Autowired
public void setDependencyService(DependencyService dependencyService) {
this.dependencyService = dependencyService;
}
@PostConstruct
public void afterConstruct() {
System.out.println("Created MainService bean");
if (service != null) {
System.out.println("DependencyService is injected");
}
}
}
@Service
public class DependencyService {
@PostConstruct
public void afterConstruct() {
System.out.println("created DependencyService bean");
}
}
On application startup, the console result:
Created DependencyService bean
Created MainService bean
DependencyService is injected发布于 2021-06-03 17:43:36
无论您使用字段注入、setter注入还是构造函数注入,依赖项总是在bean实例化之后或期间立即注入。
所以这取决于bean何时被初始化。缺省情况下,所有bean都将在启动时立即初始化,这意味着它们的依赖项也会在启动时注入
这通常是一种理想的行为,因为它允许您在启动时发现由于bean配置而导致的错误,而不是在几个小时甚至几天之后。
通过将bean注释为@Lazy,您可以将bean更改为延迟初始化,直到需要它们为止。因此,如果您希望MainService在被访问之前一直处于延迟初始化状态(即其setter注入不会在启动时发生),您必须:
@Service
@Lazy
public class MainService {
} https://stackoverflow.com/questions/67814702
复制相似问题