0x01 什么是依赖注入
依赖注入,是IOC的一个功能,是个通常的概念,它有多种解释
这概念是说你不用创建对象,而只需要描述它如何被创建
你不在代码里直接组装你的组件和服务,而是在配置文件里描述哪些组件需要哪些服务之后一个容器(IOC容器)负责把他们组装起来
0x02 依赖注入的方式
能注入的数据-有三类:1. 基本类型和String2. 其他bean类型(在配置文件中或者注解配置过的bean)3. 复杂类型/集合类型。注入的方式-有三种:1. 构造函数注入2. Set方式注入3. 注解注入
0x03 小例子-xml文件-构造函数注入
0x03.1 描述
顾名思义,就是使用类中的构造函数,给成员变量赋值注: 赋值的操作不是我们自己做的,而是通过配置的方式,让Spring框架来为我们注入优点: 基于构造器注入,会固定依赖注入的顺序不允许我们创建的Bean对象之间存在循环依赖关系,这样Spring能解决循环依赖的问题缺点:使用构造器注入的缺点是当我们构造器需要注入的对象比较多时会显得我们的构造器,冗余,不美观,可读性差,也不易维护
| 标签有如下属性 |
|
| 属性 |
描述 |
| type |
用于指定要注入的数据的数据类型,该数据类型也是构造函数中某个或某些参数的类型 |
| index |
用于指定要注入的数据给构造函数中指定索引位置的参数赋值,索引的位置是从0开始 |
| name |
用于指定给构造函数中指定名称的参数赋值 |
| value |
用于提供基本类型和String类型的数据 |
| ref |
用于指定其他的bean类型数据,它指的就是在Spring的IOC核心容器中出现过的Bean对象 |
0x03.2 默认构造器方式
// 第一步// 在./SpringDemo/src/main/java/com/test/依赖注入/构造函数注入/User.java// 目录: ./SpringDemo/src/main/java/com/test/依赖注入/构造函数注入/// 文件名: User.javapackage com.test.依赖注入.构造函数注入;public class User { private String name; public void setName(String name) { this.name = name; } public String getName() { return name; }}
// 第二步// 在<beans>标签中,中配置userTest1的信息, 设定name的值为“张三”// 这里提供一个配置好的applicationContext6.xml文件// 目录: ./SpringDemo/src/main/resources/// 文件名: applicationContext6.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="userTest1" class="com.test.依赖注入.构造函数注入.User1"> <property name="name" value="张三"/> </bean></beans>
// 第三步// 创建一个测试类Test13进行测试// 目录: ./SpringDemo/src/test/java/// 文件名: Test13.javaimport com.test.依赖注入.构造函数注入.User1;import org.springframework.context.support.AbstractApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class Test13 { public static void main(String[] args) { AbstractApplicationContext context = new ClassPathXmlApplicationContext("applicationContext6.xml"); User1 obj = (User1) context.getBean("userTest1"); System.out.println(obj.getName()); }}// 运行结果张三
0x03.3 有参构造创建对象
0x03.3.1 前置操作
// 在./SpringDemo/src/main/resources/创建个applicationContext6.xml// 目录: ./SpringDemo/src/main/resources/// 文件名: applicationContext6.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"></beans>
// 在./SpringDemo/src/main/java/com/test/依赖注入/构造函数注入/创建个User2.java// 目录: ./SpringDemo/src/main/java/com/test/依赖注入/构造函数注入/// 文件名: User2.javapackage com.test.依赖注入.构造函数注入;public class User2 { private String name; private Integer age; public User2(String name) { this.name = name; } public User2(Integer age) { this.age = age; } public User2(String name, Integer age) { this.name = name; this.age = age; } public String getName() { return this.name; } public Integer getAge() { return this.age; }}
0x03.3.2 有参构造创建对象-下标赋值注入
// 第一步// 目录: ./SpringDemo/src/main/resources/// 文件名: applicationContext6.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="userTest2" class="com.test.依赖注入.构造函数注入.User2"> <constructor-arg index="0" value="李四"/> <constructor-arg index="1" value="11"/> </bean></beans>
// 第二步// 创建一个测试类Test14进行测试// 目录: ./SpringDemo/src/test/java/// 文件名: Test14.javaimport com.test.依赖注入.构造函数注入.User2;import org.springframework.context.support.AbstractApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class Test14 { public static void main(String[] args) { AbstractApplicationContext context = new ClassPathXmlApplicationContext("applicationContext6.xml"); User2 obj = (User2) context.getBean("userTest2"); System.out.println(obj.getName()); System.out.println(obj.getAge()); }}// 运行结果李四11
0x03.3.3 有参构造创建对象-数据类型注入
// 第一步// 目录: ./SpringDemo/src/main/resources/// 文件名: applicationContext6.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="userTest2-2" class="com.test.依赖注入.构造函数注入.User2"> <constructor-arg type="java.lang.Integer" value="15"/> <constructor-arg type="java.lang.String" value="王五"/> </bean></beans>
// 第二步// 创建一个测试类Test15进行测试// 目录: ./SpringDemo/src/test/java/// 文件名: Test15.javaimport com.test.依赖注入.构造函数注入.User2;import org.springframework.context.support.AbstractApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class Test15 { public static void main(String[] args) { AbstractApplicationContext context = new ClassPathXmlApplicationContext("applicationContext6.xml"); User2 obj = (User2) context.getBean("userTest2-2"); System.out.println(obj.getName()); System.out.println(obj.getAge()); }}// 运行结果王五15
0x03.3.4 有参构造创建对象-参数名注入
// 第一步// 目录: ./SpringDemo/src/main/resources/// 文件名: applicationContext6.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="userTest2-3" class="com.test.依赖注入.构造函数注入.User2"> <constructor-arg name="name" value="马六"/> <constructor-arg name="age" value="18"/> </bean></beans>
// 第二步// 创建一个测试类Test16进行测试// 目录: ./SpringDemo/src/test/java/// 文件名: Test16.javaimport com.test.依赖注入.构造函数注入.User2;import org.springframework.context.support.AbstractApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class Test16 { public static void main(String[] args) { AbstractApplicationContext context = new ClassPathXmlApplicationContext("applicationContext6.xml"); User2 obj = (User2) context.getBean("userTest2-3"); System.out.println(obj.getName()); System.out.println(obj.getAge()); }}// 运行结果马六18
0x03.3.5 有参构造创建对象-对象注入
// 第一步// 创建个SpellChecker类,给其它类使用// 目录: ./SpringDemo/src/main/java/com/test/依赖注入/构造函数注入/// 文件名: SpellChecker.javapackage com.test.依赖注入.构造函数注入;public class SpellChecker { public SpellChecker() { System.out.println("SpellChecker内部-无参构造函数"); } public void checkSpelling() { System.out.println("拼写检查"); }}
// 第二步// 创建个TextEditor类,在构造方法中引用SpellChecker类// 目录: ./SpringDemo/src/main/java/com/test/依赖注入/构造函数注入/// 文件名: TextEditor.javapackage com.test.依赖注入.构造函数注入;public class TextEditor { private SpellChecker spellChecker; public TextEditor(SpellChecker spellChecker) { System.out.println("TextEditor内部-有参构造函数"); this.spellChecker = spellChecker; } public void spellCheck() { this.spellChecker.checkSpelling(); }}
// 第三步// 目录: ./SpringDemo/src/main/resources/// 文件名: applicationContext6.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"> <!--textEditor bean的定义--> <bean id="spellCheckerTest" class="com.test.依赖注入.构造函数注入.SpellChecker"/> <!--有参构造创建对象-对象注入,推荐使用--> <bean id="textEditorTest" class="com.test.依赖注入.构造函数注入.TextEditor"> <constructor-arg ref="spellCheckerTest"/> </bean></beans>
// 第四步// 创建一个测试类Test17进行测试// 目录: ./SpringDemo/src/test/java/// 文件名: Test17.javaimport com.test.依赖注入.构造函数注入.TextEditor;import org.springframework.context.support.AbstractApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class Test17 { public static void main(String[] args) { AbstractApplicationContext context = new ClassPathXmlApplicationContext("applicationContext6.xml"); TextEditor te = (TextEditor) context.getBean("textEditorTest"); te.spellCheck(); }}// 运行结果SpellChecker内部-无参构造函数TextEditor内部-有参构造函数拼写检查
0x04 小例子-xml文件-Set方式注入
0x04.1 描述
顾名思义,就是在类中提供需要注入成员的set方法
| 标签有如下属性 |
|
| 属性 |
描述 |
| name |
用于指定注入时所调用的set方法名称 |
| value |
用于提供基本类型和String类型的数据 |
| ref |
用于指定其他的bean类型数据,它指的就是在Spring的IOC核心容器中出现过的Bean对象 |
0x04.2 普通模式
// 第一步// 在./SpringDemo/src/main/java/com/test/依赖注入/Set方式注入/创建个User3.java// 目录: ./SpringDemo/src/main/java/com/test/依赖注入/Set方式注入/// 文件名: User3.javapackage com.test.依赖注入.Set方式注入;public class User3 { private String name; private Integer age; public void setName(String name) { this.name = name; } public String getName() { return this.name; } public void setAge(Integer age) { this.age = age; } public Integer getAge() { return this.age; }}
// 第二步// 目录: ./SpringDemo/src/main/resources/// 文件名: applicationContext7.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="userTest3" class="com.test.依赖注入.Set方式注入.User3"> <property name="name" value="陈七"></property> <property name="age" value="23"></property> </bean></beans>
// 第三步// 创建一个测试类Test18进行测试// 目录: ./SpringDemo/src/test/java/// 文件名: Test18.javaimport com.test.依赖注入.Set方式注入.User3;import org.springframework.context.support.AbstractApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class Test18 { public static void main(String[] args) { AbstractApplicationContext context = new ClassPathXmlApplicationContext("applicationContext7.xml"); User3 obj = (User3) context.getBean("userTest3"); System.out.println(obj.getName()); System.out.println(obj.getAge()); }}// 运行结果陈七23
0x04.3 复杂类型的注入
顾名思义,就是给类中的集合成员传值,它用的也是set方法注入的方式,只不过变量的数据类型都是集合注入的类型有: Stringclass对象String[]List<String>Map<String, String>Set<String>Properties
// 第一步// 在./SpringDemo/src/main/java/com/test/依赖注入/Set方式注入/创建个Person.java// 目录: ./SpringDemo/src/main/java/com/test/依赖注入/Set方式注入/// 文件名: Person.javapackage com.test.依赖注入.Set方式注入;public class Person { private String name; private int age; public void setName(String name) { this.name = name; } public String getName() { return this.name; } public void setAge(Integer age) { this.age = age; } public Integer getAge() { return this.age; } @Override public String toString() { return "Person{" + "name='" + this.name + "', " + "age='" + this.age + "'" + "}"; }}
// 第二步// 在./SpringDemo/src/main/java/com/test/依赖注入/Set方式注入/创建个Student.java// 目录: ./SpringDemo/src/main/java/com/test/依赖注入/Set方式注入/// 文件名: Student.javapackage com.test.依赖注入.Set方式注入;import java.util.*;public class Student { private String name; private Person person; private String[] arr; private List<String> myList; private Map<String, String> myMap; private Set<String> mySet; private String wife; private Properties myPro; public void setName(String name) { this.name = name; } public void setPerson(Person person) { this.person = person; } public void setArr(String[] arr) { this.arr = arr; } public void setMyList(List<String> myList) { this.myList = myList; } public void setMyMap(Map<String, String> myMap) { this.myMap = myMap; } public void setMySet(Set<String> mySet) { this.mySet = mySet; } public void setWife(String wife) { this.wife = wife; } public void setMyPro(Properties myPro) { this.myPro = myPro; } @Override public String toString() { return "Student{" + "name='" + this.name + "', " + "person=" + this.person.toString() + ", " + "arr=" + Arrays.toString(this.arr) + ", " + "myList=" + this.myList + ", " + "myMap=" + this.myMap + ", " + "mySet=" + this.mySet + ", " + "wife='" + this.wife + "', " + "myPro=" + this.myPro + "" + "}"; }}
// 第三步// 目录: ./SpringDemo/src/main/resources/// 文件名: applicationContext8.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="personTest" class="com.test.依赖注入.Set方式注入.Person"> <property name="name" value="马八"/> <property name="age" value="12"/> </bean> <bean id="studentTest" class="com.test.依赖注入.Set方式注入.Student"> <!--普通值注入,value: 具体属性值--> <property name="name" value="何九"/> <!--Bean注入, ref: 对象--> <property name="person" ref="personTest"/> <!--数组注入--> <property name="arr"> <array> <value>AAA</value> <value>BBB</value> <value>CCC</value> </array> </property> <!--List注入--> <property name="myList"> <list> <value>111</value> <value>222</value> <value>333</value> </list> </property> <!--Map注入--> <property name="myMap"> <map> <entry key="ddd" value="dddd"></entry> <entry key="fff" value="ffff"></entry> <entry key="ggg" value="gggg"></entry> </map> </property> <!--Set注入--> <property name="mySet"> <set> <value>111</value> <value>222</value> <value>333</value> </set> </property> <!--null注入--> <property name="wife"> <null/> </property> <!--Properties注入--> <property name="myPro"> <props> <prop key="hhh">hhhh</prop> <prop key="iii">iiii</prop> <prop key="qqq">qqqq</prop> </props> </property> </bean></beans>
// 第四步// 创建一个测试类Test19进行测试// 目录: ./SpringDemo/src/test/java/// 文件名: Test19.javaimport com.test.依赖注入.Set方式注入.Student;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class Test19 { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext8.xml"); Student student = (Student) context.getBean("studentTest"); System.out.println(student.toString()); }}// 运行结果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 前置操作
注意: p命名和c命名空间不能直接使用, 需要导入xml约束xmlns:p="http://www.springframework.org/schema/p"xmlns:c="http://www.springframework.org/schema/c"
// 引入p命名和c命名空间// 目录: ./SpringDemo/src/main/resources/// 文件名: applicationContext9.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" xmlns:p="http://www.springframework.org/schema/p" xmlns:c="http://www.springframework.org/schema/c"></beans>
0x04.4.2 p命名空间注入
// 第一步// 创建个B类,给其它类使用// 在./SpringDemo/src/main/java/com/test/依赖注入/Set方式注入/创建个B.java// 目录: ./SpringDemo/src/main/java/com/test/依赖注入/Set方式注入/// 文件名: B.javapackage com.test.依赖注入.Set方式注入;public class B { private String name; private Integer age; public void setName(String name) { this.name = name; } public void setAge(Integer age) { this.age = age; } public void b() { System.out.println("B中b方法执行了, name=" + name + ",age=" + age); }}
// 第二步// 引用B类的b方法// 在./SpringDemo/src/main/java/com/test/依赖注入/Set方式注入/创建个A.java// 目录: ./SpringDemo/src/main/java/com/test/依赖注入/Set方式注入/// 文件名: A.javapackage com.test.依赖注入.Set方式注入;public class A { private B b; private String name; public void setB(B b) { this.b = b; } public void setName(String name) { this.name = name; } public void a() { b.b(); System.out.println("A中a方法执行了, name=" + this.name); }}
// 第三步// 目录: ./SpringDemo/src/main/resources/// 文件名: applicationContext9.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" xmlns:p="http://www.springframework.org/schema/p" xmlns:c="http://www.springframework.org/schema/c"> <!--p命名空间注入,可以直接注入属性的值: 类似property--> <bean id="a" class="com.test.依赖注入.Set方式注入.A" p:name="李四" p:b-ref="b"/> <bean id="b" class="com.test.依赖注入.Set方式注入.B"> <property name="name" value="张三"/> <property name="age" value="22"/> </bean></beans>
// 第四步// 创建一个测试类Test20进行测试// 目录: ./SpringDemo/src/test/java/// 文件名: Test20.javaimport com.test.依赖注入.Set方式注入.A;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class Test20 { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext9.xml"); A a = (A) context.getBean("a"); a.a(); }}// 运行结果B中b方法执行了, name=张三,age=22A中a方法执行了, name=李四
0x04.4.3 c命名空间注入
// 第一步// 创建个类进行测试// 在./SpringDemo/src/main/java/com/test/依赖注入/Set方式注入/创建个User4.java// 目录: ./SpringDemo/src/main/java/com/test/依赖注入/Set方式注入/// 文件名: User4.javapackage com.test.依赖注入.Set方式注入;public class User4 { private String name; private int age; public User4(String name, int age) { this.name = name; this.age = age; } public String getName() { return this.name; } public int getAge() { return this.age; }}
// 第二步// 目录: ./SpringDemo/src/main/resources/// 文件名: applicationContext9.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" xmlns:p="http://www.springframework.org/schema/p" xmlns:c="http://www.springframework.org/schema/c"> <!--c命名空间注入,通过构造器注入: 类似constructor-arg--> <bean id="user4-test-2" class="com.test.依赖注入.Set方式注入.User4" c:name="王二狗" c:age="18"/></beans>
// 第三步// 创建一个测试类Test21进行测试// 目录: ./SpringDemo/src/test/java/// 文件名: Test21.javaimport com.test.依赖注入.Set方式注入.User4;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class Test21 { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext9.xml"); User4 obj = (User4) context.getBean("user4-test-2"); System.out.println(obj.getName()); System.out.println(obj.getAge()); }}// 运行结果王二狗18
0x05 小例子-注解注入
0x05.1 前置操作
// 第四步// 在Spring的配置文件applicationContext.xml头部,引入context命名空间// 目录: ./SpringDemo/src/main/resources/// 文件名: applicationContext10.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" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd"> <!--添加Spring自动扫描,范围是com.test.依赖注入.注解注入下所有包及其子包--> <context:component-scan base-package="com.test.依赖注入.注解注入"></context:component-scan></beans>
0x05.2 构造方法注入
// 第一步// 在./SpringDemo/src/main/java/com/test/依赖注入/注解注入/创建个BTest.java// 目录: ./SpringDemo/src/main/java/com/test/依赖注入/注解注入/// 文件名: BTest.javapackage com.test.依赖注入.注解注入;public class BTest { private String name; private Integer age; public BTest(String name, Integer age) { this.name = name; this.age = age; } public void b() { System.out.println("BTest类中b()方法执行了,name=" + name + ",age=" + age); }}
// 第二步// 在./SpringDemo/src/main/java/com/test/依赖注入/注解注入/创建个ATest.java// 目录: ./SpringDemo/src/main/java/com/test/依赖注入/注解注入/// 文件名: ATest.javapackage com.test.依赖注入.注解注入;public class ATest { private BTest bTest; private String name; public ATest(BTest b, String name) { this.bTest = b; this.name = name; } public void a() { bTest.b(); System.out.println("ATest中a()方法执行了, name=" + name); }}
// 第三步// 在./SpringDemo/src/main/java/com/test/依赖注入/注解注入/创建个BeanConfig.java// 目录: ./SpringDemo/src/main/java/com/test/依赖注入/注解注入/// 文件名: BeanConfig.javapackage com.test.依赖注入.注解注入;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;@Configurationpublic class BeanConfig { @Bean public BTest b() { return new BTest("张三", 16); } @Bean("aTest") public ATest a() { return new ATest(b(), "李四"); }}
// 第四步// 创建一个测试类Test22进行测试// 目录: ./SpringDemo/src/test/java/// 文件名: Test22.javaimport com.test.依赖注入.注解注入.ATest;import com.test.依赖注入.注解注入.BTest;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class Test22 { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext10.xml"); ATest obj1 = (ATest) context.getBean("aTest"); obj1.a(); System.out.println("-----------------"); BTest obj2 = (BTest) context.getBean("b"); obj2.b(); }}// 运行结果BTest类中b()方法执行了,name=张三,age=16ATest中a()方法执行了, name=李四-----------------BTest类中b()方法执行了,name=张三,age=16
0x05.3 setter方法注入
// 第一步// 在./SpringDemo/src/main/java/com/test/依赖注入/注解注入/创建个DTest.java// 目录: ./SpringDemo/src/main/java/com/test/依赖注入/注解注入/// 文件名: DTest.javapackage com.test.依赖注入.注解注入;public class DTest { private String name; private Integer age; public void setName(String name) { this.name = name; } public void setAge(Integer age) { this.age = age; } public void d() { System.out.println("DTest类中d()方法执行了,name=" + name + ",age=" + age); }}
// 第二步// 在./SpringDemo/src/main/java/com/test/依赖注入/注解注入/创建个CTest.java// 目录: ./SpringDemo/src/main/java/com/test/依赖注入/注解注入/// 文件名: CTest.javapackage com.test.依赖注入.注解注入;public class CTest { private DTest dTest; private String name; public void setDTest(DTest dTest) { this.dTest = dTest; } public void setName(String name) { this.name = name; } public void c() { dTest.d(); System.out.println("CTest类中c()方法执行了, name=" + name); }}
// 第三步// 在./SpringDemo/src/main/java/com/test/依赖注入/注解注入/创建个BeanConfig2.java// 目录: ./SpringDemo/src/main/java/com/test/依赖注入/注解注入/// 文件名: BeanConfig2.javapackage com.test.依赖注入.注解注入;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;@Configurationpublic class BeanConfig2 { @Bean public DTest dTest() { DTest dTest = new DTest(); dTest.setName("王五"); dTest.setAge(28); return dTest; } @Bean public CTest cTest() { CTest cTest = new CTest(); //引入的是上面的dTest()方法 cTest.setDTest(dTest()); cTest.setName("陈六"); return cTest; }}
// 第四步// 创建一个测试类Test23进行测试// 目录: ./SpringDemo/src/test/java/// 文件名: Test23.javaimport com.test.依赖注入.注解注入.CTest;import com.test.依赖注入.注解注入.DTest;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class Test23 { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext10.xml"); CTest obj1 = (CTest) context.getBean("cTest"); obj1.c(); System.out.println("-----------------"); DTest obj2 = (DTest) context.getBean("dTest"); obj2.d(); }}// 运行结果DTest类中d()方法执行了,name=王五,age=28CTest类中c()方法执行了, name=陈六-----------------DTest类中d()方法执行了,name=王五,age=28