spring的注入,可以分为两种,分别是手动注入和自动注入
我们这里要记录的是自动注入

自动注入模型

spring的自动注入模型有四种,分别是:

  • autowire_no(0): 默认的装配模式,如果注入indexBean,没有在属性上加@Autowired或者@Resource,这时候,indexBean是无法注入的
  • autowire_name(1): 通过set方法,并且set方法的名称必须和bean的name名称一致, byName
  • autowire_type(2): 通过set方法,这种方式set方法可以任意命名,因为是按照set方法的参数类型来注入bean的, byType
  • autowire_constructor(3): 通过构造器注入,如果userBean中注入了indexBean,那么必须提供一个带indexBean的构造函数,否则是null

spring默认的自动注入模型,是0,需要通过@Autowired或者@Resource注解注入;如果是非0的,可以不提供这两个注解;

应用

autowire_name

如果我们指定的自动注入模型是autowire_byname的话,那只需要提供set方法即可,并且set方法的方法名必须是注入属性的值,否则会无法注入

@Component
public class IndexBean {}@Component
public class UserBean {private IndexBean indexBean;public void setIndexBean123(IndexBean indexBean) {System.out.println("通过set方法注入属性");this.indexBean = indexBean;}public void setIndexBean(IndexBean indexBean){System.out.println("空参setIndex方法执行");this.indexBean = indexBean;}public void test() {System.out.println("注入的indexBean属性是:" + indexBean);}
}   @Component
public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {@Overridepublic void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory)throws BeansException {GenericBeanDefinition userBean = (GenericBeanDefinition) configurableListableBeanFactory.getBeanDefinition("userBean");System.out.println("默认的autowireMode是:" + userBean.getAutowireMode());userBean.setAutowireMode(1);}
}

这里的MyBeanFactoryPostProcessor是我自定义的一个beanFactoryPostProcessor实现类,在这里尝试修改beanDefinition的自动注入模型,这个和spring初始化的机制有关系,在前面有详细说过spring将bean转换为beanDefinition的执行顺序

我这里将自动注入模型设置为1,也即autowire_byname;那这样的话,在bean中注入属性的时候,就无需提供@Autowired、@Resource等这些注解

上面的代码在执行的时候,执行的是UserBean中的setIndexBean()方法,

public class AutowireModeTest {public static void main(String[] args) {AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AutowiredModelConfig.class);UserBean userBean = ac.getBean(UserBean.class);userBean.test();}
}
执行结果:
空参setIndex方法执行
注入的indexBean属性是:com.spring.study.autowiremode.IndexBean@1622f1b

autowire_type

如果我们指定的自动注入模型是autowire_tyoe的话,那也是只需要提供set方法即可,方法名可以随意,但是要以set开头,set方法的参数必须是要注入的类型

我只将上面的

userBean.setAutowireMode(1);改为userBean.setAutowireMode(2);

这时候,userBean的自动注入模型就是byType,那再次执行的时候,是会依次调用两个set方法,因为我提供的两个set方法,虽然名字不一样,但是入参都是indexBean,所以,这也说明了,只需要确保set方法的参数是indexBean类型即可,方法名以set开头,具体是setA,还是setB,还是setC都无所谓

执行结果

空参setIndex方法执行
通过set方法注入属性
注入的indexBean属性是:com.spring.study.autowiremode.IndexBean@e056f20

autowire_constructor

将自动注入模型改为3,然后在UserBean中分别提高无参构造函数和带参构造函数

@Component
public class UserBean {private IndexBean indexBean;public UserBean(IndexBean indexBean) {System.out.println("userBean带参构造函数");this.indexBean = indexBean;}public UserBean(){System.out.println("userBean空参构造函数");}public void setIndexBean123(IndexBean indexBean) {System.out.println("通过set方法注入属性");this.indexBean = indexBean;}public void setIndexBean(IndexBean indexBean){System.out.println("空参setIndex方法执行");this.indexBean = indexBean;}public void test() {System.out.println("注入的indexBean属性是:" + indexBean);}
}

此时的执行结果是:

userBean带参构造函数
注入的indexBean属性是:com.spring.study.autowiremode.IndexBean@78b66d36

结论

以上代码,可以充分证明,如果将自动注入模型设置为1、2、3其中任意一个值,就无须再提供@Autowired或者@Resource注解,我们之前所理解的@Autowired是先根据类型查找,再根据name查找,这个说法,只是针对autowireMode是0的这种场景

