0x01 描述
自动装配是Spring满足Bean依赖一种方式
Spring会在上下文中自动寻找,并自动给Bean装配属性
这有助于减少编写基于Spring的应用程序的XML依赖配置信息,便于维护和扩展
0x02 语法
Bean标签,autowire属性,有如下属性:no:即不启用自动装配,autowire属性默认值byName:会自动在容器上下文中查找和自己对象set方法后面的值对应的beanId例如:假如定义完以后Person类有个setCat()与setDog()方法那么自动装配就会删除set这个关键字,并且首字母变成小写然后IOC容器会在配置文件中进行查找对应的beanId也就是id叫做cat与dog的bean然后自动的进行属性赋值byType:会自动在容器上下文中查找和自己对象属性类型相同的bean注意:Bean的class唯一必须全局唯一,id属性可以省略也就是使用autowire属性为byName时,那么这个class就不能在定义别的Bean别名了例如:假如定义完以后Person2类有个setCat2()与setDog2()方法那么自动装配就会删除set这个关键字,也就是Cat2与Dog2然后IOC容器会在配置文件中进行查找对应的bean的class找到了<bean class="com.test.自动装配.例二.Cat2"/>与<bean class="com.test.自动装配.例二.Dog2"/>然后自动的进行属性赋值constructor:和byType一样,也是通过类型查找依赖对象但是和byType的区别在于它不是使用Seter方法注入,而是使用构造方法注入autodetect:xxx
0x03 小例子-xml文件
0x03.1 自动装配byName
// 第一步// 目录: ./SpringDemo/src/main/java/com/test/自动装配/例一/// 文件名: Cat.javapackage com.test.自动装配.例一;public class Cat {public String shout() {return "喵喵喵";}}
// 第二步// 目录: ./SpringDemo/src/main/java/com/test/自动装配/例一/// 文件名: Dog.javapackage com.test.自动装配.例一;public class Dog {public String shout() {return "汪汪汪";}}
// 第三步// 目录: ./SpringDemo/src/main/java/com/test/自动装配/例一/// 文件名: Person.javapackage com.test.自动装配.例一;public class Person {private String name;private Cat cat;private Dog dog;public void setName(String name) {this.name = name;}public void setCat(Cat cat) {this.cat = cat;}public void setDog(Dog dog) {this.dog = dog;}public String speak() {return "我叫" + this.name + "," +"有只猫会" + this.cat.shout() + "叫," +"还有只狗会" + this.dog.shout() + "叫";}}
// 第四步// 引入自动装配byName// 目录: ./SpringDemo/src/main/resources/// 文件名: applicationContext11.xml<?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/beanshttps://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="cat" class="com.test.自动装配.例一.Cat"/><bean id="dog" class="com.test.自动装配.例一.Dog"/><!--byName: 会自动在容器上下文中查找和自己对象set方法后面的值对应的beanId例如:这里这样定义完以后Person类有个setCat()与setDog()方法那么自动装配就会删除set这个关键字,并且首字母变成小写然后IOC容器会在配置文件中进行查找对应的beanId也就是id叫做cat与dog的bean然后自动的进行属性赋值--><bean id="personTest" class="com.test.自动装配.例一.Person" autowire="byName"><property name="name" value="张三"/></bean></beans>
// 第五步// 创建一个测试类Test24进行测试// 目录: ./SpringDemo/src/test/java/// 文件名: Test24.javaimport com.test.自动装配.例一.Person;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class Test24 {public static void main(String[] args) {ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext11.xml");Person obj = (Person) context.getBean("personTest");System.out.println(obj.speak());}}// 运行结果我叫张三,有只猫会喵喵喵叫,还有只狗会汪汪汪叫
0x03.2 自动装配byType
// 第一步// 目录: ./SpringDemo/src/main/java/com/test/自动装配/例二/// 文件名: Cat2.javapackage com.test.自动装配.例二;public class Cat2 {public String shout() {return "喵喵喵喵喵喵";}}
// 第二步// 目录: ./SpringDemo/src/main/java/com/test/自动装配/例二/// 文件名: Dog2.javapackage com.test.自动装配.例二;public class Dog2 {public String shout() {return "汪汪汪汪汪汪";}}
// 第三步// 目录: ./SpringDemo/src/main/java/com/test/自动装配/例二/// 文件名: Person2.javapackage com.test.自动装配.例二;public class Person2 {private String name;private Cat2 cat2;private Dog2 dog2;public void setName(String name) {this.name = name;}public void setCat2(Cat2 cat2) {this.cat2 = cat2;}public void setDog2(Dog2 dog2) {this.dog2 = dog2;}public String speak() {return "我叫" + this.name + "," +"有只猫会" + this.cat2.shout() + "叫," +"还有只狗会" + this.dog2.shout() + "叫";}}
// 第四步// 引入自动装配byType// 目录: ./SpringDemo/src/main/resources/// 文件名: applicationContext12.xml<?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/beanshttps://www.springframework.org/schema/beans/spring-beans.xsd"><bean class="com.test.自动装配.例二.Cat2"/><bean class="com.test.自动装配.例二.Dog2"/><!--byType: 会自动在容器上下文中查找和自己对象属性类型相同的bean例如:这里这样定义完以后Person2类有个setCat2()与setDog2()方法那么自动装配就会删除set这个关键字,也就是Cat2与Dog2然后IOC容器会在配置文件中进行查找对应的bean的class找到了<bean class="com.test.自动装配.例二.Cat2"/>与<bean class="com.test.自动装配.例二.Dog2"/>然后自动的进行属性赋值--><bean id="personTest2" class="com.test.自动装配.例二.Person2" autowire="byType"><property name="name" value="李四"/></bean></beans>
// 第五步// 创建一个测试类Test25进行测试// 目录: ./SpringDemo/src/test/java/// 文件名: Test25.javaimport com.test.自动装配.例二.Person2;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class Test25 {public static void main(String[] args) {ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext12.xml");Person2 obj = (Person2) context.getBean("personTest2");System.out.println(obj.speak());}}// 运行结果我叫李四,有只猫会喵喵喵喵喵喵叫,还有只狗会汪汪汪汪汪汪叫
0x03.3 自动装配constructor
// 第一步// 目录: ./SpringDemo/src/main/java/com/test/自动装配/例三/// 文件名: Cat3.javapackage com.test.自动装配.例三;public class Cat3 {public String shout() {return "喵呜呜呜呜";}}
// 第二步// 目录: ./SpringDemo/src/main/java/com/test/自动装配/例三/// 文件名: Dog3.javapackage com.test.自动装配.例三;public class Dog3 {public String shout() {return "汪呜呜呜呜";}}
// 第三步// 目录: ./SpringDemo/src/main/java/com/test/自动装配/例三/// 文件名: Person3.javapackage com.test.自动装配.例三;public class Person3 {private String name;private Cat3 cat3;private Dog3 dog3;public Person3(String name, Cat3 cat3, Dog3 dog3) {this.name = name;this.cat3 = cat3;this.dog3 = dog3;}public String speak() {return "我叫" + this.name + "," +"有只猫会" + this.cat3.shout() + "叫," +"还有只狗会" + this.dog3.shout() + "叫";}}
// 第四步// 引入自动装配constructor// 目录: ./SpringDemo/src/main/resources/// 文件名: applicationContext13.xml<?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/beanshttps://www.springframework.org/schema/beans/spring-beans.xsd"><bean class="com.test.自动装配.例三.Cat3"/><bean class="com.test.自动装配.例三.Dog3"/><!--constructor:和byType一样,也是通过类型查找依赖对象但是和byType的区别在于它不是使用Seter方法注入,而是使用构造方法注入例如:这里这样定义完以后Person3类有String name,Cat3 cat3,Dog3 dog3属性那么自动装配就会获取构造方法也就是public Person3(String name, Cat3 cat3, Dog3 dog3)String name的属性通过<constructor-arg name="name" value="马六"/>添加了进去剩下的Cat3 cat3,Dog3 dog3属性IOC容器会在配置文件中进行查找对应的bean的class找到了<bean class="com.test.自动装配.例三.Cat3"/>与<bean class="com.test.自动装配.例三.Dog3"/>然后自动的进行属性赋值--><bean id="personTest3" class="com.test.自动装配.例三.Person3" autowire="constructor"><constructor-arg name="name" value="马六"/></bean></beans>
// 第五步// 创建一个测试类Test26进行测试// 目录: ./SpringDemo/src/test/java/// 文件名: Test26.javaimport com.test.自动装配.例三.Person3;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class Test26 {public static void main(String[] args) {ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext13.xml");Person3 obj = (Person3) context.getBean("personTest3");System.out.println(obj.speak());}}// 运行结果我叫马六,有只猫会喵呜呜呜呜叫,还有只狗会汪呜呜呜呜叫
