spring整合servlet
在servlet里面创建工厂,获取实列对象
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
studentService = (StudentService) ac.getBean("studentService");
用上面这种方式整合出现的问题:
每次请求servlet是单列的,要使用Spring容器中的bean,创建容器对象,容器对象每次请求都会创建,性能差
解决方式:
只要服务器一启动,就立即创建工厂,配置监听器,将工厂存储在servletContext中,这是最大作用域,全局只有一个对象。ContextLoaderListener的作用就是在启动web容器的时候,自动装配ApplicationContext的配置信息,ContextLoaderListener实现了ServletContextListener这个接口,启动web容器的时候,就会默认执行它实现的方法。
在web.xml中配置监听器,并配置spring配置文件的路径
<!-- 监听器,只要服务器启动,也就是servletContext创建了,就执行监听器里的方法,然后解析XML文件,完成工厂的创建 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- 指定Spring的xml配置文件的路径 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
通过工具类获取创建好的工厂
ApplicationContext ac = (ApplicationContext) this.getServletContext().getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);
// 获取studentService对象
studentService = (StudentService) ac.getBean("studentService");
Student student = new Student(sname,sage,ssex,cid);
//执行添加学生方法
studentService.addStudent(student);