控制反转:
被调用者的实例创建工作不再由调用者来创建而是由Spring来创建,控制权由应用代码转移到了外部容器,控制权发生了反转,因此称为控制反转。
DI(依赖注入)是实现IoC的一种方法
1.setter
原理 : 在目标对象中,定义需要注入的依赖对象对应的属性和setter方法;
“让ioc容器调用该setter方法”,将ioc容器实例化的依赖对象通过setter注入给目标对象,封装在目标对象的属性
2·构造器
原理 : 为目标对象提供一个构造方法,在构造方法中添加一个依赖对象对应的参数。ioc容器解析时,实例化目标对象时会自动调用构造方法,
ioc只需要为构造器中的参数进行赋值;将ioc实例化的依赖对象作为构造器的参数传入。
接口注入
原理 : 为依赖对象提供一个接口实现,将接口注入给目标对象,实现将接口的实现类注入的效果。比如HttpServletRequest HttpServletResponse接口
注意:这是ioc提供的方式,spring中的ioc技术并没有实现该种注入方式
方法注入
原理 : 在目标对象中定义一个普通的方法,将方法的返回值设置为需要注入的依赖对象类型。
通过ioc容器调用该方法,将其创建的依赖对象作为方法的返回值返回给目标对象。
案例
<?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">
<!-- 通过bean元素声明需要Spring创建的实例。该实例的类型通过class属性指定,
并通过id属性为该实例指定一个名称,以便于访问 -->
<bean id="helloSpring" class="main.hello.HelloSpring">
<!-- property元素用来为实例的属性赋值,此处实际是调用setWho()方法实现赋值操作 -->
<property name="who">
<!-- 此处将字符串“Spring”赋值给who属性 -->
<value>Spring</value>
</property>
</bean>
</beans>
public class HelloSpring {
//定义who属性,该属性的值将通过Spring框架进行设置
private String who = null;
public String getWho() {
return who;
}
public void setWho(String who) {
this.who = who;
}
/**
* 定义打印方法,输出一句完整的问候
*/
public void print(){
System.out.println("Hello,"+this.getWho()+"!");
}
}
@Test
public void test() {
//通过ClassPathXmlApplicationContext实例化Spring的上下文
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
//通过ApplicationContext的getBean()方法,根据id来获取Bean的实例
HelloSpring helloSpring = (HelloSpring) context.getBean("helloSpring");
//执行print()方法
helloSpring.print();
}