0x01 什么是依赖注入

依赖注入,是IOC的一个功能,是个通常的概念,它有多种解释
这概念是说你不用创建对象,而只需要描述它如何被创建
你不在代码里直接组装你的组件和服务,而是在配置文件里描述哪些组件需要哪些服务之后一个容器(IOC容器)负责把他们组装起来

0x02 依赖注入的方式

  1. 能注入的数据-有三类:
  2. 1. 基本类型和String
  3. 2. 其他bean类型(在配置文件中或者注解配置过的bean)
  4. 3. 复杂类型/集合类型。
  5. 注入的方式-有三种:
  6. 1. 构造函数注入
  7. 2. Set方式注入
  8. 3. 注解注入

0x03 小例子-xml文件-构造函数注入

0x03.1 描述

  1. 顾名思义,就是使用类中的构造函数,给成员变量赋值
  2. 注: 赋值的操作不是我们自己做的,而是通过配置的方式,让Spring框架来为我们注入
  3. 优点:
  4. 基于构造器注入,会固定依赖注入的顺序
  5. 不允许我们创建的Bean对象之间存在循环依赖关系,这样Spring能解决循环依赖的问题
  6. 缺点:
  7. 使用构造器注入的缺点是当我们构造器需要注入的对象比较多时
  8. 会显得我们的构造器,冗余,不美观,可读性差,也不易维护
标签有如下属性
属性 描述
type 用于指定要注入的数据的数据类型,该数据类型也是构造函数中某个或某些参数的类型
index 用于指定要注入的数据给构造函数中指定索引位置的参数赋值,索引的位置是从0开始
name 用于指定给构造函数中指定名称的参数赋值
value 用于提供基本类型和String类型的数据
ref 用于指定其他的bean类型数据,它指的就是在Spring的IOC核心容器中出现过的Bean对象

0x03.2 默认构造器方式

  1. // 第一步
  2. // 在./SpringDemo/src/main/java/com/test/依赖注入/构造函数注入/User.java
  3. // 目录: ./SpringDemo/src/main/java/com/test/依赖注入/构造函数注入/
  4. // 文件名: User.java
  5. package com.test.依赖注入.构造函数注入;
  6. public class User {
  7. private String name;
  8. public void setName(String name) {
  9. this.name = name;
  10. }
  11. public String getName() {
  12. return name;
  13. }
  14. }
  1. // 第二步
  2. // 在<beans>标签中,中配置userTest1的信息, 设定name的值为“张三”
  3. // 这里提供一个配置好的applicationContext6.xml文件
  4. // 目录: ./SpringDemo/src/main/resources/
  5. // 文件名: applicationContext6.xml
  6. <?xml version="1.0" encoding="UTF-8"?>
  7. <beans xmlns="http://www.springframework.org/schema/beans"
  8. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  9. xsi:schemaLocation="http://www.springframework.org/schema/beans
  10. https://www.springframework.org/schema/beans/spring-beans.xsd">
  11. <!--默认构造器方式-->
  12. <bean id="userTest1" class="com.test.依赖注入.构造函数注入.User1">
  13. <property name="name" value="张三"/>
  14. </bean>
  15. </beans>
  1. // 第三步
  2. // 创建一个测试类Test13进行测试
  3. // 目录: ./SpringDemo/src/test/java/
  4. // 文件名: Test13.java
  5. import com.test.依赖注入.构造函数注入.User1;
  6. import org.springframework.context.support.AbstractApplicationContext;
  7. import org.springframework.context.support.ClassPathXmlApplicationContext;
  8. public class Test13 {
  9. public static void main(String[] args) {
  10. AbstractApplicationContext context = new ClassPathXmlApplicationContext("applicationContext6.xml");
  11. User1 obj = (User1) context.getBean("userTest1");
  12. System.out.println(obj.getName());
  13. }
  14. }
  15. // 运行结果
  16. 张三

0x03.3 有参构造创建对象

