框架:Spring IoC
Spring篇
第二章、Spring IoC简介
一、基本概念
控制反转是一个比较抽象的概念,是Spring框架的核心,用来消减计算机程序的耦合问题。
依赖注入是IoC的另外一种说法,只是从不同的角度描述相同的概念。
二、控制反转和依赖注入
- 控制反转:当Spring框架出现后,对象的实例(汽车)不再由调用者(我)来创建,而是由Spring容器(汽车店)来创建。Spring容器负责控制程序之间的关系(汽车店控制我和汽车零件的关系),而不是由调用者的程序代码直接控制。这样,控制权由调用者转移到Spring容器,控制权发生了反转,这就是Spring的控制反转。
- 依赖注入:从Spring容器角度上看,Spring容器负责将被依赖对象赋值给调用者的成员变量,相当于为调用者注入它所依赖的实例,这就是Spring的依赖注入。
【附】:依赖注入采用的Java 的反射机制
三、代码操作
1、布局
2、构造方法注入
2.1、接口
- 在包dao中添加接口TestDao
package dao; public interface TestDao { public void sayHello(); }
- 在包server中添加接口TestDIService
package server; public interface TestDIService { public void sayHello(); }
2.2、接口实现类
- 在包dao中添加接口实现类TestDaoImpl
package dao; /** * 接口实现类 * lin * 2018/11/22 */ public class TestDaoImpl implements TestDao { @Override public void sayHello() { System.out.println("TestDiDaoSay:“Spring,Make persistent efforts!”"); } }
- 在包server中添加接实现类TestDIServiceImpl
package server; import dao.TestDao; public class TestDIServiceImpl implements TestDIService { private TestDao testDao; //构造方法,用于实现依赖注入接口对象testDiDao public TestDIServiceImpl(TestDao testDao){ super(); this.testDao=testDao; } @Override public void sayHello() { //调用testDIDao中的sayHello方法 testDao.sayHello(); System.out.println("TestDIService构造方法注入say:Study Hard!"); } }
2.3、配置文件
添加配置文件applicationContext.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 http://www.springframework.org/schema/beans/spring-beans.xsd"> <!--将指定类TextDaoImpl配置给Spring,让Spring创建其实例--> <bean id="test" class="dao.TestDaoImpl"/> <!--使用构造方法注入--> <bean id="testDIService" class="server.TestDIServiceImpl"> <!--将myTestDIDao注入到TestDIServiceImpl类的属性testDIDao--> <constructor-arg index="0" ref="test"/> <!--constructor-arg:用于定义类的构造方法的参数--> <!--index:定义参数的位置--> <!--ref:某一个实例的引用--> </bean> </beans>
2.4、测试类
在包test添加测试类TestDI
package test; import dao.TestDao; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import server.TestDIService; public class Test { public static void main(String[] args) { //初始化Spring容器ApplicationContest,加载配置文件 ApplicationContext appCon=new ClassPathXmlApplicationContext("applicationContext.xml"); //通过容器获取test实例 TestDIService testDIService=(TestDIService)appCon.getBean("testDIService"); testDIService.sayHello(); } }
3、使用属性setter方法注入
3.1、接口实现类
在包server中添加TestDIServiceImpl_setter类
package server; import dao.TestDao; import dao.TestDaoImpl; public class TestDIServiceImpl_setter implements TestDIService { private TestDao testDao; //添加testDIDao属性的setter方法,用于实现依赖注入o public void setTestDIDao(TestDao testDIDao) { this.testDao=testDIDao; } @Override public void sayHello() { //调用testDIDao中的sayHello方法 testDao.sayHello(); System.out.println("setter方法注入say:Study Hard!"); } }
3.2、配置文件
在原有的配置文件applicationContext.xml中添加bean属性
<bean id="testDIServicel" class="server.TestDIServiceImpl_setter"> <!--调用TestDIServiceImpl_setter中的setter方法,将myTestDIDao注入到TestDIServiceImpl_setter类的testDIDao上--> <property name="testDIDao" ref="test"/> </bean>
总:
<?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 http://www.springframework.org/schema/beans/spring-beans.xsd"> <!--将指定类TextDaoImpl配置给Spring,让Spring创建其实例--> <bean id="test" class="dao.TestDaoImpl"/> <!--使用构造方法注入--> <bean id="testDIService" class="server.TestDIServiceImpl"> <!--将myTestDIDao注入到TestDIServiceImpl类的属性testDIDao--> <constructor-arg index="0" ref="test"/> <!--constructor-arg:用于定义类的构造方法的参数--> <!--index:定义参数的位置--> <!--ref:某一个实例的引用--> </bean> <!--使用setter方法注入--> <bean id="testDIServicel" class="server.TestDIServiceImpl_setter"> <!--调用TestDIServiceImpl_setter中的setter方法,将myTestDIDao注入到TestDIServiceImpl_setter类的testDIDao上--> <property name="testDIDao" ref="test"/> </bean> </beans>
3.3、测试类
在test中插入代码
//通过容器获取testDIService实例,测试setter方法注入 TestDIService testDIService1=(TestDIService)appCon.getBean("testDIServicel"); testDIService1.sayHello();
总
package test; import dao.TestDao; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import server.TestDIService; public class Test { public static void main(String[] args) { //初始化Spring容器ApplicationContest,加载配置文件 ApplicationContext appCon=new ClassPathXmlApplicationContext("applicationContext.xml"); //通过容器获取test实例 TestDIService testDIService=(TestDIService)appCon.getBean("testDIService"); testDIService.sayHello(); //通过容器获取testDIService实例,测试setter方法注入 TestDIService testDIService1=(TestDIService)appCon.getBean("testDIServicel"); testDIService1.sayHello(); } }