使用 Spring,我有一个类“BaseController”,其中使用 Autowiring 注入(inject)了 BaseService。即使类未初始化, Autowiring 如何工作。检查下面的代码
@Controller
class BaseController{
@Autowired
private BaseService baseService;
//......
}
并且 xml 中的 bean 定义为
<context:annotation-config />
<bean name="baseService" class="com.test.service.BaseService" />
我没有使用 Setter/Constructor 初始化 baseService。 当我调用如下所示的方法时,它是如何工作的
baseService.methodOne();
最佳答案
Spring 框架 依赖于 Spring IoC ( Inversion of Control ) Container 来创建所有组件并通过注入(inject)依赖项来初始化它们。使用 reflection API 通过构造函数、setter 和/或字段注入(inject)依赖项.
在这里,您使用注释 Autowired
注释了字段 baseService
,这将指示 Spring IoC 容器 注入(inject) 类型的 bean BaseService
,如果容器需要创建您的Controller
时,依赖项尚未创建和初始化,它将自动执行此操作,如果此 bean 有依赖项,它将应用相同的依赖项依赖关系上的逻辑,直到完全创建并初始化依赖关系树。简而言之,这就是它的工作原理。
If we have two controller classes A & B, with dependency on BaseService. Does Spring container create two objects and injects into A and B separately or Only one instance of BaseService is shared among all the classes that has dependency.
这取决于您在 bean 声明中设置的范围,如果范围是单例,则容器将仅创建您的 bean 的一个实例,然后将同一实例注入(inject)您的 Controller 中。例如,如果您选择原型(prototype),它将为每个 Controller 创建一个新的 bean 实例。在您知道 singleton 是默认范围的情况下,它将注入(inject)相同的实例。有关Spring IoC容器中支持的范围的更多详细信息,您可以阅读this .
关于java - @Autowired 如何工作,如果 @Autowired 设置在仅使用 setter/constructor 声明但未初始化的属性(类)上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39001686/