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

时间:2016-08-17 16:18:18

标签: java spring dependency-injection autowired

使用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 个答案:

答案 0 :(得分:2)

Spring框架依靠 Spring IoC Inversion of Control容器来创建所有组件并通过注入其依赖项来初始化它们。通过使用reflection API

,通过构造函数,setter和/或字段注入依赖项

在这里,您使用注释baseService注释了字段Autowired,该注释将指示 Spring IoC容器以注入类型BaseService的bean,如果在容器需要创建Controller的时间,尚未创建和初始化依赖关系,它将自动执行,如果此bean具有依赖关系,它将在依赖关系上应用相同的逻辑,直到依赖关系树已完全创建并初始化。这就是它的工作原理。

  

如果我们有两个控制器类A&amp; B,依赖于   BaseService。 Spring容器是否创建了两个对象并注入   A和B分开或只共享一个BaseService实例   所有具有依赖性的类。

这取决于您在bean声明中设置的范围,如果范围是 singleton ,容器将只创建一个bean实例,然后在控制器中注入相同的实例。例如,如果您选择 prototype ,它将为您的每个控制器创建一个新的bean实例。在您知道 singleton 是默认范围的情况下,它将注入相同的实例。有关Spring IoC Container中受支持的范围的更多详细信息,请阅读this

答案 1 :(得分:1)

如果您已启用类扫描,则spring会在启动时检测所有spring bean类型,并在标记为@Autowired@Resource等注释的情况下注入依赖项。

根据您的示例,BaseController必须是一种spring bean,还有BaseService。如果BaseService是一个接口,那么必须有一个impl。如果有很多impls,那么你也需要一个@Qualifier注释。

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

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

设置范围,否则所有bean都是单例