之前也简单使用过spring,也知道spring的两大核心aop和ioc,但对其实现原理却并不清楚,今天在一个讲解spring的视频上学到了ioc的原理,讲的很好,思路很清晰,在此记录一下。
在JavaEE中,经常有这样的情况,在一个Servlet中调用一个Service类中的方法:
public class UserService(){
pubilc void add(){
//do something
}
}
public class Servlet(){
UserService userService=new UserService();
userService.add();
}
如果改动UserService类(比如类改名),那么需要的Servlet中修改所有对应的类名。
大家都知道,软件设计的理想情况是低耦合,最好是一个类做了改动之后,其他与之相关联的类不需要修改或者只要做少量修改就能正常工作,以上这种写法显然是不符合这种原则的。
spring使用以下几种技术/模式组合实现了ioc:
1、xml文件,
2、工厂模式,
3、dom4j(用来解析xml),
4、反射机制
对照上面的代码,看看spring的ioc如何实现Servlet调用Service中的方法
`
1、在xml文件中配置bean
<bean id="userService" class="com.test.UserService">`
2、写一个工厂类
public class Factory{
public static UserService getUserService(){
3、使用dom4j解析上一步中userService的全类名
//String className="com.test.UserService";
4、使用反射机制创建UserService对象并返回
return Class.forName(className).newInstance();
}
}
//UserService还是这样写
public class UserService(){
public void add(){
//do something
}
}
//Servlet中使用工厂方法获取Service对象,然后调用方法即可
public class Servlet{
Factory.getUserService().add();
}
可以看到,spring的ioc在使用了工厂模式,xml,dom4j及反射机制后,使得UserService和Servlet之间的耦合度大大降低了,如果此时修改UserService的类名,只需要修改xml文件中的class属性值,而无需对Servlet做任何修改,就可以正常运行了。