0x03.3.1 前置操作

  1. // 在./SpringDemo/src/main/resources/创建个applicationContext6.xml
  2. // 目录: ./SpringDemo/src/main/resources/
  3. // 文件名: applicationContext6.xml
  4. <?xml version="1.0" encoding="UTF-8"?>
  5. <beans xmlns="http://www.springframework.org/schema/beans"
  6. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  7. xsi:schemaLocation="http://www.springframework.org/schema/beans
  8. https://www.springframework.org/schema/beans/spring-beans.xsd">
  9. </beans>
  1. // 在./SpringDemo/src/main/java/com/test/依赖注入/构造函数注入/创建个User2.java
  2. // 目录: ./SpringDemo/src/main/java/com/test/依赖注入/构造函数注入/
  3. // 文件名: User2.java
  4. package com.test.依赖注入.构造函数注入;
  5. public class User2 {
  6. private String name;
  7. private Integer age;
  8. public User2(String name) {
  9. this.name = name;
  10. }
  11. public User2(Integer age) {
  12. this.age = age;
  13. }
  14. public User2(String name, Integer age) {
  15. this.name = name;
  16. this.age = age;
  17. }
  18. public String getName() {
  19. return this.name;
  20. }
  21. public Integer getAge() {
  22. return this.age;
  23. }
  24. }

0x03.3.2 有参构造创建对象-下标赋值注入

  1. // 第一步
  2. // 目录: ./SpringDemo/src/main/resources/
  3. // 文件名: applicationContext6.xml
  4. <?xml version="1.0" encoding="UTF-8"?>
  5. <beans xmlns="http://www.springframework.org/schema/beans"
  6. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  7. xsi:schemaLocation="http://www.springframework.org/schema/beans
  8. https://www.springframework.org/schema/beans/spring-beans.xsd">
  9. <!--有参构造创建对象-下标赋值,不建议使用-->
  10. <bean id="userTest2" class="com.test.依赖注入.构造函数注入.User2">
  11. <constructor-arg index="0" value="李四"/>
  12. <constructor-arg index="1" value="11"/>
  13. </bean>
  14. </beans>
  1. // 第二步
  2. // 创建一个测试类Test14进行测试
  3. // 目录: ./SpringDemo/src/test/java/
  4. // 文件名: Test14.java
  5. import com.test.依赖注入.构造函数注入.User2;
  6. import org.springframework.context.support.AbstractApplicationContext;
  7. import org.springframework.context.support.ClassPathXmlApplicationContext;
  8. public class Test14 {
  9. public static void main(String[] args) {
  10. AbstractApplicationContext context = new ClassPathXmlApplicationContext("applicationContext6.xml");
  11. User2 obj = (User2) context.getBean("userTest2");
  12. System.out.println(obj.getName());
  13. System.out.println(obj.getAge());
  14. }
  15. }
  16. // 运行结果
  17. 李四
  18. 11

0x03.3.3 有参构造创建对象-数据类型注入

  1. // 第一步
  2. // 目录: ./SpringDemo/src/main/resources/
  3. // 文件名: applicationContext6.xml
  4. <?xml version="1.0" encoding="UTF-8"?>
  5. <beans xmlns="http://www.springframework.org/schema/beans"
  6. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  7. xsi:schemaLocation="http://www.springframework.org/schema/beans
  8. https://www.springframework.org/schema/beans/spring-beans.xsd">
  9. <!--有参构造创建对象-数据类型,不建议使用-->
  10. <bean id="userTest2-2" class="com.test.依赖注入.构造函数注入.User2">
  11. <constructor-arg type="java.lang.Integer" value="15"/>
  12. <constructor-arg type="java.lang.String" value="王五"/>
  13. </bean>
  14. </beans>
  1. // 第二步
  2. // 创建一个测试类Test15进行测试
  3. // 目录: ./SpringDemo/src/test/java/
  4. // 文件名: Test15.java
  5. import com.test.依赖注入.构造函数注入.User2;
  6. import org.springframework.context.support.AbstractApplicationContext;
  7. import org.springframework.context.support.ClassPathXmlApplicationContext;
  8. public class Test15 {
  9. public static void main(String[] args) {
  10. AbstractApplicationContext context = new ClassPathXmlApplicationContext("applicationContext6.xml");
  11. User2 obj = (User2) context.getBean("userTest2-2");
  12. System.out.println(obj.getName());
  13. System.out.println(obj.getAge());
  14. }
  15. }
  16. // 运行结果
  17. 王五
  18. 15

