在AbstractBeanDefinition中有一个属性是autowireMode,该属性表示自动装配模式

在Spring中,注入方式有两种

  1. 通过set方法
  2. 通过构造函数(如果有多个构造函数会选择参数多的构造方法)

手动装配注入:

  • @Resource: 默认是通过name来查找注入值,如果不存在就报错

  • @Autowired 通过类型查找(类型),然后再通过name

AutowireMode(自动装配模型):在spring中有四种模式分别是:

  1. AUTOWIRE_NO = 0:默认装配模式,目前非xml配置都是使用这种方式,需要使用手动装配注入

  2. AUTOWIRE_BY_NAME = 1: 通过set方法,并且set方法的名称需要和bean的name一致

  3. AUTOWIRE_BY_TYPE = 2: 通过set方法,并且再根据bean的类型,注入属性,是通过类型配置

  4. 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自动装配模式属性相关推荐

  1. 请解释各种自动装配模式的区别?

    在Spring 框架中共有5 种自动装配,让我们逐一分析. 1.no:这是Spring 框架的默认设置,在该设置下自动装配是关闭的,开发者需要自行在bean 定义中用标签明确的设置依赖关系. 2.by ...

  2. Spring 自动装配模式之byType

    Spring 容器看作 beans,在 XML 配置文件中 beans 的 autowire 属性设置为 byType.然后,如果它的 type 恰好与配置文件中 beans 名称中的一个相匹配,它将 ...

  3. 请解释各种自动装配模式的区别

    在Spring中共有5种自动装配模式,让我们逐一分析. (1)no:这是Spring的默认设置,在该设置下自动装配是关闭的,开发者需要自行在Bean定义中用标签明确地设置依赖关系. (2)byName ...

  4. Spring:自动装配模式

    1.美图 2.概述 在 Spring 框架中共有 5 种自动装配,让我们逐一分析. no:这是 Spring 框架的默认设置,在该设置下自动装配是关闭的,开发者需要自行在 bean 定义中用标签明确的 ...

  5. Spring 自动装配模式之构造函数装配方式

    这种模式与 byType 非常相似,但它应用于构造器参数.Spring 容器看作 beans,在 XML 配置文件中 beans 的 autowire 属性设置为 constructor.然后,它尝试 ...

  6. Spring学习笔记--自动装配Bean属性

    Spring提供了四种类型的自动装配策略: byName – 把与Bean的属性具有相同名字(或者ID)的其他Bean自动装配到Bean的对应属性中. byType – 把与Bean的属性具有相同类型 ...

  7. 请解释自动装配模式的区别?_如何从齿条优化方面有效节约机床装配时间

    齿条:螺纹连接的设计和计算是否正确? 如果我们真的想要节约装配成本和时间的话,那么我们首先就需要去选择设计正确的齿条螺钉.那么这时候就紧接着产生了第二个问题:我们应该如何评估并优化这种设计. 当我们去 ...

  8. Spring(三)——HelloSpring、IOC创建对象的方式、属性注入、自动装配、使用注解开发

    文章目录 1. 简介 2. IOC理论推导 3. HelloSpring 4. IOC创建对象的方式 4.1 使用无参构造创建对象(默认) 4.2 使用有参构造创建对象 5. Spring配置 5.1 ...

  9. Spring的Bean的自动装配属性autowire

    Spring自动注入 使用元素的 autowire 属性为一个 bean 定义指定自动装配模式 autowire设置值 no:没开启 byName: 根据bean的id名称,注入到对应的属性里面 by ...

最新文章

  1. 直播丨BMMeetup第2期:大模型计算加速技术,2场特邀和7位青年学者技术报告联袂上演...
  2. boost::regex模块部分正则表达式相关的测试程序
  3. hihocoder#1041 : 国庆出游(DFS)
  4. .net core编写转发服务
  5. CSS实现响应式布局(自动拆分几列)
  6. 提高你的javascript代码逼格系列之函数与数组
  7. 一个三流学校程序员的奋斗历程
  8. 2异常处理_异常是什么?什么是常用类?
  9. 使用Java轻松破解顶象滑动拼图验证码,成功率接近100%?
  10. 苹果手机如何查看已经连接过的WIFI密码?
  11. 如何在linux下安装一个音乐播放器
  12. NLP入门学习(一):搜狗新闻语料库的获取与预处理
  13. ubuntu 桌面卡死,鼠标能动但是点击无效。
  14. 计算机语言有许多种其中与硬件直接相关的是,【单选题】计算机语言有许多种,其中与硬件直接相关的是 A. 机器语言 B. 网络语言 C. 高级语言 D. 自然语言...
  15. ccs C语言编译器,CCS C 编译器手册2010.pdf
  16. cesium给广告牌加动图
  17. 黑苹果0x0501_黑苹果原版安装从零开始---3-clover配置篇
  18. 校园网络的未来发展方向
  19. R数据分析:结合APA格式作图大法讲讲ggplot2和ggsci,请收藏
  20. win10计算机未连接到网络适配器,windows10系统下网络适配器显示未连接如何解决...

热门文章

  1. 扩频时钟SSC技术,即展频
  2. 随身wifi改造打印盒子,支持安卓/IOS/Windows
  3. VCL界面控件DevExpress VCL发布v20.2.6
  4. 帆软报表导出excel为0字节问题
  5. 区块链开发之Solidity智能合约开发
  6. 单数复数php单元格背景颜色,获取PhpExcel中的单元格背景颜色
  7. @GetMapping
  8. 全新部署蓝鲸社区版6.0(1)
  9. 非法破解?击键声也会出卖你?嘘,小心隔墙有耳……
  10. PCM音频数据封装为WAV文件