spring--自动装配

之前我们要注入依赖都是通过手动注入的,关于手动注入可以参考四种注入方式

而spring开发者意识到这种手动注入太麻烦了,于是就有了自动装配注入,不过仅针对bean的注入,不支持字符串等数据类型注入

spring实现自动装配的方式有两种,一种是通过xml文件,另一种是通过注解

手动注入的优先级比自动装配的优先级更高,如果两种都使用了,手动注入会覆盖自动装配

通过xml文件

Animal.java

package test_one;

public class Animal {
    private Dog dog;

    public Dog getDog() {
        return dog;
    }

    public void setDog(Dog dog) {
        this.dog = dog;
    }
    public void print() {
        System.out.println(dog);
    }
}
package test_one;
//Dog.java
public class Dog {
    
}

bean.xml

<!--自动配置-->
<bean id="dog" class="test_one.Dog" />
<bean id="animal" class="test_one.Animal" autowire="byName"/>

分析上面的代码

autowire=“byName" 表示属性名与id名相匹配,基于setter注入

具体是 通过setXxx得到属性名,然后与xml文件中的bean进行匹配,与bean的id名相同的匹配成功

所以使用byName方式需要确保属性名与依赖的id名相同

autowire的装配方式有:byName, byType, constructor, default, no

autowire="byType"  属性类型与class=""最后的类名匹配, 基于setter注入

autowire="constructor"  构造函数参数类型去匹配,基于构造函数注入

为什么说是通过构造函数参数类型匹配?  将参数名改成其他的依然成功

由于一个bean可能不止一个构造函数,所以到底选哪个构造函数呢? 相当于贪婪模式匹配,选尽可能多依赖并且全部依赖找到,参数数量倒叙的顺序逐一匹配,直到有一个构造函数中的全部参数都匹配到

autowire="default"

根元素有default-autowire属性,这个属性可选值有(no|byName|byType|constructor|default)

如果bean选择default的方式自动装配,那么就是选择default-autowire属性的值

<?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>

参考:spring--自动装配(非常详细)

Spring系列:自动注入(autowire)详解,高手在于坚持!

 

上一篇:RestTemplate 非200请求 响应获取的方法


下一篇:docker部署Confluence