一、背景
1、Spring整合Javaweb的时候,在Servlet类上,不能使用@Cotroller属性。
因为javaweb项目在Tomcat容器启动的时候会自动加载Servlet对象,此时若加上@Controller,ioc容器一启动,也存在了Servlet对象。而Tomcat中的Servlet对象和IOC容器中的Servlet对象不同,在Tomcat中当然是使用Tomcat创建的Servlet对象。因此目前不能标注Spring注解在servlet层;其他层可以标注
2、既然如此,不在Servlet类中标注@Controller注解,就不能使用IOC容器提供的强大功能,@Autowired也会失效,该怎么解决?
于是乎,在工具类WebUtils中使用静态方法初始化ioc容器,并写一个getBean方法,每次,Servlet要调用IOC容器中的某个对象的话,通过WebUtils的getBean方法即可调,此时就可以享受IOC容器中对象的强大功能(事务控制等等)
3、在需要的Servlet类上调用WebUtils的getBean方法,这样子每次请求过来调用Servlet类,Servlet类会调用WebUtils类,这样子在WebUtils中声明的ioc容器也跟着初始化完成。Servlet类就可以调用ioc容器中强大的对象了。
4、但是这样子处理存在很多问题,每次ioc容器的初始化,并没有销毁,还有多线程等其他各种问题。于是乎,Spring早考虑到这一点,在spring-web包提供了一个ContextLoaderListener来解决这个问题。这个监听器负责ioc容器的初始化销毁各种问题等工作。
<!-- needed for ContextLoaderListener -->
<context-param>
<param-name>contextConfigLocation