0x03.3.4 有参构造创建对象-参数名注入

  1. // 第一步
  2. // 目录: ./SpringDemo/src/main/resources/
  3. // 文件名: applicationContext6.xml
  4. <?xml version="1.0" encoding="UTF-8"?>
  5. <beans xmlns="http://www.springframework.org/schema/beans"
  6. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  7. xsi:schemaLocation="http://www.springframework.org/schema/beans
  8. https://www.springframework.org/schema/beans/spring-beans.xsd">
  9. <!--有参构造创建对象-参数名注入,推荐使用-->
  10. <bean id="userTest2-3" class="com.test.依赖注入.构造函数注入.User2">
  11. <constructor-arg name="name" value="马六"/>
  12. <constructor-arg name="age" value="18"/>
  13. </bean>
  14. </beans>
  1. // 第二步
  2. // 创建一个测试类Test16进行测试
  3. // 目录: ./SpringDemo/src/test/java/
  4. // 文件名: Test16.java
  5. import com.test.依赖注入.构造函数注入.User2;
  6. import org.springframework.context.support.AbstractApplicationContext;
  7. import org.springframework.context.support.ClassPathXmlApplicationContext;
  8. public class Test16 {
  9. public static void main(String[] args) {
  10. AbstractApplicationContext context = new ClassPathXmlApplicationContext("applicationContext6.xml");
  11. User2 obj = (User2) context.getBean("userTest2-3");
  12. System.out.println(obj.getName());
  13. System.out.println(obj.getAge());
  14. }
  15. }
  16. // 运行结果
  17. 马六
  18. 18

0x03.3.5 有参构造创建对象-对象注入

  1. // 第一步
  2. // 创建个SpellChecker类,给其它类使用
  3. // 目录: ./SpringDemo/src/main/java/com/test/依赖注入/构造函数注入/
  4. // 文件名: SpellChecker.java
  5. package com.test.依赖注入.构造函数注入;
  6. public class SpellChecker {
  7. public SpellChecker() {
  8. System.out.println("SpellChecker内部-无参构造函数");
  9. }
  10. public void checkSpelling() {
  11. System.out.println("拼写检查");
  12. }
  13. }
  1. // 第二步
  2. // 创建个TextEditor类,在构造方法中引用SpellChecker类
  3. // 目录: ./SpringDemo/src/main/java/com/test/依赖注入/构造函数注入/
  4. // 文件名: TextEditor.java
  5. package com.test.依赖注入.构造函数注入;
  6. public class TextEditor {
  7. private SpellChecker spellChecker;
  8. public TextEditor(SpellChecker spellChecker) {
  9. System.out.println("TextEditor内部-有参构造函数");
  10. this.spellChecker = spellChecker;
  11. }
  12. public void spellCheck() {
  13. this.spellChecker.checkSpelling();
  14. }
  15. }
  1. // 第三步
  2. // 目录: ./SpringDemo/src/main/resources/
  3. // 文件名: applicationContext6.xml
  4. <?xml version="1.0" encoding="UTF-8"?>
  5. <beans xmlns="http://www.springframework.org/schema/beans"
  6. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  7. xsi:schemaLocation="http://www.springframework.org/schema/beans
  8. https://www.springframework.org/schema/beans/spring-beans.xsd">
  9. <!--textEditor bean的定义-->
  10. <bean id="spellCheckerTest" class="com.test.依赖注入.构造函数注入.SpellChecker"/>
  11. <!--有参构造创建对象-对象注入,推荐使用-->
  12. <bean id="textEditorTest" class="com.test.依赖注入.构造函数注入.TextEditor">
  13. <constructor-arg ref="spellCheckerTest"/>
  14. </bean>
  15. </beans>
  1. // 第四步
  2. // 创建一个测试类Test17进行测试
  3. // 目录: ./SpringDemo/src/test/java/
  4. // 文件名: Test17.java
  5. import com.test.依赖注入.构造函数注入.TextEditor;
  6. import org.springframework.context.support.AbstractApplicationContext;
  7. import org.springframework.context.support.ClassPathXmlApplicationContext;
  8. public class Test17 {
  9. public static void main(String[] args) {
  10. AbstractApplicationContext context = new ClassPathXmlApplicationContext("applicationContext6.xml");
  11. TextEditor te = (TextEditor) context.getBean("textEditorTest");
  12. te.spellCheck();
  13. }
  14. }
  15. // 运行结果
  16. SpellChecker内部-无参构造函数
  17. TextEditor内部-有参构造函数
  18. 拼写检查

0x04 小例子-xml文件-Set方式注入

0x04.1 描述

  1. 顾名思义,就是在类中提供需要注入成员的set方法
