Spring IOC
一、当没有Spring IOC机制时
如果要写一套系统,假设使用tomcat作为web服务器,启动后,它就可以去监听一个端口号的http请求,然后可以把请求转交给特定的servlet或者jsp。
如图所示:
当在Servlet中对浏览器发送过来的http请求进行处理时,就有可能出现问题:
public class MyServlet{
private MyService myService = new MyServiceImpl();
public void doPost(HttpServletRequest request){
//调用自己的业务逻辑组件,去执行一些业务逻辑
myService.doService(request);
}
}
显然,当我们要使用Service组件的时候,是通过自己new的方式去new出来的对象。
问题:
如果在系统中,有几十个地方都是直接new出来的对象:
MyService myService = new MyServiceImpl();
即有几十个地方和MyServiceImpl这个类耦合在一起了;如果我现在不想用MyServiceImpl了,需要换成NewServiceManagerImpl时,此时就需要在系统中的几十个地方都去修改MyServiceImpl这个类,替换为NewServiceManagerImpl。
归根结底,就是代码里各种类之间完全耦合在一起了,出现任何一点变动,都需要改动大量的代码,重新测试,可能还会有bug。
二、出现Spring IOC框架之后
IOC机制即控制反转,依赖注入
以前可以通过xml文件来进行配置bean,现在进化到了基于注解来进行自动依赖注入;
比如:
@Controller
public class MyController{
@Resource
private MyService myService;
public void doPost(HttpServletRequest request){
//调用自己的业务逻辑组件,去执行一些业务逻辑
myService.doService(request);
}
}
我们只需要在这个工程里通过maven引入一些spring框架的依赖,ioc功能。tomcat在启动的时候,就直接会启动spring的容器,spring容器会去扫描我们所有的代码,根据注解信息,由容器本身去创建相应的类对象。
如图所示:
三、总结
spring ioc机制:
tomcat启动时先创建一个spring容器,容器根据xml配置,或者你的注解,去实例化你的一些bean对象;
再去对bean对象之间的引用关系,去进行依赖注入。
Spring IOC底层的核心技术是反射,让系统的类与类之间彻底的解耦合。