一、原始的tomcat+servlet的编码原理
当浏览器向Tomcat监听的端口发送http请求时,Tomcat会调用对应的servlet处理该请求;
在Servlet中通过new对象来生成要用到的业务处理类
public class MyServlet{
//通过new来生成业务处理对象
private MyService myService = new MyServiceImpl();
public void doPost(HttpServletRequest request){
//处理请求
//调用自己的业务逻辑组件,执行业务逻辑
myService.doService();
}
}
存在问题:
对于业务接口MyService和实现类MyServiceImpl
public interface MyService{
}
public class MyServiceImpl implements MyService{
}
假设系统中有几十个地方都需要用到
MyService myService = new MyServiceImpl();
去创建、引用和依赖了MyServiceImpl对象;
如果这个时候我不想用MyServiceImpl了,希望改成用同样继承MyService接口的NewMyServiceImpl实现类,此时就需要在几十个地方都去修改对应的代码;
可能会导致改动代码的成本很大,改动完之后测试的成本也很大,也可能出现一些bug;
归根结底就是因为代码里各种类之间完全耦合在一起,出现任何一点的变动都需要改动大量的代码,重新测试。
二、SpringIOC框架
@Controller
public class MyController{
//通过Resource注解来注入实现类
@Resource
private MyService myService;
public void doPost(HttpServletRequest request){
//处理请求
//调用自己的业务逻辑组件,执行业务逻辑
myService.doService();
}
}
@Service
public class NewMyServiceImpl implements MyService{
}
只要在控制器类上加上@Controller注解,在需要注入的实现类上加上@Service注解,导入SpringIOC需要的依赖,Spring容器就会找到MyService接口对应的实现类NewMyServiceImpl ,并且生成对象实例注入给myService。
SpringIOC机制使得系统的类与类之间彻底的解耦合。