当前位置: 首页 > 知识库问答 >
问题:

如果在属性(类)上设置@autowmed,则@autowmed如何工作,该属性(类)仅声明,但未使用setter/构造函数[重复]初始化。

常英毅
2023-03-14

使用Spring,我有一个“BaseController”类,其中BaseService使用自动连接注入。即使类未初始化,自动连线如何工作。检查下面的代码

@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();

共有2个答案

宋高扬
2023-03-14

如果您启用了类扫描,Spring将在启动时检测所有Spring bean类型,并注入依赖项,如果它标有@autowed@Resources等注释。

根据您的示例,BaseController必须是Springbean的一种类型,也必须是BaseService。如果BaseService是一个接口,则必须有一个impl。如果有许多impl,那么您还需要一个@限定符注释。

Spring使用反射,因此不需要setter或构造函数来注入依赖项。

默认情况下,除非您通过@scope

俞新翰
2023-03-14

Spring框架依赖于Spring IoC(控制反转)容器来创建所有组件,并通过注入它们的依赖关系来初始化它们。依赖关系是通过使用反射API通过构造函数、设置器和/或字段注入的。

在这里,您使用注释自动连线对字段baseService进行注释,这将指示Spring IoC容器注入类型为baseService的bean,如果在容器需要创建控制器时,依赖项尚未创建和初始化,它将自动执行此操作,如果此bean具有依赖项,它将在依赖项上应用相同的逻辑,直到完全创建并初始化依赖项树。简而言之,这就是它的工作原理。

如果我们有两个控制器类A

这取决于您在bean声明上设置的范围,如果范围是单例的,容器将只创建bean的一个实例,然后将在控制器中注入相同的实例。例如,如果您选择了原型,它将为您的每个控制器创建一个新的bean实例。在您知道单例是默认范围的情况下,它将注入相同的实例。有关Spring IoC容器中支持的作用域的更多详细信息,可以阅读以下内容。

 类似资料:
  • 在Java中,您可以这样做: 在飞镖中,我试过:

  • 问题内容: 我在实例类型“ Person”中添加了一个实例变量,该类是引用类型(“ Date”,我为此编写了一个类)。因此,在我的Person类的构造函数中,我试图使用Date类的构造函数初始化Date属性,但是不确定如何执行此操作。以前,我只初始化过原始类型(或字符串),如下所示。这是我的代码中的一段。我不确定如何初始化“生日”,以便它使用Date类的构造函数。谢谢! 问题答案: 您是说要使用D

  • 问题内容: 在php中声明属性时,为什么无法将属性初始化为函数?以下代码片段导致 解析错误:语法错误,意外的T_FUNCTION 您还可以将属性初始化为字符串,数字或其他数据类型吗? 编辑: 但是我可以在__construct()方法中将函数分配给属性。以下工作正常: 问题答案: 因为它不是用PHP实现的。 http://www.php.net/manual/zh/language.oop5.pr

  • 我正在构建一个API并使用swagger测试endpoint。我有一个产品: 在这个DTO中,我想使用在我的代码中使用的Price类。价格类如下所示: 但是由于私有设置器在类中使用,我无法使用swagger设置这些值(它在这些上具有属性)。我真的很喜欢这种拥有私有设置器并使用构造函数设置值的方法,顺便说一句,这是公共的。有没有办法我可以使用swagger为类设置值,并且仍然在属性上使用私有设置器?

  • 问题内容: 我见过两个案例设置默认状态为: 与 使用第一个变体是不好的做法吗?我在哪里可以找到有关它的更多信息?还是该ecmascript的功能如何命名? 问题答案: 如果已配置babel,则可以使用第一个变体。它是类属性语法,不包含在ES7提议中,但可作为babel的第二阶段预设使用。然而,使用第一或第二变体是优先事项。它们都转换为完全相同的东西。 第一种方法: 第二种方法

  • 在我的Angular应用程序中,我有一个组件: 但在“make”属性中我有一个错误。我不知道该怎么处理...