有参构造函数注入底层源码深入剖析前戏
方式一:
创建两个类:
public class TestDIBean {public String say() {return "I am TestDIBean.say()";}
}
package com.coding.spring.practies;public class TestDIBean1 {private TestDIBean testDIBean;public TestDIBean1(TestDIBean testDIBean) {this.testDIBean = testDIBean;}public void print(){System.out.println(this.getClass() + "---->>" +testDIBean.say());}
}
编写spring.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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttps://www.springframework.org/schema/context/spring-context.xsd"><bean id="testDIBean" class="com.coding.spring.practies.TestDIBean"/><bean id="testDIBean1" class="com.coding.spring.practies.TestDIBean1"><!--一定要进行添加,否则注入不进去--><constructor-arg ref="testDIBean"></constructor-arg></bean></beans>
编写测试类:
@Testpublic void obtainBeanByPureAnnotation(){ApplicationContext context = new ClassPathXmlApplicationContext("spring-practies.xml");TestDIBean1 testDIBean1 = (TestDIBean1)context.getBean("testDIBean1");testDIBean1.print();}// output:class com.coding.spring.practies.TestDIBean1---->>I am TestDIBean.say()
方式二:
准备两个类:
package com.coding.spring.practies;import org.springframework.stereotype.Component;@Component
public class TestDIAutoScanBean {public String say() {return "I am TestDIAutoScanBean.say()";}
}
package com.coding.spring.practies;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;@Component
public class TestDIAutoScanBean1 {private TestDIAutoScanBean testDIAutoScanBean;@Autowiredpublic TestDIAutoScanBean1(TestDIAutoScanBean testDIAutoScanBean) {this.testDIAutoScanBean = testDIAutoScanBean;}public void print(){System.out.println(this.getClass() + "---->>" + testDIAutoScanBean.say());}
}
编写测试类:
@Testpublic void obtainBeanByPureAnnotation2(){ApplicationContext context = new AnnotationConfigApplicationContext("com.coding.spring.practies");TestDIAutoScanBean1 testDIAutoScanBean1 = (TestDIAutoScanBean1)context.getBean("testDIAutoScanBean1");testDIAutoScanBean1.print();}
output: class com.coding.spring.practies.TestDIAutoScanBean1---->>I am TestDIAutoScanBean.say()
方式三:
在方式二的基础上进行改进
package com.coding.spring.practies;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;@Component
public class TestDIAutoScanBean1 {private TestDIAutoScanBean testDIAutoScanBean;// 将@Autowired注解注释掉也是能狗进行正常注入的,运行结果不受影响
// @Autowiredpublic TestDIAutoScanBean1(TestDIAutoScanBean testDIAutoScanBean) {this.testDIAutoScanBean = testDIAutoScanBean;}public void print(){System.out.println(this.getClass() + "---->>" + testDIAutoScanBean.say());}
}