Spring IOC 容器根据Bean 名称或者类型进行autowiring 自动依赖注入
//根据类型对属性进行自动依赖注入
protected void autowireByType(String beanName, AbstractBeanDefinition mbd, BeanWrapper bw, MutablePropertyValues pvs) {//获取用户定义的类型转换器TypeConverter converter = getCustomTypeConverter();if (converter == null) {converter = bw;}//存放解析的要注入的属性Set<String> autowiredBeanNames = new LinkedHashSet<>(4);//对Bean对象中非简单属性(不是简单继承的对象,如8中原始类型,字符//URL等都是简单属性)进行处理String[] propertyNames = unsatisfiedNonSimpleProperties(mbd, bw);for (String propertyName : propertyNames) {try {//获取指定属性名称的属性描述器PropertyDescriptor pd = bw.getPropertyDescriptor(propertyName);// Don't try autowiring by type for type Object: never makes sense,// even if it technically is a unsatisfied, non-simple property.//不对Object类型的属性进行autowiring自动依赖注入if (Object.class != pd.getPropertyType()) {//获取属性的setter方法MethodParameter methodParam = BeanUtils.getWriteMethodParameter(pd);// Do not allow eager init for type matching in case of a prioritized post-processor.//检查指定类型是否可以被转换为目标对象的类型boolean eager = !PriorityOrdered.class.isInstance(bw.getWrappedInstance());//创建一个要被注入的依赖描述DependencyDescriptor desc = new AutowireByTypeDependencyDescriptor(methodParam, eager);//根据容器的Bean定义解析依赖关系,返回所有要被注入的Bean对象Object autowiredArgument = resolveDependency(desc, beanName, autowiredBeanNames, converter);if (autowiredArgument != null) {//为属性赋值所引用的对象pvs.add(propertyName, autowiredArgument);}for (String autowiredBeanName : autowiredBeanNames) {//指定名称属性注册依赖Bean名称,进行属性依赖注入registerDependentBean(autowiredBeanName, beanName);if (logger.isDebugEnabled()) {logger.debug("Autowiring by type from bean name '" + beanName + "' via property '" +propertyName + "' to bean named '" + autowiredBeanName + "'");}}//释放已自动注入的属性autowiredBeanNames.clear();}}catch (BeansException ex) {throw new UnsatisfiedDependencyException(mbd.getResourceDescription(), beanName, propertyName, ex);}}
}
通过上面的源码分析,我们可以看出来通过属性名进行自动依赖注入的相对比通过属性类型进行自动依赖注入要稍微简单一些, 但是真正实现属性注入的是DefaultSingletonBeanRegistry 类的registerDependentBean()方法。
Spring IOC 容器根据Bean 名称或者类型进行autowiring 自动依赖注入相关推荐
- Spring IoC容器与Bean管理
Spring IoC容器与Bean管理 一.Spring IoC容器与Bean管理 1.Spring快速入门 IoC控制反转 DI依赖注入 Spring概述 Spring IoC初体验 使用XML方式 ...
- Spring IOC容器和Bean的配置
Spring IOC容器 和Bean的配置 : IOC和DI IOC(Inversion of Control):反转控制 在应用程序中的组件需要获取资源时,传统的方式是组件主动的从容器中获取所需要的 ...
- Spring IoC容器与Bean管理18:Bean对象的作用域及生命周期三:对象生命周期;
说明: (1)本篇博客主要根据案例阐述对象的声明周期: (2)其中,比较重要的是注意下这个对应关系: (3)还有就是调用[registerShutdownHook()]销毁IoC容器: 目录 一:be ...
- [Spring实战系列](6)配置Spring IOC容器的Bean
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/SunnyYoona/article/details/50619900 1. 简介 Spring提供了 ...
- Spring IoC容器以及Bean的创建过程
1 Spring 静态结构介绍 什么是Spring,可以自己网上查询,总之,可以说是一个面向Web应用开发的,轻量级,企业级框架.它包含了如下图所示一些模块,这些模块的详细的概念和所负责的职责,可以通 ...
- Spring IOC容器【p名称空间注入属性值 】
# p 名称空间给对象的属性注入值(spring3.0以上版本才支持) 需要引入: xmlns:p="http://www.springframework.org/schema/p" ...
- Spring IOC 容器源码分析 - 获取单例 bean
1. 简介 为了写 Spring IOC 容器源码分析系列的文章,我特地写了一篇 Spring IOC 容器的导读文章.在导读一文中,我介绍了 Spring 的一些特性以及阅读 Spring 源码的一 ...
- 【小家Spring】Spring注解驱动开发---向Spring Ioc容器中注册Bean的7种方式
每篇一句 比你有钱的人一定会比你努力,而比你努力的人终有一天会比你有钱 前言 Spring是一个非常强大的反转控制(IOC)框架,以帮助分离项目组件之间的依赖关系.因此可以说Spring容器对Bean ...
- IOC容器和Bean的配置
IOC容器和Bean的配置 1 IOC和DI ①IOC(Inversion of Control):反转控制. 在应用程序中的组件需要获取资源时,传统的方式是组件主动的从容器中获取 ...
最新文章
- AI 芯片和传统芯片的区别
- oracle:ORA-01940无法删除当前已连接用户的解决方案
- 第一集 企业IT体系结构
- 网站防止SQL注入方法
- System.Data.SQLite(SQLite ADO.NET 2.0的提供程序,已经包含Sqlite引擎)
- android studio生成签名导打包的方法
- 《大数据》第2期“专题”——我国政府数据开放现状和保障机制
- file对象怎样获取文件的长度?_使用FSO对象获取整个文件夹的信息
- win 7-8-10 下 删除我的电脑下多余的设备和驱动器,腾讯视频,酷我音乐,手机
- VC中调用 Excel 的总结
- Deepin安装和设置Kodi,实现手机APP投屏和IPTV功能
- 项目周期所涉及到的文档控制说明
- 第10章 数据库运行维护与优化
- access怎么做批注_怎样做批注
- [Linux] WIN7下Virtualbox虚拟Ubuntu共享文件夹设置
- 一篇文章从0搞定计算机网络,面试小case
- CRC校验中的“模2”除法运算流程图和图示
- 局域网内ubuntu显示网络已经连接,能ping通,打不开网页
- RabbitMQ镜像队列原理分析
- compact mysql_PHP compact() 函数