之前我们要注入依赖都是通过手动注入的,关于手动注入可以参考四种注入方式
而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系列:自动注入(autowire)详解,高手在于坚持!