天天看点

spring的ioc原理简介

之前也简单使用过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做任何修改,就可以正常运行了。