什么是自动注入和手动注入
注入方式
- 构造方法
- set方法 注入模型
- AUTOWIRE_NO(默认手动注入)
- AUTOWIRE_BY_NAME(自动注入通过名字)
- AUTOWIRE_BY_TYPE(自动注入通过类型)
- AUTOWIRE_CONSTRUCTOR(自动注入通过构造方法)
默认情况下,Spring使用的注入模型是NO,即手动注入,其他模式都是自动注入,因此当我们在类中仅仅添加一个构造方法或者set方法是不会自动注入的,我们必须明确告诉spring我们要注入的是哪个bean以及属性值,如下代码使用的就是xml形式的用法
手动属性注入
代码语言:javascript复制<bean id="" class="">
<constructor-arg name="参数类型" value="参数值"/>
<property name="bean对象中字段属性名" value="属性值"/>
</bean>
手动bean注入
代码语言:javascript复制<bean id="" class="">
<constructor-arg ref="需要注入的bean的名称"/>
<property name="bean对象中字段属性名" ref="需要注入的bean的名称"/>
</bean>
自动注入
代码语言:javascript复制<bean id="" class="" autowire="byType|byName|constructor|default"/>
在以前基本都是根据xml配置,完成注入的,但是自从有了注解,基本上不再使用xml这种形式,(反正我已经好久没有写过了,基本上都已经忘记),现在一般常用就两个注解@Autowired和@Resource
面试常问@Autowired和@Resource两者的区别
首先我们要再明确一个概念,注入模型和查找bean的方式不能混为一谈,注入模型做给bean的一个特征会影响bean的一些行为,而查找bean的方式是一种找到某个bean的策略,说白了就是一段代码,spring当中很多地方会 以某种方式查找一个bean,比如在完成属性输入的时候会根据类型去查找这个需要注入的属性,但这并不是AUTOWIRE_BY_TYPE(注入模型)
@Autowired不会改变bean的注入模型(默认情况下bean的注入模型还是AUTOWIRE_NO),@Autowired算是 一种半自动注入,因为他只需要程序员告诉spring需要注入的属性或者方法,而不需要程序员告诉 spring需要注入的属性或者方法他的值到底是哪个bean,@Autowired会根据自己的规则去查找这个bean,所以只能算作半自动注入.
@Autowired和@Resource能完成一样的功能;只不过前者是首先根据类型查找bean,如果没有找到报错(默认情况下@Autowired是一定需要注入一个bean的),如果查找到一个则用找到的 这一个完成注入,如果查找到多个,先把这个多个放到map当中,继而根据属性的名字冲map当中去确定一个唯一,能确定则使用确定的这个,如果map当中通过名字还是无法确定则报错.
@Resource在没有配置name的情况下首先根据名字查找,如果名字能查找到则返回这个查找到的(spring容器的原则是name唯一,所以不存在通过名字能查找到多个的情况),如果通过名字查找不到(需要注意的是这里的前提是没有配置name的情况,spring觉得名字无所谓),因为对名字无要求,所以会再根据类型查找,那么走的就是@Autowired这一套,如果配置了名字,spring 觉得对名字有严格要求,所以只能根据你配置的名字查找,如果查找不到则报错,找到了则用,不会走@Autowired这一套了