IOC是spring核心部分之一,其重要性不言而喻,故对其做深入了解是很有必要的。
IOC深入了解:
想必各位对IOC的概念看到很多遍,这里还是再说明下,IOC,即Inversion Of Control 控制翻转,比较容易理解的解释是:对象间的依赖关系交由容器负责,无需在应用代码中查找定位。其实真正掌握IOC需要提到另外两个概念:依赖注入、依赖查找,同时也是IOC的两种表现方式。
依赖查找随处可见,如:A、B两个类,A类中需要调用B类的方法,常见的方式就是在A类中new一个B类的对象,则由A类自动查找B类对象。还有一个最直接的例子,就是写EJB客户端调用远程服务,由于EJB是基于JNDI进行查找对象,则需要在客户端写一大堆JNDI获取对象的代码。如:
try { java.lang.Object ejbHome = initialContext.lookup( "java:comp/env/com/mycompany/accounting/AccountEJB"); accountHome = (AccountHome)javax.rmi.PortableRemoteObject.narrow(ejbHome, AccountHome.class);} catch (NamingException e) { // Error getting the home interface ... }
可以明显看到这种方式有以下问题:
1、必须依赖JNDI环境,不能在应用服务器环境之外运行,同时不利于做单元测试;
2、代码逻辑复杂,业务逻辑与底层操作混在一起,难以维护;
相比起来,依赖注入是一种更可取的方式,由容器负责依赖查询,组装对象间的依赖关系
依赖注入有两种方式:构造函数注入和Setter方法注入。
构造函数注入:
public class ConstructorInjection {
private Dependency dep;
public ConstructorInjection(Dependency dep) {
this.dep = dep;
}
}
Setter方法注入:
当容器实例化应用对象之后,就会立即调用后者的setter方法,传入合适的参数。
public class SetterInjection {
private Dependency dep;
public void setMyDependency(Dependency dep) {
this.dep = dep;
}
}
依赖注入基本原则:
IOC的好处
1、查找定位操作与应用代码完全无关,大大提高代码的复用度以及可测试性;
2、代码职责更加分明,只需关注业务逻辑实现;
2、不依赖容器API和特殊接口,降低应用代码对轻量级容器的依赖,方便移植;