标签有如下属性
属性 描述
name 用于指定注入时所调用的set方法名称
value 用于提供基本类型和String类型的数据
ref 用于指定其他的bean类型数据,它指的就是在Spring的IOC核心容器中出现过的Bean对象

0x04.2 普通模式

  1. // 第一步
  2. // 在./SpringDemo/src/main/java/com/test/依赖注入/Set方式注入/创建个User3.java
  3. // 目录: ./SpringDemo/src/main/java/com/test/依赖注入/Set方式注入/
  4. // 文件名: User3.java
  5. package com.test.依赖注入.Set方式注入;
  6. public class User3 {
  7. private String name;
  8. private Integer age;
  9. public void setName(String name) {
  10. this.name = name;
  11. }
  12. public String getName() {
  13. return this.name;
  14. }
  15. public void setAge(Integer age) {
  16. this.age = age;
  17. }
  18. public Integer getAge() {
  19. return this.age;
  20. }
  21. }
  1. // 第二步
  2. // 目录: ./SpringDemo/src/main/resources/
  3. // 文件名: applicationContext7.xml
  4. <?xml version="1.0" encoding="UTF-8"?>
  5. <beans xmlns="http://www.springframework.org/schema/beans"
  6. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  7. xsi:schemaLocation="http://www.springframework.org/schema/beans
  8. https://www.springframework.org/schema/beans/spring-beans.xsd">
  9. <bean id="userTest3" class="com.test.依赖注入.Set方式注入.User3">
  10. <property name="name" value="陈七"></property>
  11. <property name="age" value="23"></property>
  12. </bean>
  13. </beans>
  1. // 第三步
  2. // 创建一个测试类Test18进行测试
  3. // 目录: ./SpringDemo/src/test/java/
  4. // 文件名: Test18.java
  5. import com.test.依赖注入.Set方式注入.User3;
  6. import org.springframework.context.support.AbstractApplicationContext;
  7. import org.springframework.context.support.ClassPathXmlApplicationContext;
  8. public class Test18 {
  9. public static void main(String[] args) {
  10. AbstractApplicationContext context = new ClassPathXmlApplicationContext("applicationContext7.xml");
  11. User3 obj = (User3) context.getBean("userTest3");
  12. System.out.println(obj.getName());
  13. System.out.println(obj.getAge());
  14. }
  15. }
  16. // 运行结果
  17. 陈七
  18. 23

