0x01 描述

自动装配是Spring满足Bean依赖一种方式
Spring会在上下文中自动寻找,并自动给Bean装配属性
这有助于减少编写基于Spring的应用程序的XML依赖配置信息,便于维护和扩展

0x02 语法

  1. Bean标签,autowire属性,有如下属性:
  2. no:
  3. 即不启用自动装配,autowire属性默认值
  4. byName:
  5. 会自动在容器上下文中查找和自己对象set方法后面的值对应的beanId
  6. 例如:
  7. 假如定义完以后Person类有个setCat()与setDog()方法
  8. 那么自动装配就会删除set这个关键字,并且首字母变成小写
  9. 然后IOC容器会在配置文件中进行查找对应的beanId
  10. 也就是id叫做catdogbean然后自动的进行属性赋值
  11. byType:
  12. 会自动在容器上下文中查找和自己对象属性类型相同的bean
  13. 注意:
  14. Beanclass唯一必须全局唯一,id属性可以省略
  15. 也就是使用autowire属性为byName时,那么这个class就不能在定义别的Bean别名了
  16. 例如:
  17. 假如定义完以后Person2类有个setCat2()与setDog2()方法
  18. 那么自动装配就会删除set这个关键字,也就是Cat2Dog2
  19. 然后IOC容器会在配置文件中进行查找对应的beanclass
  20. 找到了<bean class="com.test.自动装配.例二.Cat2"/>与<bean class="com.test.自动装配.例二.Dog2"/>
  21. 然后自动的进行属性赋值
  22. constructor:
  23. byType一样,也是通过类型查找依赖对象
  24. 但是和byType的区别在于它不是使用Seter方法注入,而是使用构造方法注入
  25. autodetect:
  26. xxx

0x03 小例子-xml文件

0x03.1 自动装配byName

  1. // 第一步
  2. // 目录: ./SpringDemo/src/main/java/com/test/自动装配/例一/
  3. // 文件名: Cat.java
  4. package com.test.自动装配.例一;
  5. public class Cat {
  6. public String shout() {
  7. return "喵喵喵";
  8. }
  9. }
  1. // 第二步
  2. // 目录: ./SpringDemo/src/main/java/com/test/自动装配/例一/
  3. // 文件名: Dog.java
  4. package com.test.自动装配.例一;
  5. public class Dog {
  6. public String shout() {
  7. return "汪汪汪";
  8. }
  9. }
  1. // 第三步
  2. // 目录: ./SpringDemo/src/main/java/com/test/自动装配/例一/
  3. // 文件名: Person.java
  4. package com.test.自动装配.例一;
  5. public class Person {
  6. private String name;
  7. private Cat cat;
  8. private Dog dog;
  9. public void setName(String name) {
  10. this.name = name;
  11. }
  12. public void setCat(Cat cat) {
  13. this.cat = cat;
  14. }
  15. public void setDog(Dog dog) {
  16. this.dog = dog;
  17. }
  18. public String speak() {
  19. return "我叫" + this.name + "," +
  20. "有只猫会" + this.cat.shout() + "叫," +
  21. "还有只狗会" + this.dog.shout() + "叫";
  22. }
  23. }
  1. // 第四步
  2. // 引入自动装配byName
  3. // 目录: ./SpringDemo/src/main/resources/
  4. // 文件名: applicationContext11.xml
  5. <?xml version="1.0" encoding="UTF-8"?>
  6. <beans xmlns="http://www.springframework.org/schema/beans"
  7. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  8. xsi:schemaLocation="http://www.springframework.org/schema/beans
  9. https://www.springframework.org/schema/beans/spring-beans.xsd">
  10. <bean id="cat" class="com.test.自动装配.例一.Cat"/>
  11. <bean id="dog" class="com.test.自动装配.例一.Dog"/>
  12. <!--
  13. byName: 会自动在容器上下文中查找和自己对象set方法后面的值对应的beanId
  14. 例如:
  15. 这里这样定义完以后Person类有个setCat()与setDog()方法
  16. 那么自动装配就会删除set这个关键字,并且首字母变成小写
  17. 然后IOC容器会在配置文件中进行查找对应的beanId
  18. 也就是id叫做cat与dog的bean然后自动的进行属性赋值
  19. -->
  20. <bean id="personTest" class="com.test.自动装配.例一.Person" autowire="byName">
  21. <property name="name" value="张三"/>
  22. </bean>
  23. </beans>
  1. // 第五步
  2. // 创建一个测试类Test24进行测试
  3. // 目录: ./SpringDemo/src/test/java/
  4. // 文件名: Test24.java
  5. import com.test.自动装配.例一.Person;
  6. import org.springframework.context.ApplicationContext;
  7. import org.springframework.context.support.ClassPathXmlApplicationContext;
  8. public class Test24 {
  9. public static void main(String[] args) {
  10. ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext11.xml");
  11. Person obj = (Person) context.getBean("personTest");
  12. System.out.println(obj.speak());
  13. }
  14. }
  15. // 运行结果
  16. 我叫张三,有只猫会喵喵喵叫,还有只狗会汪汪汪叫

