spring注入你真搞懂了吗?不会一直都是这样错误理解吧?

说起spring的注入,可能大家都有了解 。可你认知几种注入方式呢?你所认知的注入方式是否正确呢?我估计大多数人了解注入方式不全面,并且还会曲解一些概念 。今天我们就参考最权威的官网来具体谈谈spring的注入方式 。
这里想给大家复习一下Spring的基础知识,对于后续理解有很大帮助
IOC&&DI想必关于这两个概念大家不会陌生,面试题经常会出现的 。这里我们就从官网详细文档看一看 。
spring注入你真搞懂了吗?不会一直都是这样错误理解吧?

文章插图
 
详细的翻译具体概念我就不讲了,在这我只说出自己的理解
【spring注入你真搞懂了吗?不会一直都是这样错误理解吧?】其实IOC也被称为DI,因为在spring中IOC作用就是不需要程序员来手动创建和管理JAVA类,而是由spring容器自动实例化Bean对象 。怎么个IOC呢,其实就是通过DI(依赖注入)实现的 。
补充一点关于spring的bean对象(后面简称bean)
其实bean对象就是java对象,不同的在于Bean对象是由spring创建管理对象 。
bean对象 是 java对象,但java对象 不一定是 bean对象

spring注入你真搞懂了吗?不会一直都是这样错误理解吧?

文章插图
 
我们的业务类,经过spring容器DI添加源数据从而生成一个Bean对象可以被使用 。这也就是spring IOC容器的运行流程图 。
Configuration Metadata(IOC)关于配置元数据,spring官方文档给出了三种配置方式
  1. XML-based metadata 1.0版本
  2. Annotation-based configuration 2.5版本
  3. Java-based configuration 3.0版本
虽说三种,但其实我接触也只有前两种 。本文也是关于前两种详细介绍 。
基于 XML 的 bean 注入方式
xml手动配置bean (自动装配可以通过set方法自动创建pojo类对象加上元数据信息构造成bean对象)
基于 XML 的 bean 注入方式的实现有三种方法:
  1. xml配置ref
  2. 属性 setter方法注入(或设值注入)
  3. 构造方法注入
在基于 XML 的 bean 装配中,我们需要了解一下自动注入模型
spring注入你真搞懂了吗?不会一直都是这样错误理解吧?

文章插图
 
关于自动模型官网上解释说:当使用基于xml的注入方式时,可以指定自动连接模式
也就是说spring 的自动注入的模型 (仅仅针对xml-based配置)
使用java,annotation另外两种注入方式没有注入模型
Autowiring Collaborators(自动注入的模型)
spring注入你真搞懂了吗?不会一直都是这样错误理解吧?

文章插图
 
  1. no :(默认)没有自动装配 。Bean引用必须由ref元素定义 。
  2. byname:通过名称查找bean自动装配属性 。
  3. bytype:通过类型找bean,根据set或者构造方法注入
  4. construct 推断构造方法 通过构造方法自动配置,如果多个构造方法选择多个参数的构造方法
Annotation-based configuration(注解注入)
@Autowired和@Resource两个注解实现 。面试题中也经常会问到两个注解的区别,我搜索网上的答案却讲的是@Autowired是通过bytype,@Resource是通过byname 。但这种理解显然是错误的,因为关于自动模型文章前面也已经说过 官网:当使用基于xml的注入方式时,可以指定自动连接模式
@Autowired和@Resource只不过是通过type,name去查找,而不是bytype以及byname模式 。有什么区别?
区别在于byname通过名字找bean自动填充–>没找到就会报错
bytype通过类型去找bean自动填充–>没找到就会报错
1. @Autowired:type --> name --> error
不仅仅通过type找 。type找不到,还可以通过name找 。都找不到才会报错
spring包中的AutowiredAnnotationBeanPostProcessor.java中的一个方法实现解析的
2. @Resource:name --> type --> error
不仅仅通过name找 。name找不到,还可以通过type找 。都找不到才会报错
javax中的 commonAnnotationBeanPostProcessor.java中的一个方法实现解析的
这里再强调一下:
注解 无关注入的模型(no,byname,bytype,constract)
怎么说?还相信网上的知识点吗?不相信我说的?那可以我们还是来用code证明 。
Talk is cheap,show you my code准备阶段
spring注入你真搞懂了吗?不会一直都是这样错误理解吧?

文章插图
 


推荐阅读