0x04.3 复杂类型的注入

  1. 顾名思义,就是给类中的集合成员传值,它用的也是set方法注入的方式,只不过变量的数据类型都是集合
  2. 注入的类型有:
  3. String
  4. class对象
  5. String[]
  6. List<String>
  7. Map<String, String>
  8. Set<String>
  9. Properties
  1. // 第一步
  2. // 在./SpringDemo/src/main/java/com/test/依赖注入/Set方式注入/创建个Person.java
  3. // 目录: ./SpringDemo/src/main/java/com/test/依赖注入/Set方式注入/
  4. // 文件名: Person.java
  5. package com.test.依赖注入.Set方式注入;
  6. public class Person {
  7. private String name;
  8. private int age;
  9. public void setName(String name) {
  10. this.name = name;
  11. }
  12. public String getName() {
  13. return this.name;
  14. }
  15. public void setAge(Integer age) {
  16. this.age = age;
  17. }
  18. public Integer getAge() {
  19. return this.age;
  20. }
  21. @Override
  22. public String toString() {
  23. return "Person{" +
  24. "name='" + this.name + "', " +
  25. "age='" + this.age + "'" +
  26. "}";
  27. }
  28. }
  1. // 第二步
  2. // 在./SpringDemo/src/main/java/com/test/依赖注入/Set方式注入/创建个Student.java
  3. // 目录: ./SpringDemo/src/main/java/com/test/依赖注入/Set方式注入/
  4. // 文件名: Student.java
  5. package com.test.依赖注入.Set方式注入;
  6. import java.util.*;
  7. public class Student {
  8. private String name;
  9. private Person person;
  10. private String[] arr;
  11. private List<String> myList;
  12. private Map<String, String> myMap;
  13. private Set<String> mySet;
  14. private String wife;
  15. private Properties myPro;
  16. public void setName(String name) {
  17. this.name = name;
  18. }
  19. public void setPerson(Person person) {
  20. this.person = person;
  21. }
  22. public void setArr(String[] arr) {
  23. this.arr = arr;
  24. }
  25. public void setMyList(List<String> myList) {
  26. this.myList = myList;
  27. }
  28. public void setMyMap(Map<String, String> myMap) {
  29. this.myMap = myMap;
  30. }
  31. public void setMySet(Set<String> mySet) {
  32. this.mySet = mySet;
  33. }
  34. public void setWife(String wife) {
  35. this.wife = wife;
  36. }
  37. public void setMyPro(Properties myPro) {
  38. this.myPro = myPro;
  39. }
  40. @Override
  41. public String toString() {
  42. return "Student{" +
  43. "name='" + this.name + "', " +
  44. "person=" + this.person.toString() + ", " +
  45. "arr=" + Arrays.toString(this.arr) + ", " +
  46. "myList=" + this.myList + ", " +
  47. "myMap=" + this.myMap + ", " +
  48. "mySet=" + this.mySet + ", " +
  49. "wife='" + this.wife + "', " +
  50. "myPro=" + this.myPro + "" +
  51. "}";
  52. }
  53. }
  1. // 第三步
  2. // 目录: ./SpringDemo/src/main/resources/
  3. // 文件名: applicationContext8.xml
  4. <?xml version="1.0" encoding="UTF-8"?>
  5. <beans xmlns="http://www.springframework.org/schema/beans"
  6. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  7. xsi:schemaLocation="http://www.springframework.org/schema/beans
  8. https://www.springframework.org/schema/beans/spring-beans.xsd">
  9. <bean id="personTest" class="com.test.依赖注入.Set方式注入.Person">
  10. <property name="name" value="马八"/>
  11. <property name="age" value="12"/>
  12. </bean>
  13. <bean id="studentTest" class="com.test.依赖注入.Set方式注入.Student">
  14. <!--普通值注入,value: 具体属性值-->
  15. <property name="name" value="何九"/>
  16. <!--Bean注入, ref: 对象-->
  17. <property name="person" ref="personTest"/>
  18. <!--数组注入-->
  19. <property name="arr">
  20. <array>
  21. <value>AAA</value>
  22. <value>BBB</value>
  23. <value>CCC</value>
  24. </array>
  25. </property>
  26. <!--List注入-->
  27. <property name="myList">
  28. <list>
  29. <value>111</value>
  30. <value>222</value>
  31. <value>333</value>
  32. </list>
  33. </property>
  34. <!--Map注入-->
  35. <property name="myMap">
  36. <map>
  37. <entry key="ddd" value="dddd"></entry>
  38. <entry key="fff" value="ffff"></entry>
  39. <entry key="ggg" value="gggg"></entry>
  40. </map>
  41. </property>
  42. <!--Set注入-->
  43. <property name="mySet">
  44. <set>
  45. <value>111</value>
  46. <value>222</value>
  47. <value>333</value>
  48. </set>
  49. </property>
  50. <!--null注入-->
  51. <property name="wife">
  52. <null/>
  53. </property>
  54. <!--Properties注入-->
  55. <property name="myPro">
  56. <props>
  57. <prop key="hhh">hhhh</prop>
  58. <prop key="iii">iiii</prop>
  59. <prop key="qqq">qqqq</prop>
  60. </props>
  61. </property>
  62. </bean>
  63. </beans>
  1. // 第四步
  2. // 创建一个测试类Test19进行测试
  3. // 目录: ./SpringDemo/src/test/java/
  4. // 文件名: Test19.java
  5. import com.test.依赖注入.Set方式注入.Student;
  6. import org.springframework.context.ApplicationContext;
  7. import org.springframework.context.support.ClassPathXmlApplicationContext;
  8. public class Test19 {
  9. public static void main(String[] args) {
  10. ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext8.xml");
  11. Student student = (Student) context.getBean("studentTest");
  12. System.out.println(student.toString());
  13. }
  14. }
  15. // 运行结果
  16. Student{name='何九', person=Person{name='马八', age='12'}, arr=[AAA, BBB, CCC], myList=[111, 222, 333], myMap={ddd=dddd, fff=ffff, ggg=gggg}, mySet=[111, 222, 333], wife='null', myPro={qqq=qqqq, iii=iiii, hhh=hhhh}}

0x04.4 p与c命名空间注入

