Spring byName和byType两种注入方式;@Resource和@Autowired

发布时间 2023-11-02 11:33:13作者: 该用户已注销!

Spring

控制翻转IOC 可以理解为一个类, 依赖注入可以理解为一个对象

控制反转(IoC)是一个通用的概念,它可以用许多不同的方式去表达,依赖注入仅仅是控制反转的一个具体的例子。

依赖注入的2种方法

1、构造函数依赖注入

2、setter方法依赖注入

自动装配分为3种:( Spring的byType、byName的自动装配逻辑以及@Autowired和@Resource的使用示例 - 简书 (jianshu.com)

1、byName

很多人以为,byName的自动装配是跟类中的属性有关,其实不是,使用byName进行自动装配时,是利用Java的反射机制获取自动装配类中的set方法名去掉set后将其首字母小写再到IOC容器中查找是否有对应的beanId,如果有则查看该bean的类型与set方法的参数类型是否匹配,匹配上了则调用set方法进行 依赖注入。因此,byName的自动装配跟set方法名和参数类型有关,跟属性名无关。

2、byType

使用byType进行自动装配时,是利用Java的反射机制获取测试类中的set方法的参数类型,寻找此接口类型的实现类或子类,找到后将其首字母小写与IOC容器中的beanId进行匹配,匹配成功后则调用set方法进行依赖注入。因此,byType自动装配与方法名无关,与属性名无关,与set方法的参数类型有关

3、由构造函数自动装配

@Resource

默认按照byName方式注入,如果找不到则按照byType方式注入

@Resource放在属性上,如果不写对应的set方法,则程序在运行时,Java的反射机制会自动的帮我们生成一个名为set方法

@Resource放在set方法上,按照set方法的名称(去掉set后将其首字母小写)作为beanId进行注入。例如,下面的setHelloWorld123方法对应的beanId为helloWorld123

@Resource
public void setHelloWorld123(HelloWorld helloWorld) {
    this.helloWorld = helloWorld;
}

同时使用xml配置bean和注解配置bean,如果beanId相同,则IOC容器中只会有一个bean

@Autowired

默认按照byType方式注入,如果存在多个Type相同的bean,则按照byName方式注入

spring中如何xml配置文件和注解同时存在,xml配置文件的优先级高于注解