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.java
package com.test.自动装配.例一;
public class Cat {
public String shout() {
return "喵喵喵";
}
}
// 第二步
// 目录: ./SpringDemo/src/main/java/com/test/自动装配/例一/
// 文件名: Dog.java
package com.test.自动装配.例一;
public class Dog {
public String shout() {
return "汪汪汪";
}
}
// 第三步
// 目录: ./SpringDemo/src/main/java/com/test/自动装配/例一/
// 文件名: Person.java
package 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/beans
https://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.java
import 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.java
package com.test.自动装配.例二;
public class Cat2 {
public String shout() {
return "喵喵喵喵喵喵";
}
}
// 第二步
// 目录: ./SpringDemo/src/main/java/com/test/自动装配/例二/
// 文件名: Dog2.java
package com.test.自动装配.例二;
public class Dog2 {
public String shout() {
return "汪汪汪汪汪汪";
}
}
// 第三步
// 目录: ./SpringDemo/src/main/java/com/test/自动装配/例二/
// 文件名: Person2.java
package 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/beans
https://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.java
import 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.java
package com.test.自动装配.例三;
public class Cat3 {
public String shout() {
return "喵呜呜呜呜";
}
}
// 第二步
// 目录: ./SpringDemo/src/main/java/com/test/自动装配/例三/
// 文件名: Dog3.java
package com.test.自动装配.例三;
public class Dog3 {
public String shout() {
return "汪呜呜呜呜";
}
}
// 第三步
// 目录: ./SpringDemo/src/main/java/com/test/自动装配/例三/
// 文件名: Person3.java
package 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/beans
https://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.java
import 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());
}
}
// 运行结果
我叫马六,有只猫会喵呜呜呜呜叫,还有只狗会汪呜呜呜呜叫