0x04.4.1 前置操作

  1. 注意: p命名和c命名空间不能直接使用, 需要导入xml约束
  2. xmlns:p="http://www.springframework.org/schema/p"
  3. xmlns:c="http://www.springframework.org/schema/c"
  1. // 引入p命名和c命名空间
  2. // 目录: ./SpringDemo/src/main/resources/
  3. // 文件名: applicationContext9.xml
  4. <?xml version="1.0" encoding="UTF-8"?>
  5. <beans xmlns="http://www.springframework.org/schema/beans"
  6. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  7. xsi:schemaLocation="http://www.springframework.org/schema/beans
  8. https://www.springframework.org/schema/beans/spring-beans.xsd"
  9. xmlns:p="http://www.springframework.org/schema/p"
  10. xmlns:c="http://www.springframework.org/schema/c">
  11. </beans>

0x04.4.2 p命名空间注入

  1. // 第一步
  2. // 创建个B类,给其它类使用
  3. // 在./SpringDemo/src/main/java/com/test/依赖注入/Set方式注入/创建个B.java
  4. // 目录: ./SpringDemo/src/main/java/com/test/依赖注入/Set方式注入/
  5. // 文件名: B.java
  6. package com.test.依赖注入.Set方式注入;
  7. public class B {
  8. private String name;
  9. private Integer age;
  10. public void setName(String name) {
  11. this.name = name;
  12. }
  13. public void setAge(Integer age) {
  14. this.age = age;
  15. }
  16. public void b() {
  17. System.out.println("B中b方法执行了, name=" + name + ",age=" + age);
  18. }
  19. }
  1. // 第二步
  2. // 引用B类的b方法
  3. // 在./SpringDemo/src/main/java/com/test/依赖注入/Set方式注入/创建个A.java
  4. // 目录: ./SpringDemo/src/main/java/com/test/依赖注入/Set方式注入/
  5. // 文件名: A.java
  6. package com.test.依赖注入.Set方式注入;
  7. public class A {
  8. private B b;
  9. private String name;
  10. public void setB(B b) {
  11. this.b = b;
  12. }
  13. public void setName(String name) {
  14. this.name = name;
  15. }
  16. public void a() {
  17. b.b();
  18. System.out.println("A中a方法执行了, name=" + this.name);
  19. }
  20. }
  1. // 第三步
  2. // 目录: ./SpringDemo/src/main/resources/
  3. // 文件名: applicationContext9.xml
  4. <?xml version="1.0" encoding="UTF-8"?>
  5. <beans xmlns="http://www.springframework.org/schema/beans"
  6. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  7. xsi:schemaLocation="http://www.springframework.org/schema/beans
  8. https://www.springframework.org/schema/beans/spring-beans.xsd"
  9. xmlns:p="http://www.springframework.org/schema/p"
  10. xmlns:c="http://www.springframework.org/schema/c">
  11. <!--p命名空间注入,可以直接注入属性的值: 类似property-->
  12. <bean id="a" class="com.test.依赖注入.Set方式注入.A" p:name="李四" p:b-ref="b"/>
  13. <bean id="b" class="com.test.依赖注入.Set方式注入.B">
  14. <property name="name" value="张三"/>
  15. <property name="age" value="22"/>
  16. </bean>
  17. </beans>
  1. // 第四步
  2. // 创建一个测试类Test20进行测试
  3. // 目录: ./SpringDemo/src/test/java/
  4. // 文件名: Test20.java
  5. import com.test.依赖注入.Set方式注入.A;
  6. import org.springframework.context.ApplicationContext;
  7. import org.springframework.context.support.ClassPathXmlApplicationContext;
  8. public class Test20 {
  9. public static void main(String[] args) {
  10. ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext9.xml");
  11. A a = (A) context.getBean("a");
  12. a.a();
  13. }
  14. }
  15. // 运行结果
  16. Bb方法执行了, name=张三,age=22
  17. Aa方法执行了, name=李四

