关于spring的自动注入

时间:2022-05-31 09:05:55

关于spring的自动注入

spring里面可以设置BeanDefinition自动注入类型,默认为AUTOWIRE_NO(不进行自动注入)。mybatis里面的扫描接口生成MapperFactoryBean的时候设置了

 definition.setAutowireMode(AbstractBeanDefinition.AUTOWIRE_BY_TYPE);

他这里是为了按类型自动注入SqlSessionFactory或者SqlSessionTemplate。

spring构造bean的时候会进行填充属性,调用了如下方法:

	protected void populateBean(String beanName, RootBeanDefinition mbd, BeanWrapper bw);

内部有一段逻辑:

if (mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_BY_NAME ||
mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_BY_TYPE) {
MutablePropertyValues newPvs = new MutablePropertyValues(pvs); // Add property values based on autowire by name if applicable.
if (mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_BY_NAME) {
autowireByName(beanName, mbd, bw, newPvs);
} // Add property values based on autowire by type if applicable.
if (mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_BY_TYPE) {
autowireByType(beanName, mbd, bw, newPvs);
} pvs = newPvs;
}

前面MapperFactoryBean的BeanDefinition已经设置成AUTOWIRE_BY_TYPE,所以会调用autowireByType方法,该方法内部逻辑为获取当前bean的所有PropertyDescriptor,并且过滤出包含有WriteMethod的PropertyNames。

获取一个bean的PropertyDescriptor示例代码如下:

public class IntrospectorTest {

    /**
* PropertyDescriptor依赖字段的set和get方法
* 没有对应的set和get方法则没有对应的read和write方法
*
* 依赖于set和get方法,跟具体的字段名没关系
*
* @throws IntrospectionException
*/
@Test
public void testPropertyDescriptors() throws IntrospectionException {
BeanInfo beanInfo = Introspector.getBeanInfo(IntrospectorTest.class);
PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
for (PropertyDescriptor pd : pds) {
if (pd.getName().equals("class")) {
continue;
}
System.out.println(pd.getName());
System.out.println(pd.getReadMethod());
System.out.println(pd.getWriteMethod());
System.out.println("********");
}
} public void setName(String name){} }

然后从获取的PropertyNames迭代,获取相应WriteMethod的入参类型,并从spring容器获取相应类型的Bean,如果获取到设置到MutablePropertyValues里。

最后调用方法:

applyPropertyValues(beanName, mbd, bw, pvs);

迭代MutablePropertyValues的PropertyValue,内部最终调用构造Bean的setXxx方法进行注入。

总结:spring的PropertyValues注入都是通过setXxx方法设置,比如xml配置的property或者BeanDefinition的getPropertyValues().add(key,value)方法。

关于spring的自动注入的更多相关文章

  1. spring bean自动注入

    使用 @Repository.@Service.@Controller 和 @Component 将类标识为 Bean Spring 自 2.0 版本开始,陆续引入了一些注解用于简化 Spring 的 ...

  2. SSM-Spring-06:Spring的自动注入autowire的byName和byType

    ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- di的注入上次讲了一些,这次主要阐述域属性的自动注入 先讲byType方式 看名字就知道是根据类型进行自动注入 ...

  3. Spring 完成自动注入(autowire)

    目录 两个测试类 普通方式手动注入 普通方式注入的缺点 自动注入的介绍 配置自动注入的方式 配置全局自动注入 局部单独配置 利用注解实现自动注入 两个测试类 package cn.ganlixin.p ...

  4. 关于spring boot自动注入出现Consider defining a bean of type 'xxx' in your configuration问题解决方案

    搭建完spring boot的demo后自然要实现自动注入来体现spring ioc的便利了,但是我在实施过程中出现了这么一个问题,见下面,这里找到解决办法记录下来,供遇到同样的问题的同僚参考 Des ...

  5. spring学习 十五 spring的自动注入

    一  :在 Spring 配置文件中对象名和 ref=”id” ,id 名相同使用自动注入,可以不配置<property/>,对应的注解@Autowired的作用 二: 两种配置办法 (1 ...

  6. Spring -08 -自动注入 -byName&sol;byType&sol;constructor -全局使用default-autowire&equals;” byName&quot&semi;

    1.在Spring 配置文件中对象名和ref=”id”id 名相同使用自动注入,可以不配置<property/>2.两种配置办法 2.1在<bean>中通过 autowire= ...

  7. spring拦截器中使用spring的自动注入

    需要在spring的拦截器中使用自定义的服务,这要就设计到将服务注入到拦截器中.网上看的情况有两种: 1. @Configuration public class OptPermissionHandl ...

  8. 旷世奇坑!!!spring 不能自动注入

    一入此坑,只想跳楼.我发誓应该不会有第二个人会进这种坑! 问题描述: 总是不能注入dao层,即@Resposity.always!always!always!(尝试了天下之因特网所有的注入方式,都不能 ...

  9. spring AutowireCapableBeanFactory 自动注入

    文档:http://docs.spring.io/spring/docs/3.0.x/javadoc-api/org/springframework/beans/factory/config/Auto ...

随机推荐

  1. 《DSP using MATLAB》示例Example5&period;18

  2. java中final 、finally、finalize的区别

    比较java中常用关键字以免混淆 final :用来修饰变量,表示变量为最终变量,不能被改变 finally:在处理异常的时候使用,表示最终要执行的代码块 finalize:java Object类中 ...

  3. http&colon;&sol;&sol;crunchify&period;com&sol;simplest-spring-mvc-hello-world-example-tutorial-spring-model-view-controller-tips&sol; 非常棒的spring入门,maven,以及eclipse

    http://crunchify.com/simplest-spring-mvc-hello-world-example-tutorial-spring-model-view-controller-t ...

  4. 【leetcode❤python】119&period; Pascal&&num;39&semi;s Triangle II

    #-*- coding: UTF-8 -*-#杨辉三角返回给定行#方法:自上而下考虑问题,从给定的一行计算出下一行,则给定行数之后,计算的最后一行就是求解的最后一行class Solution(obj ...

  5. ubuntu 系统出错一览

    1.系统升级出错:打开终端输入:sudo apt-get install -f

  6. VM虚拟机快照还原效果实现方式

    ===================================================默认"快照删除"行为:============================ ...

  7. POJ3974 Palindrome &lpar;manacher算法&rpar;

    题目大意就是说在给定的字符串里找出一个长度最大的回文子串. 才开始接触到manacher,不过这个算法的确很强大,这里转载了一篇有关manacher算法的讲解,可以去看看:地址 神器: #includ ...

  8. 初识 Asp&period;Net内置对象之Session对象

    Session对象 Session对象用于存储在多个页面调用之间特定用户的信息.Session对象只针对单一网站使用者,不同的客户端无法相互访问.Session对象中止联机机器离现时,,也就是当网站使 ...

  9. 在MySql中实现MemberShip的权限管理

    步骤: 1.在MySql种创建一个数据库,名称任意取,我们只是要得到一个空的数据库,我们假设这个数据库的名称为authentication. 2.在VS种创建一个Web应用程序,File——new—— ...

  10. Oracle11g温习-第十章:存储架构

    2013年4月27日 星期六 10:38 1.oracle 存储架构: 1)  database  ------------tablespace-------------segment(对象) --- ...