0x03.2 自动装配byType

  1. // 第一步
  2. // 目录: ./SpringDemo/src/main/java/com/test/自动装配/例二/
  3. // 文件名: Cat2.java
  4. package com.test.自动装配.例二;
  5. public class Cat2 {
  6. public String shout() {
  7. return "喵喵喵喵喵喵";
  8. }
  9. }
  1. // 第二步
  2. // 目录: ./SpringDemo/src/main/java/com/test/自动装配/例二/
  3. // 文件名: Dog2.java
  4. package com.test.自动装配.例二;
  5. public class Dog2 {
  6. public String shout() {
  7. return "汪汪汪汪汪汪";
  8. }
  9. }
  1. // 第三步
  2. // 目录: ./SpringDemo/src/main/java/com/test/自动装配/例二/
  3. // 文件名: Person2.java
  4. package com.test.自动装配.例二;
  5. public class Person2 {
  6. private String name;
  7. private Cat2 cat2;
  8. private Dog2 dog2;
  9. public void setName(String name) {
  10. this.name = name;
  11. }
  12. public void setCat2(Cat2 cat2) {
  13. this.cat2 = cat2;
  14. }
  15. public void setDog2(Dog2 dog2) {
  16. this.dog2 = dog2;
  17. }
  18. public String speak() {
  19. return "我叫" + this.name + "," +
  20. "有只猫会" + this.cat2.shout() + "叫," +
  21. "还有只狗会" + this.dog2.shout() + "叫";
  22. }
  23. }
  1. // 第四步
  2. // 引入自动装配byType
  3. // 目录: ./SpringDemo/src/main/resources/
  4. // 文件名: applicationContext12.xml
  5. <?xml version="1.0" encoding="UTF-8"?>
  6. <beans xmlns="http://www.springframework.org/schema/beans"
  7. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  8. xsi:schemaLocation="http://www.springframework.org/schema/beans
  9. https://www.springframework.org/schema/beans/spring-beans.xsd">
  10. <bean class="com.test.自动装配.例二.Cat2"/>
  11. <bean class="com.test.自动装配.例二.Dog2"/>
  12. <!--
  13. byType: 会自动在容器上下文中查找和自己对象属性类型相同的bean
  14. 例如:
  15. 这里这样定义完以后Person2类有个setCat2()与setDog2()方法
  16. 那么自动装配就会删除set这个关键字,也就是Cat2与Dog2
  17. 然后IOC容器会在配置文件中进行查找对应的bean的class
  18. 找到了<bean class="com.test.自动装配.例二.Cat2"/>与<bean class="com.test.自动装配.例二.Dog2"/>
  19. 然后自动的进行属性赋值
  20. -->
  21. <bean id="personTest2" class="com.test.自动装配.例二.Person2" autowire="byType">
  22. <property name="name" value="李四"/>
  23. </bean>
  24. </beans>
  1. // 第五步
  2. // 创建一个测试类Test25进行测试
  3. // 目录: ./SpringDemo/src/test/java/
  4. // 文件名: Test25.java
  5. import com.test.自动装配.例二.Person2;
  6. import org.springframework.context.ApplicationContext;
  7. import org.springframework.context.support.ClassPathXmlApplicationContext;
  8. public class Test25 {
  9. public static void main(String[] args) {
  10. ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext12.xml");
  11. Person2 obj = (Person2) context.getBean("personTest2");
  12. System.out.println(obj.speak());
  13. }
  14. }
  15. // 运行结果
  16. 我叫李四,有只猫会喵喵喵喵喵喵叫,还有只狗会汪汪汪汪汪汪叫