spring自动注入模型相关推荐

  1. 基于spring自动注入及AOP的表单二次提交验证

    2019独角兽企业重金招聘Python工程师标准>>> 这几天在网上闲逛,看到了几个关于spring的token二次提交问题,受到不少启发,于是自己动手根据自己公司的项目框架结构,制 ...

  2. Spring自动注入

    谈及一个问题,无非牵扯到三点,是什么,怎么来的,怎么用的 Spring自动注入是什么 是指容器中的一个组件中需要用到另一个组件(例如聚合关系)时,依靠spring容器创建对象,而不是手动创建: Spr ...

  3. 巧用 Spring 自动注入实现策略模式升级版

    一.前言 1.1 背景 在工作过程中,有时候需要根据不同的枚举(常量)执行不同的逻辑. 比如不同的用户类型,使用不同的优惠政策:不同的配置变化,走不同的处理逻辑等. 下面模拟一个根据不同用户类型,走不 ...

  4. Spring自动注入原理

    我的博客 spring的属性注入属于spring bean的生命周期一部分,bean的生命周期首先记住两个概念: spring bean:最终存在spring容器当中的对象 对象:实例化出来的对象,但 ...

  5. 【Spring】Spring 自动注入(autowire)详解

    1.概述 转载:添加链接描述 2. 手动注入的不足 [Spring]Spring 依赖注入之手动注入 上篇文章中介绍了依赖注入中的手动注入,所谓手动注入是指在xml中采用硬编码的方式来配置注入的对象, ...

  6. Spring自动注入(引用类型)

    spring可以根据某些规则给引用类型完成赋值,只对引用类型有效.有两种方式实现自动注入,下面简单的介绍以下 1-ByName 按名称自动注入:Java类中引用类型的属性名称和spring容器中bea ...

  7. java应用中spring自动注入_Spring自动注入的几种方式

    ---恢复内容开始--- @Service("accountEmailService") public class AccountEmailServiceImpl implemen ...

  8. Spring自动注入的几种方式

    ---恢复内容开始--- @Service("accountEmailService") public class AccountEmailServiceImpl implemen ...

  9. java应用中spring自动注入_java-Spring Security会自动过滤注入吗?

    我有一个使用spring-security core v4.1.1.RELEASE的spring-boot应用程序(spring-boot v1.3.3.RELEASE). 看来,如果我通过扩展Onc ...

  10. spring自动注入--------

    <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...

最新文章

  1. MUI多端发布开发指南(终于把MUI的使用场景说清楚了)
  2. 如何解决pip更新问题
  3. 阿里云从0安装mysql到远程连接
  4. 一个程序员的爱情故事
  5. 基于TableStore的物联网元数据管理
  6. 关于Debug.exe
  7. 简述UTF-8编码原理及其文本文件的读写技术 【转】
  8. Python数据结构与算法(2.7)——跳表
  9. #ifndef #define #endif typedef typename
  10. 12864 C语言程序 带详细注解
  11. 微信小程序口令红包-语音识别
  12. 适合各种创业者借鉴的案例,老板创业2个小时卖了9万元!
  13. C# 文件搜索过程中如何提取office文件,wps,pdf,html,eml等格式的文件正文
  14. 中学生心理测试系统软件,学校心理测评软件
  15. mysql mmm搭建_搭建mysql-mmm高可用MySQL集群
  16. python量化交易:Joinquant_量化交易基础【三】:python基本语法与变量
  17. uniapp 实现销售订单页面-风格1
  18. Mysql 字符集 设置
  19. Oracle日期加减
  20. 双碳”目标下资源环境中的可计算一般均衡(CGE)模型技术应用

热门文章

  1. C/C++[codeup 1925]特殊排序
  2. 机器学习- 吴恩达Andrew Ng Week9 知识总结 Anomaly Detection
  3. Wide Deep 模型详解
  4. 对给定数组升或降排序
  5. 树中两个节点的最低公共祖先
  6. mysql与oracle存储过程_5分钟学会oracle与mysql存储过程insertinto
  7. 电脑已安装软件提取安装包_SPSS 24,软件安装包及安装教程
  8. numpy flatten
  9. 浅谈算法和数据结构: 九 平衡查找树之红黑树
  10. 大事化小、小事化了的动态规划