0x04.4.3 c命名空间注入

  1. // 第一步
  2. // 创建个类进行测试
  3. // 在./SpringDemo/src/main/java/com/test/依赖注入/Set方式注入/创建个User4.java
  4. // 目录: ./SpringDemo/src/main/java/com/test/依赖注入/Set方式注入/
  5. // 文件名: User4.java
  6. package com.test.依赖注入.Set方式注入;
  7. public class User4 {
  8. private String name;
  9. private int age;
  10. public User4(String name, int age) {
  11. this.name = name;
  12. this.age = age;
  13. }
  14. public String getName() {
  15. return this.name;
  16. }
  17. public int getAge() {
  18. return this.age;
  19. }
  20. }
  1. // 第二步
  2. // 目录: ./SpringDemo/src/main/resources/
  3. // 文件名: applicationContext9.xml
  4. <?xml version="1.0" encoding="UTF-8"?>
  5. <beans xmlns="http://www.springframework.org/schema/beans"
  6. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  7. xsi:schemaLocation="http://www.springframework.org/schema/beans
  8. https://www.springframework.org/schema/beans/spring-beans.xsd"
  9. xmlns:p="http://www.springframework.org/schema/p"
  10. xmlns:c="http://www.springframework.org/schema/c">
  11. <!--c命名空间注入,通过构造器注入: 类似constructor-arg-->
  12. <bean id="user4-test-2" class="com.test.依赖注入.Set方式注入.User4" c:name="王二狗" c:age="18"/>
  13. </beans>
  1. // 第三步
  2. // 创建一个测试类Test21进行测试
  3. // 目录: ./SpringDemo/src/test/java/
  4. // 文件名: Test21.java
  5. import com.test.依赖注入.Set方式注入.User4;
  6. import org.springframework.context.ApplicationContext;
  7. import org.springframework.context.support.ClassPathXmlApplicationContext;
  8. public class Test21 {
  9. public static void main(String[] args) {
  10. ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext9.xml");
  11. User4 obj = (User4) context.getBean("user4-test-2");
  12. System.out.println(obj.getName());
  13. System.out.println(obj.getAge());
  14. }
  15. }
  16. // 运行结果
  17. 王二狗
  18. 18

0x05 小例子-注解注入

0x05.1 前置操作

  1. // 第四步
  2. // 在Spring的配置文件applicationContext.xml头部,引入context命名空间
  3. // 目录: ./SpringDemo/src/main/resources/
  4. // 文件名: applicationContext10.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. xmlns:context="http://www.springframework.org/schema/context"
  9. xsi:schemaLocation="http://www.springframework.org/schema/beans
  10. https://www.springframework.org/schema/beans/spring-beans.xsd
  11. http://www.springframework.org/schema/context
  12. http://www.springframework.org/schema/context/spring-context-4.2.xsd">
  13. <!--添加Spring自动扫描,范围是com.test.依赖注入.注解注入下所有包及其子包-->
  14. <context:component-scan base-package="com.test.依赖注入.注解注入"></context:component-scan>
  15. </beans>

0x05.2 构造方法注入

  1. // 第一步
  2. // 在./SpringDemo/src/main/java/com/test/依赖注入/注解注入/创建个BTest.java
  3. // 目录: ./SpringDemo/src/main/java/com/test/依赖注入/注解注入/
  4. // 文件名: BTest.java
  5. package com.test.依赖注入.注解注入;
  6. public class BTest {
  7. private String name;
  8. private Integer age;
  9. public BTest(String name, Integer age) {
  10. this.name = name;
  11. this.age = age;
  12. }
  13. public void b() {
  14. System.out.println("BTest类中b()方法执行了,name=" + name + ",age=" + age);
  15. }
  16. }
  1. // 第二步
  2. // 在./SpringDemo/src/main/java/com/test/依赖注入/注解注入/创建个ATest.java
  3. // 目录: ./SpringDemo/src/main/java/com/test/依赖注入/注解注入/
  4. // 文件名: ATest.java
  5. package com.test.依赖注入.注解注入;
  6. public class ATest {
  7. private BTest bTest;
  8. private String name;
  9. public ATest(BTest b, String name) {
  10. this.bTest = b;
  11. this.name = name;
  12. }
  13. public void a() {
  14. bTest.b();
  15. System.out.println("ATest中a()方法执行了, name=" + name);
  16. }
  17. }
  1. // 第三步
  2. // 在./SpringDemo/src/main/java/com/test/依赖注入/注解注入/创建个BeanConfig.java
  3. // 目录: ./SpringDemo/src/main/java/com/test/依赖注入/注解注入/
  4. // 文件名: BeanConfig.java
  5. package com.test.依赖注入.注解注入;
  6. import org.springframework.context.annotation.Bean;
  7. import org.springframework.context.annotation.Configuration;
  8. @Configuration
  9. public class BeanConfig {
  10. @Bean
  11. public BTest b() {
  12. return new BTest("张三", 16);
  13. }
  14. @Bean("aTest")
  15. public ATest a() {
  16. return new ATest(b(), "李四");
  17. }
  18. }
  1. // 第四步
  2. // 创建一个测试类Test22进行测试
  3. // 目录: ./SpringDemo/src/test/java/
  4. // 文件名: Test22.java
  5. import com.test.依赖注入.注解注入.ATest;
  6. import com.test.依赖注入.注解注入.BTest;
  7. import org.springframework.context.ApplicationContext;
  8. import org.springframework.context.support.ClassPathXmlApplicationContext;
  9. public class Test22 {
  10. public static void main(String[] args) {
  11. ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext10.xml");
  12. ATest obj1 = (ATest) context.getBean("aTest");
  13. obj1.a();
  14. System.out.println("-----------------");
  15. BTest obj2 = (BTest) context.getBean("b");
  16. obj2.b();
  17. }
  18. }
  19. // 运行结果
  20. BTest类中b()方法执行了,name=张三,age=16
  21. ATesta()方法执行了, name=李四
  22. -----------------
  23. BTest类中b()方法执行了,name=张三,age=16

