web项目中 集合Spring&使用junit4测试Spring
web项目中 集合Spring
问题:
如果将
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
HelloService helloService = (HelloService) applicationContext.getBean("helloService");
helloService.sayHello();
直接放入Servlet ,造成每次访问都会加载Spring配置文件,都会创建Spring容器环境 (性能问题)
如何确保Spring加载代码 只执行一次??
ServletContextListener , 启动服务器加载Spring环境,只需要将加载容器 保存ServletContext 范围
WebApplicationContext applicationContext = WebApplicationContextUtils.getWebApplicationContext(getServletContext());
HelloService helloService = (HelloService) applicationContext.getBean("helloService");
helloService.sayHello();
1、导入:
<!-- 注册Spring 监听器 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener> <!-- 加载配置文件默认 WEB-INF/applicationContext.xml -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param> <!--配置Servlet-->
<servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>cn.itcast.web.HelloServlet</servlet-class>
</servlet> <servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
3、编写测试代码
HelloService.java
public class HelloService {
public void sayHello(){
System.out.println("hello spring web!!!");
}
}
aaarticlea/png;base64,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" alt="" />
HelloServlet.java
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException { //调用HelloService 每次都会加载 applicationContext.xml文件
// ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
// HelloService helloService = (HelloService) applicationContext.getBean("helloService");
// helloService.sayHello(); // 从ServletContext 范围获得Spring 上下文 // 第一种
// WebApplicationContext applicationContext = (WebApplicationContext)
// getServletContext()
// .getAttribute(
// WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE); // 第二种
WebApplicationContext applicationContext = WebApplicationContextUtils
.getWebApplicationContext(getServletContext()); HelloService helloService = (HelloService) applicationContext
.getBean("helloService");
helloService.sayHello(); } @Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// TODO Auto-generated method stub
super.doPost(req, resp);
}
}
4、applicationContext.xml
<bean id="helloService" class="cn.itcast.service.HelloService"></bean>
5、测试:
http://localhost:8080/spring_web/hello
// 测试Spring
@RunWith(SpringJUnit4ClassRunner.class)
// 集成插件类
@ContextConfiguration(locations = "classpath:applicationContext.xml")
// 加载配置文件
public class SpringTest { @Autowired
private HelloService helloService; @Test
public void demo() {
helloService.sayHello();
} @Test
// 没有使用Spring 测试 插件写法
public void demo1() {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext(
"applicationContext.xml");
HelloService helloService = (HelloService) applicationContext
.getBean("helloService");
helloService.sayHello();
}
}
web项目中 集合Spring&使用junit4测试Spring的更多相关文章
- 06_在web项目中集成Spring
在web项目中集成Spring 一.使用Servlet进行集成测试 1.直接在Servlet 加载Spring 配置文件 ApplicationContext applicationContext = ...
- Java Web学习系列——Maven Web项目中集成使用Spring、MyBatis实现对MySQL的数据访问
本篇内容还是建立在上一篇Java Web学习系列——Maven Web项目中集成使用Spring基础之上,对之前的Maven Web项目进行升级改造,实现对MySQL的数据访问. 添加依赖Jar包 这 ...
- Axis2在Web项目中整合Spring
一.说明: 上一篇说了Axis2与Web项目的整合(详情 :Axis2与Web项目整合)过程,如果说在Web项目中使用了Spring框架,那么又改如何进行Axis2相关的配置操作呢? 二.Axis2 ...
- 在web项目中使用cxf开发webservice,包含spring支持
本文主要介绍了,如何使用cxf内置的例子,学会开发webserivce,在web项目中使用,且包含spring支持. webserivce的开发可以使用cxf或者axis,好像还有httpclient ...
- 在普通WEB项目中使用Spring
Spring是一个对象容器,帮助我们管理项目中的对象,那么在web项目中哪些对象应该交给Spring管理呢? 项目中涉及的对象 我们回顾一下WEB项目中涉及的对象 Servlet Request ...
- Spring学习(四)在Web项目中实例化IOC容器
1.前言 前面我们讲到Spring在普通JAVA项目中的一些使用.本文将介绍在普通的Web项目中如何实例化Spring IOC容器.按照一般的思路.如果在Web中实例化Ioc容器.这不得获取Conte ...
- web项目中加入struts2、spring的支持,并整合两者
Web项目中加入struts2 的支持 在lib下加入strut2的jar包 2. 在web.xml中添加配置 <filter> <filter-name>struts2< ...
- Spring在Web项目中的三种启动加载的配置
在最近的项目中,使用到了spring相关的很多东西,有点把spring的配置给搞混了,从网上查到的资料以及整理了一下. 在Web项目中,启动spring容器的方式有三种,ContextLoaderLi ...
- web项目中获取spring的bean对象
Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架,如何在程序中不通过注解的形式(@Resource.@Autowired)获取Spring配置的bean呢? Bean工厂(c ...
随机推荐
- WebRTC源码分析四:视频模块结构
转自:http://blog.csdn.net/neustar1/article/details/19492113 本文在上篇的基础上介绍WebRTC视频部分的模块结构,以进一步了解其实现框架,只有了 ...
- AngularJS学习笔记二:AngularJS指令
AngularJS 指令: AngularJS 通过被称为 指令 的新属性来扩展 HTML. AngularJS 指令是扩展的 HTML 属性,带有前缀 ng-. 几个常用 指令: ng-app 指令 ...
- 构造 hihocoder 1257 Snake Carpet (15北京I)
题目传送门 题意:贪吃蛇,要求长度奇数的蛇转弯次数为正奇数,长度偶数转弯次数为正偶数,且组成矩形.(北大出的题咋都和矩形相关!!!) 分析:构造找规律,想到就简单了.可以构造 宽:(n + 1) / ...
- 模拟 POJ 2632 Crashing Robots
题目地址:http://poj.org/problem?id=2632 /* 题意:几个机器人按照指示,逐个朝某个(指定)方向的直走,如果走过的路上有机器人则输出谁撞到:如果走出界了,输出谁出界 如果 ...
- BZOJ 1856 字符串(组合)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1856 题意:有n个1和m个0组成的串,使得任意前k个中1的个数不少于0的个数.有多少种这 ...
- SQL SERVER事务处理
SQL SERVER事务处理 一.事务定义: 事务是单个的工作单元.如果某一事务成功,则在该事务中进行的所有数据更改均会提交,成为数据库中的永久组成部分. 如果事务遇到错误且必须取消或回滚,则所有 ...
- tableviewCell折叠状态3
// // LHQDelegateModel.h // 11 - 投资管理 - 李洪强 // // Created by vic fan on 16/4/13. // Copyright © ...
- hdu Pie
这道题是一道二分搜索的题,首先计算出最大的平均体积:mx=V总/f:然后去left=0,right=mx,mid=(left+right)/2进行二分搜索,当所有pi分割出的mid的个数是大于等于f时 ...
- Android Studio 想说爱你不容易
开始使用Android Studio 真是非常痛苦的一段经历,而这一切的根源就在于GFW,俗称“墙” 如果避过墙来安装 AS,其实我已经在另外一篇文章中说明:http://www.cnblogs.co ...
- 新浪微博API开放平台进行程序开发第一步(java)
申请开发者权限步骤: 1.登录sina微博,点击“应用” 2.点击“微博开发平台 我也要做开发者” 3.点击“我的应用”,填写“开发者信息” 4.点击“创建应用”,就是你将要开发的微博应用程序,可以是 ...