使用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();
答案 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