Spring整合web开发

问题:

正常整合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中可能会成功,这个后面再尝试。
原文地址:https://www.cnblogs.com/oneNightStand/p/5984563.html