AbstractBeanDefinition的autowireMode自动装配模式属性
在AbstractBeanDefinition中有一个属性是autowireMode,该属性表示自动装配模式
在Spring中,注入方式有两种
- 通过set方法
- 通过构造函数(如果有多个构造函数会选择参数多的构造方法)
手动装配注入:
@Resource: 默认是通过name来查找注入值,如果不存在就报错
@Autowired 通过类型查找(类型),然后再通过name
AutowireMode(自动装配模型):在spring中有四种模式分别是:
AUTOWIRE_NO = 0:默认装配模式,目前非xml配置都是使用这种方式,需要使用手动装配注入
AUTOWIRE_BY_NAME = 1: 通过set方法,并且set方法的名称需要和bean的name一致
AUTOWIRE_BY_TYPE = 2: 通过set方法,并且再根据bean的类型,注入属性,是通过类型配置
AUTOWIRE_CONSTRUCTOR = 3: 通过构造器注入
模式 | 说明 |
---|---|
no | (默认)不采用自动装配autowire机制。Bean 引用必须由 ref 元素定义。对于较大的部署,不建议更改默认设置(也就是说,官方推荐使用autowire_no),因为明确指定协作者可以提供更好的控制和清晰度。 在某种程度上,它记录了系统的结构。 |
byName |
通过属性的名称自动装配(注入) Spring会在容器中查找名称与bean属性名称一致的bean,并自动注入到bean属性中;当然bean的属性需要有setter方法。 例如:bean A有个属性master,master的setter方法就是setMaster,A设置了autowire=“byName”,那么Spring就会在容器中查找名为master的bean通过setMaster方法注入到A中。 |
byType |
通过类型自动装配(注入) Spring会在容器中查找类(Class)与bean属性类一致的bean,并自动注入到bean属性中,如果容器中包含多个这个类型的bean,Spring将抛出异常。如果没有找到这个类型的bean,那么注入动作将不会执行。 |
constructor |
类似于byType,但是是通过构造函数的参数类型来匹配 假设bean A有构造函数A(B b, C c),那么Spring会在容器中查找类型为B和C的bean通过构造函数A(B b, C c)注入到A中。与byType一样,如果存在多个bean类型为B或者C,则会抛出异常。但时与byType不同的是,如果在容器中找不到匹配的类的bean,将抛出异常,因为Spring无法调用构造函数实例化这个bean。 |
/*** Constant that indicates no autowiring at all.* @see #setAutowireMode* 默认的装配模式: 这种方式不能进行自动注入,需使用@Resource或@Autoried注解注入*/
public static final int AUTOWIRE_NO = AutowireCapableBeanFactory.AUTOWIRE_NO;
/*** Constant that indicates autowiring bean properties by name.* @see #setAutowireMode* 这种是通过属性的名字来自动注入,不过需要提供set方法,如果没有提供set方法也是空* */
public static final int AUTOWIRE_BY_NAME=AutowireCapableBeanFactory.AUTOWIRE_BY_NAME;
/*** Constant that indicates autowiring bean properties by type.* @see #setAutowireMode* 通过属性类型来自动注入: 同时也是通过set方法来赋值的*/
public static final int AUTOWIRE_BY_TYPE=AutowireCapableBeanFactory.AUTOWIRE_BY_TYPE;
/*** Constant that indicates autowiring a constructor.* @see #setAutowireMode* 通过构造器自动注入*/
public static final int AUTOWIRE_CONSTRUCTOR=AutowireCapableBeanFactory.AUTOWIRE_CONSTRUCTOR;
在AbstractAutowireCapableBeanFactory#populateBean
方法中,对AutowireMode的判断
int resolvedAutowireMode = mbd.getResolvedAutowireMode();if (resolvedAutowireMode == 1 || resolvedAutowireMode == 2) {MutablePropertyValues newPvs = new MutablePropertyValues((PropertyValues)pvs);if (resolvedAutowireMode == 1) {this.autowireByName(beanName, mbd, bw, newPvs);}if (resolvedAutowireMode == 2) {this.autowireByType(beanName, mbd, bw, newPvs);}pvs = newPvs;}
代码如下:
@Component
public class ConsumerA {private ProviderA providerA;public void setProviderA(ProviderA a) {this.providerA = a;}public void providerShow() {System.out.println(providerA);}
}
@Component
public class ProviderA {}
// 配置类,组件扫描根路径
@Configuration
@ComponentScan("com.modules.test")
public class TestConfig {}
@Component
public class TestBeanFactoryProcessor implements BeanFactoryPostProcessor {private static final String BEAN_NAME = "consumerA";@Overridepublic void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory)throws BeansException {//获取ConsumerA类的Bean定义AbstractBeanDefinition beanDefinition = (AbstractBeanDefinition) beanFactory.getBeanDefinition(BEAN_NAME);//修改ConsumerA类的装配模式autowireMode,默认值为AUTOWIRE_NO,不进行自动装配beanDefinition.setAutowireMode(AbstractBeanDefinition.AUTOWIRE_BY_TYPE);}
}
public class ProcessorMain {public static void main(String[] args) {AnnotationConfigApplicationContext context =new AnnotationConfigApplicationContext(TestConfig.class);ConsumerA consumer = context.getBean(ConsumerA.class);consumer.providerShow();System.err.println(context.getBean(ProviderA.class));context.close();}
}
在上面的代码中,我们没有在ConsumerA类中的ProvierA属性加@Autowired或者@Resource注解,但是我们在TestBeanFactoryProcessor中修改了ConsumerA的装配模式,因此ConsumerA中的ProviderA还是会注入进去的。
如果使用默认的AUTOWIRE_NO装配模式,则不会自动注入进去,需要使用@Autowired或者@Resource
参考AutowireMode的一些理解
AbstractBeanDefinition的autowireMode自动装配模式属性相关推荐
- 请解释各种自动装配模式的区别?
在Spring 框架中共有5 种自动装配,让我们逐一分析. 1.no:这是Spring 框架的默认设置,在该设置下自动装配是关闭的,开发者需要自行在bean 定义中用标签明确的设置依赖关系. 2.by ...
- Spring 自动装配模式之byType
Spring 容器看作 beans,在 XML 配置文件中 beans 的 autowire 属性设置为 byType.然后,如果它的 type 恰好与配置文件中 beans 名称中的一个相匹配,它将 ...
- 请解释各种自动装配模式的区别
在Spring中共有5种自动装配模式,让我们逐一分析. (1)no:这是Spring的默认设置,在该设置下自动装配是关闭的,开发者需要自行在Bean定义中用标签明确地设置依赖关系. (2)byName ...
- Spring:自动装配模式
1.美图 2.概述 在 Spring 框架中共有 5 种自动装配,让我们逐一分析. no:这是 Spring 框架的默认设置,在该设置下自动装配是关闭的,开发者需要自行在 bean 定义中用标签明确的 ...
- Spring 自动装配模式之构造函数装配方式
这种模式与 byType 非常相似,但它应用于构造器参数.Spring 容器看作 beans,在 XML 配置文件中 beans 的 autowire 属性设置为 constructor.然后,它尝试 ...
- Spring学习笔记--自动装配Bean属性
Spring提供了四种类型的自动装配策略: byName – 把与Bean的属性具有相同名字(或者ID)的其他Bean自动装配到Bean的对应属性中. byType – 把与Bean的属性具有相同类型 ...
- 请解释自动装配模式的区别?_如何从齿条优化方面有效节约机床装配时间
齿条:螺纹连接的设计和计算是否正确? 如果我们真的想要节约装配成本和时间的话,那么我们首先就需要去选择设计正确的齿条螺钉.那么这时候就紧接着产生了第二个问题:我们应该如何评估并优化这种设计. 当我们去 ...
- Spring(三)——HelloSpring、IOC创建对象的方式、属性注入、自动装配、使用注解开发
文章目录 1. 简介 2. IOC理论推导 3. HelloSpring 4. IOC创建对象的方式 4.1 使用无参构造创建对象(默认) 4.2 使用有参构造创建对象 5. Spring配置 5.1 ...
- Spring的Bean的自动装配属性autowire
Spring自动注入 使用元素的 autowire 属性为一个 bean 定义指定自动装配模式 autowire设置值 no:没开启 byName: 根据bean的id名称,注入到对应的属性里面 by ...
最新文章
- 直播丨BMMeetup第2期:大模型计算加速技术,2场特邀和7位青年学者技术报告联袂上演...
- boost::regex模块部分正则表达式相关的测试程序
- hihocoder#1041 : 国庆出游(DFS)
- .net core编写转发服务
- CSS实现响应式布局(自动拆分几列)
- 提高你的javascript代码逼格系列之函数与数组
- 一个三流学校程序员的奋斗历程
- 2异常处理_异常是什么?什么是常用类?
- 使用Java轻松破解顶象滑动拼图验证码,成功率接近100%?
- 苹果手机如何查看已经连接过的WIFI密码?
- 如何在linux下安装一个音乐播放器
- NLP入门学习(一):搜狗新闻语料库的获取与预处理
- ubuntu 桌面卡死,鼠标能动但是点击无效。
- 计算机语言有许多种其中与硬件直接相关的是,【单选题】计算机语言有许多种,其中与硬件直接相关的是
A. 机器语言
B. 网络语言
C. 高级语言
D. 自然语言...
- ccs C语言编译器,CCS C 编译器手册2010.pdf
- cesium给广告牌加动图
- 黑苹果0x0501_黑苹果原版安装从零开始---3-clover配置篇
- 校园网络的未来发展方向
- R数据分析:结合APA格式作图大法讲讲ggplot2和ggsci,请收藏
- win10计算机未连接到网络适配器,windows10系统下网络适配器显示未连接如何解决...