0x05.3 setter方法注入

  1. // 第一步
  2. // 在./SpringDemo/src/main/java/com/test/依赖注入/注解注入/创建个DTest.java
  3. // 目录: ./SpringDemo/src/main/java/com/test/依赖注入/注解注入/
  4. // 文件名: DTest.java
  5. package com.test.依赖注入.注解注入;
  6. public class DTest {
  7. private String name;
  8. private Integer age;
  9. public void setName(String name) {
  10. this.name = name;
  11. }
  12. public void setAge(Integer age) {
  13. this.age = age;
  14. }
  15. public void d() {
  16. System.out.println("DTest类中d()方法执行了,name=" + name + ",age=" + age);
  17. }
  18. }
  1. // 第二步
  2. // 在./SpringDemo/src/main/java/com/test/依赖注入/注解注入/创建个CTest.java
  3. // 目录: ./SpringDemo/src/main/java/com/test/依赖注入/注解注入/
  4. // 文件名: CTest.java
  5. package com.test.依赖注入.注解注入;
  6. public class CTest {
  7. private DTest dTest;
  8. private String name;
  9. public void setDTest(DTest dTest) {
  10. this.dTest = dTest;
  11. }
  12. public void setName(String name) {
  13. this.name = name;
  14. }
  15. public void c() {
  16. dTest.d();
  17. System.out.println("CTest类中c()方法执行了, name=" + name);
  18. }
  19. }
  1. // 第三步
  2. // 在./SpringDemo/src/main/java/com/test/依赖注入/注解注入/创建个BeanConfig2.java
  3. // 目录: ./SpringDemo/src/main/java/com/test/依赖注入/注解注入/
  4. // 文件名: BeanConfig2.java
  5. package com.test.依赖注入.注解注入;
  6. import org.springframework.context.annotation.Bean;
  7. import org.springframework.context.annotation.Configuration;
  8. @Configuration
  9. public class BeanConfig2 {
  10. @Bean
  11. public DTest dTest() {
  12. DTest dTest = new DTest();
  13. dTest.setName("王五");
  14. dTest.setAge(28);
  15. return dTest;
  16. }
  17. @Bean
  18. public CTest cTest() {
  19. CTest cTest = new CTest();
  20. //引入的是上面的dTest()方法
  21. cTest.setDTest(dTest());
  22. cTest.setName("陈六");
  23. return cTest;
  24. }
  25. }
  1. // 第四步
  2. // 创建一个测试类Test23进行测试
  3. // 目录: ./SpringDemo/src/test/java/
  4. // 文件名: Test23.java
  5. import com.test.依赖注入.注解注入.CTest;
  6. import com.test.依赖注入.注解注入.DTest;
  7. import org.springframework.context.ApplicationContext;
  8. import org.springframework.context.support.ClassPathXmlApplicationContext;
  9. public class Test23 {
  10. public static void main(String[] args) {
  11. ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext10.xml");
  12. CTest obj1 = (CTest) context.getBean("cTest");
  13. obj1.c();
  14. System.out.println("-----------------");
  15. DTest obj2 = (DTest) context.getBean("dTest");
  16. obj2.d();
  17. }
  18. }
  19. // 运行结果
  20. DTest类中d()方法执行了,name=王五,age=28
  21. CTest类中c()方法执行了, name=陈六
  22. -----------------
  23. DTest类中d()方法执行了,name=王五,age=28