问题:
正常整合Servlet和Spring没有问题的,但是每次执行Servlet的时候加载Spring配置,加载Spring环境.这样会太麻烦了。
解决办法:
- 在Servlet的init方法中加载Spring配置文件?
- 当前这个Servlet可以使用,但是其他的Servlet的用不了了!!!
- 将加载的信息内容放到ServletContext中.ServletContext对象时全局的对象.服务器启动的时候创建的.在创建ServletContext的时候就加载Spring的环境.
- ServletContextListener:用于监听ServletContext对象的创建和销毁的.
步骤:
- 导入;spring-web-3.2.0.RELEASE.jar
- 在web.xml中配置:
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
修改程序的代码:
WebApplicationContext applicationContext = WebApplicationContextUtils.getWebApplicationContext(getServletContext());
WebApplicationContext applicationContext = (WebApplicationContext) getServletContext().getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);
上述两种方式都是获得WebApplicationContext的方式,然后通过他就可以取到bean了。
注意:
- 在spring的自动注入中普通的POJO类(不是servlet程序)都可以使用@Autowired进行自动注入,但是除了两类:Filter和Servlet无法使用自动注入属性。(因为这两个归tomcat容器管理)可以用init(集承自HttpServlet后重写init方法)方法中实例化对象,所以通用的办法,像上面做鞋的方法,这种也就是在servlet中是这样的而情况
- 也就是说servlet是tomcat容器管理,而这个spring配置文件中的对象都是在该项目的ApplicationContext中所以是取不到这个bean的,虽然在程序加载的时候已经把bean产生了,但是还是取不到的,所以servlet取bean的方式通常都是通过ApplicationContext来取得。
- Spring和Web应用的整合这是在web应用启动的时候通过一个监听器去启动了XmlWebApplicationContext Spring容器,并将这个容器实例放入到ServletContext的Map里,Map里以WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE,对于的字符串也就是WebApplicationContext.class.getName() + ".ROOT";也就是"org.springframework.web.context.WebApplicationContext.ROOT",在Servlet环境下可以通过这个来访问Spring容器,同样Spring中当然也可以访问ServletContext。
- 而springmvc中可能会成功,这个后面再尝试。