spring 的自动注入怎么来的?
延申:
一、 Spring的三种注入方式
1、构造器注入
2、setter注入
3、注解(@Autowired、@Resource、@Qualifier )
二、为什么要用自动注入?
因为在bean很多或者自定义的类很多的情况下,就需要在xml文件中一直写bean并且还要将每一个属性set(构造方法)入参的方式引入bean里面,这样的耦合性变高,后期也不容易进行维护
三、类属性注入到Spring容器中有几种方式?
@Autowired 按类型注入 Spring自己的注解,是自动注入,自动从spring的上下文找到合适的bean来注入
@Resource用来指定Bean名称注入
@Qualifier (和Autowired配合使用,指定bean的名称)
1.xml中可以在bean元素中通过autowire属性来设置自动注入的方式
<bean id="" class="" autowire="byType|byName|constructor|default" />
开始进入主题:
spring 的自动注入怎么来的?
1.byteName:按照名称进行注入
2.byType:按类型进行注入
3.constructor:按照构造方法进行注入
4.default:默认注入方式
1.按照名称进行注入(byName)
用法:
autowire设置为byName
<bean id="" class="X类" autowire="byName"/>
spring容器会按照set属性的名称去容器中查找同名的bean对象,然后将查找到的对象通过set方法注入到对应的bean中,未找到对应名称的bean对象则set方法不进行注入
需要注入的set属性的名称和被注入的bean的名称必须一致。
2.按照类型进行自动注入
用法:
autowire设置为byType
<bean id="" class="X类" autowire="byType"/>
spring容器会遍历x类中所有的set方法,会在容器中查找和set参数类型相同的bean对象,将其通过set方法进行注入,未找到对应类型的bean对象则set方法不进行注入
3.按照构造函数进行自动注入
用法:
autowire设置为constructor
<bean id="" class="X类" autowire="constructor"/>
spring会找到x类中所有的构造方法(一个类可能有多个构造方法),然后将这些构造方法进行排序得到一个构造函数列表,会轮询这个构造器列表,判断当前构造器所有参数是否在容器中都可以找到匹配的bean对象,如果可以找到就使用这个构造器进行注入,如果不能找到,那么就会跳过这个构造器,继续采用同样的方式匹配下一个构造器,直到找到一个合适的为止。
4.autowire=default
用法:
autowire设置为default
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.3.xsd"
default-autowire="byName">
</beans>
bean xml的根元素为beans,注意根元素有个default-autowire属性,这个属性可选值有(no|byName|byType|constructor|default),这个属性可以批量设置当前文件中所有bean的自动注入的方式,bean元素中如果省略了autowire属性,那么会取default-autowire的值作为其autowire的值,而每个bean元素还可以单独设置自己的autowire覆盖default-autowire的配置