java - @Autowired 如何工作,如果 @Autowired 设置在仅使用 setter/constructor 声明但未初始化的属性(类)上

标签 java spring dependency-injection autowired

使用 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/

相关文章:

java - SQL 插入 ORA-00911 : invalid character

java - 这些表达式的解析器语法

java - 用 simpleJdbcInsert 替换重复项

java - 使用 angularjs 和 json spring 方法帖子中的对象数组

javascript - 如何参数化模块,以便它可以按需配置需要它的应用程序?

c# - 统一: Will get a StackOverflowException if I try to get a singleton that is registered in multiple mappings

design-patterns - 如何向一个 5 岁的 child 解释依赖注入(inject)?

java - java中的自定义数据结构

java - JDK 11 : java. lang.NoClassDefFoundError:javax/xml/ws/handler/soap/SOAPHandler

Java Spring Rest Call使用父类(super class)获取子类