0x03.3 自动装配constructor

  1. // 第一步
  2. // 目录: ./SpringDemo/src/main/java/com/test/自动装配/例三/
  3. // 文件名: Cat3.java
  4. package com.test.自动装配.例三;
  5. public class Cat3 {
  6. public String shout() {
  7. return "喵呜呜呜呜";
  8. }
  9. }
  1. // 第二步
  2. // 目录: ./SpringDemo/src/main/java/com/test/自动装配/例三/
  3. // 文件名: Dog3.java
  4. package com.test.自动装配.例三;
  5. public class Dog3 {
  6. public String shout() {
  7. return "汪呜呜呜呜";
  8. }
  9. }
  1. // 第三步
  2. // 目录: ./SpringDemo/src/main/java/com/test/自动装配/例三/
  3. // 文件名: Person3.java
  4. package com.test.自动装配.例三;
  5. public class Person3 {
  6. private String name;
  7. private Cat3 cat3;
  8. private Dog3 dog3;
  9. public Person3(String name, Cat3 cat3, Dog3 dog3) {
  10. this.name = name;
  11. this.cat3 = cat3;
  12. this.dog3 = dog3;
  13. }
  14. public String speak() {
  15. return "我叫" + this.name + "," +
  16. "有只猫会" + this.cat3.shout() + "叫," +
  17. "还有只狗会" + this.dog3.shout() + "叫";
  18. }
  19. }
  1. // 第四步
  2. // 引入自动装配constructor
  3. // 目录: ./SpringDemo/src/main/resources/
  4. // 文件名: applicationContext13.xml
  5. <?xml version="1.0" encoding="UTF-8"?>
  6. <beans xmlns="http://www.springframework.org/schema/beans"
  7. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  8. xsi:schemaLocation="http://www.springframework.org/schema/beans
  9. https://www.springframework.org/schema/beans/spring-beans.xsd">
  10. <bean class="com.test.自动装配.例三.Cat3"/>
  11. <bean class="com.test.自动装配.例三.Dog3"/>
  12. <!--
  13. constructor:
  14. 和byType一样,也是通过类型查找依赖对象
  15. 但是和byType的区别在于它不是使用Seter方法注入,而是使用构造方法注入
  16. 例如:
  17. 这里这样定义完以后Person3类有String name,Cat3 cat3,Dog3 dog3属性
  18. 那么自动装配就会获取构造方法也就是public Person3(String name, Cat3 cat3, Dog3 dog3)
  19. String name的属性通过<constructor-arg name="name" value="马六"/>添加了进去
  20. 剩下的Cat3 cat3,Dog3 dog3属性IOC容器会在配置文件中进行查找对应的bean的class
  21. 找到了<bean class="com.test.自动装配.例三.Cat3"/>与<bean class="com.test.自动装配.例三.Dog3"/>
  22. 然后自动的进行属性赋值
  23. -->
  24. <bean id="personTest3" class="com.test.自动装配.例三.Person3" autowire="constructor">
  25. <constructor-arg name="name" value="马六"/>
  26. </bean>
  27. </beans>
  1. // 第五步
  2. // 创建一个测试类Test26进行测试
  3. // 目录: ./SpringDemo/src/test/java/
  4. // 文件名: Test26.java
  5. import com.test.自动装配.例三.Person3;
  6. import org.springframework.context.ApplicationContext;
  7. import org.springframework.context.support.ClassPathXmlApplicationContext;
  8. public class Test26 {
  9. public static void main(String[] args) {
  10. ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext13.xml");
  11. Person3 obj = (Person3) context.getBean("personTest3");
  12. System.out.println(obj.speak());
  13. }
  14. }
  15. // 运行结果
  16. 我叫马六,有只猫会喵呜呜呜呜叫,还有只狗会汪呜呜呜呜叫