我想看看setter注入在Spring中什么时候真正发生,并为此调试了代码。似乎构造函数和setter注入都发生在执行第一行时。我想知道,将要注入依赖项的服务是否会注意到这一差异?据我所知,不会吧?如果不是,那么区别在哪里呢?
ApplicationContext context = new ClassPathXmlApplicationContext("spring-module.xml");
//Both setting and constructor dependencies are initialized at this point.
CampaignManager cm = (CampaignManager) context.getBean("campaignManager");
构造函数和setter注入之间有几个区别。
-
Setter注入不能确保在创建对象时发生注入。您不能保证某个注入已经发生,例如,可能有一个对象具有不完整的依赖关系,而构造函数注入不允许在创建对象的依赖关系之前创建对象。
-
如果两个bean之间存在循环依赖关系(例如,
A
依赖于B
,B
依赖于A
),则在使用构造函数注入时,Spring将抛出一个ObjectCurrentlyInCreationException
,而在使用setter注入时,在调用setter方法之前,Spring将创建两个bean。 -
当必须创建bean时,使用构造函数注入将创建它的所有依赖项。
-
当依赖项数量巨大时,请使用setter注入。
更多信息:
- Spring框架中Setter注入与Constructor注入的区别