对于spring中IOC和DI的理解
2018-07-09 本文已影响0人
一路花开_8fab
1. 概述
IOC是一种设计思想,旨在实现调用类和实现类的松耦合,调用类只依赖接口,在编译阶段并不知道具体使用哪个实现类,而是将这个控制权交给第三方容器,在运行时由容器将实例变量(具体的实现类)注入到对象中(调用类)。
DI是具体的实现技术,是指由第三方组件负责将实例变量(实现类)传入到对象(调用类)中去。
2.IOC举例
先看一个非IOC的方式:
public interface Animal {
public void perform();
}
public class Tiger implements Animal {
@Override
public void perform() {
System.out.println("A tiger is performing!");
}
@Override
public String toString() {
return "I'm a tiger";
}
}
public class Zoo {
private Animal animal;
public Zoo() {
this.animal = new Tiger();
}
public void perform(){
animal.perform();
}
@Override
public String toString() {
if (animal == null) {
return null;
}
return animal.toString();
}
}
Zoo在构造函数中自行创建了Tiger的示例,这使得Zoo和Tiger紧密地耦合在了一起,扩展性会很差(比如Zoo需要一个Lion进行表演)。
如果使用IOC的方式,Zoo没有自行创建Animal实例,而是在构造的时候把Animal实例作为构造器参数传入。代码如下:
public class Zoo {
private Animal animal;
// Animal被注入进来
public Zoo(Animal animal) {
this.animal = animal;
}
public void perform(){
animal.perform();
}
@Override
public String toString() {
if (animal == null) {
return null;
}
return animal.toString();
}
}
3.DI的两种方式
3.1构造器注入
构造器注入是在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-3.0.xsd">
<bean id="tiger" class="org.xrq.action.by.Tiger" />
<bean id="zoo" class="org.xrq.action.by.Zoo">
<constructor-arg ref="tiger" />
</bean>
</beans>
3.2 Setter注入
Setter注入是在Bean实例创建完毕之后执行,如下:
public class Zoo {
private Animal animal;
public Animal getAnimal() {
return animal;
}
public void setAnimal(Animal animal) {
this.animal = animal;
}
public void perform(){
animal.perform();
}
@Override
public String toString() {
if (animal == null) {
return null;
}
return animal.toString();
}
}
<?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-3.0.xsd">
<bean id="tiger" class="org.xrq.action.by.Tiger" />
<bean id="zoo" class="org.xrq.action.by.Zoo">
<property name="animal" ref="tiger" />
</bean>
</beans>
3.3 思考
- Spring引入Autowire(自动装配)机制就是为了解决<bean>标签下<property>标签或<constructor-arg>标签过多的问题
- 对于强依赖,可使用构造器注入,对于弱依赖,推荐使用Setter注入
4. 参考文章
http://www.importnew.com/13619.html
http://www.importnew.com/24731.html
https://my.oschina.net/u/3759357/blog/1825620