Spring实现的两个核心技术
1) Spring简介
Spring是一个全方位的应用程序开发框架(framework),是潜在的一站式解决方案,它定位于与典型应用相关的大部分基础结构。自从2003年发布以来,Spring
Framework已经对Java企业应用体系产生了前所未有的冲击,尽管历史不长,但它拥有深厚的历史根基。如今Spring已风靡全球,甚至有取代EJB的趋势,最新的EJB3.0规范也吸取了Spring的设计理念,如今这陈风也刮到了华为公司,越来越多的项目正在使用或准备使用Spring架构开发,所以有关Spring架构下的单元测试如何做是我们必须面对的问题。简单说来,Spring有以下特性:
u 轻量级
相对于一些重量级的EJB容器,Spring的核心包在文件容量上只有不到1MB的大小,而使用Spring核心包所需要的资源负担也是很小的。
u 非侵入性
就是说你的开发对Spring的依赖很小,只需要较少的Spring API调用,甚至你的对象完全感知不到Spring容器的存在,提高了对象在不同容器环境下移植的可能性。
u 完全开放性
Spring并不排斥已有的软件结构,如Struts、EJB、Hibernate等,能够将已有系统很好地集成进Spring。
2) Spring实现的两个核心技术
u IoC—Inversion of Control
中文翻译为控制反转,在Spring里的实现是Dependency Injection(依赖注入),就是说对象之间的依赖关系在后期通过配置文件(典型为XML文件)生成,
Spring里实现了两种注入方式:构造函数注入、Setter方法注入。我们可以这样理解这种技术带来的好处,前期我们只需要关注单个对象(组件)的功能实现,具体的业务实现是通过后期配置出来的,不同的配置可以产生不同的业务功能。
u AOP—Aspect-oriented programming
面向方面的编程,但我觉得翻译为面向切面的编程更容易理解一些。AOP大大降低了对象之间的耦合程度,与IoC一样,能够通过后期的配置动态为对象增加新的特性,甚至能够为对象动态增加方法。在Spring下,AOP的实现不需要借助专门的AOP定义语言,只需要普通的Java对象和XML配置文件即可。
3) Spring提供的单元测试支持
首先要说明的是,在Spring里将单元测试的对象理解为一个孤立的单元,单元依赖的对象用桩取代。但考虑到业软的开发现状,如果对象功能逻辑简单,我们将多个对象的组合作为一个被测单元(在Spring里理解为集成测试),典型的情况如对访问数据库代码的测试。
Spring架构带来的直接好处是对象之间的松耦合,减少了对象之间的依赖,这为我们做单元测试提供了便利,另外Spring基于JUnit提供了单元测试支持,实现包为spring-mock.jar。Spring基于Junit的TestCase类实现了两个子类:AbstractDependencyInjectionSpringContextTests、AbstractTransactionalSpringContextTests。下面我们分别讲解这两个类的使用。
u AbstractDependencyInjectionSpringContextTests
AbstractDependencyInjectionSpringContextTests
继承自JUnit的TestCase,所以写测试用例的方法与以前相同。Spring下的对象之间的关系是通过XML配置文件生成的,在运行时根据XML中的配置生成对象及对象之间的关系,形成Spring上下文件环境(Application
Context),做单元测试时也一样,我们基于类AbstractDependencyInjectionSpringContextTests生成测试用例时需要实现方法getConfigLocations,告诉Spring你的XML配置文件在哪儿,如下所示:
@Override
protected String[] getConfigLocations()
{
returnnew String[]{"file:D:/workspace321/example/beans-config.xml"};
}
在每个用例运行前都生成一次Spring上下文势必会影响性能,Spring在不同的用例执行间提供Spring上下文缓存功能。另外基类提供protected的applicationContext对象,方便你访问上下文环境,如get一个Bean等。
另外,对于被测的对象可以通过依赖注入,不需要你在测试代码中显式创建,如下例所示:
publicclass UserDaoTest2
extends AbstractDependencyInjectionSpringContextTests
{
// 这个实例将被(自动的)依赖注入
private UserDao
userDao;
// 依赖注入的Setter方法
publicvoid setUserDao(UserDao userDao)
{
this.userDao = userDao;
}
publicvoid testInsert()
{
User user = new User();
user.setId(1);
user.setName("tzs");
user.setAge(32);
userDao.insert(user);
}
@Override
protected String[]
getConfigLocations()
{
returnnew String[] {
"file:D:/workspace321/example/beans-config.xml" };
}
}
在beans-config.xml文件中需要定义你的被测对象:
<bean
id="userDao"
class="spring.UserDao">
<property name="dataSource">
<ref bean="dataSource"/>
</property>
</bean>
Spring根据类型匹配原则(类型是UserDao)自动将userDao对象注入到测试用例对象中。
u AbstractTransactionalSpringContextTests
AbstractTransactionalSpringContextTests继承自AbstractDependencyInjectionSpringContextTests,提供事务支持功能,主要用于我们针对访问数据库代码的测试,它的最大特点是在每一个用例执行前开始一下事务,在用例执行结束后对事务回滚,也就是说用例执行期间对数据库的操作在执行结束后回退到最初的状态,用例之间的数据库环境互不影响。前面的代码基类换成AbstractTransactionalSpringContextTests,其它什么都不变,即可实现事务支持。
4) Spring如何与DBUnit结合
由于Java不可以同时继承自两个基类,所以我们的用例类不可能同时继承自DBTestCase和AbstractTransactionalSpringContextTests,但我们在“DBUnit数据库测试工具”一节最后提到也可以不需要继承自DBTestCase也能完成数据库的测试,所以为使用DBUnit功能,我们在Spring中也采用此种方式。但要注意的是为了能将DBUnit对数据库的操作纳入Spring的事务支持,不能直接从dataSource获得connection,而要通过DataSourceUtils提供的静态方法间接地获取,最后要记得将connection释放。请参见以下的例子:
publicclass UserDaoTest3
extends AbstractTransactionalSpringContextTests
{
private UserDao
userDao;
publicvoid setUserDao(UserDao userDao)
{
this.userDao = userDao;
}
publicvoid testInsert()
throws Exception
{
Connection jdbcConnection = null;
DataSource dataSource = (DataSource)applicationContext.getBean("dataSource");
//获得connection对象
jdbcConnection = DataSourceUtils.getConnection(dataSource);
IDatabaseConnection connection =
new DatabaseConnection(jdbcConnection,"TZS21911");
//以下代码用于执行前的数据库初始化
IDataSet dataSet =
new FlatXmlDataSet(new FileInputStream(
"dataset.xml"));
DatabaseOperation.CLEAN_INSERT.execute(connection, dataSet);
//以下代码执行具体的测试
User user = new User();
user.setId(5);
user.setName("tzs");
user.setAge(35);
userDao.insert(user);
//以下代码用于执行后的数据库验证
IDataSet databaseDataSet = connection.createDataSet();
ITable actualTable = databaseDataSet.getTable("users");
IDataSet expectedDataSet =
new FlatXmlDataSet(new File(
"expectedDatasetInsert.xml"));
ITable expectedTable = expectedDataSet.getTable("USERS");
Assertion.assertEquals(expectedTable, actualTable);
//记得要释放connection
DataSourceUtils.releaseConnection(jdbcConnection, dataSource);
}
@Override
protected String[] getConfigLocations()
{
returnnewString[] {
"file:D:/workspace321/example/beans-config.xml" };
}
}
通过以上将Spring与DBUnit的结合,我们既能实现用例执行前的数据库初始化以及执行后的数据库验证,也能避免用例执行中对数据库环境的影响,做到用例间数据库环境互不影响。
分享到:
相关推荐
Spring的核心技术主要包括依赖注入(Dependency Injection,DI)、面向切面编程(Aspect-Oriented Programming,AOP)、容器和服务、数据访问以及事务管理等方面。 1. **依赖注入(DI)**:Spring框架的核心特性之...
本文将深入探讨Spring的核心技术——IoC(Inversion of Control,控制反转)和AOP(Aspect Oriented Programming,面向切面编程),以及它们在Spring框架中的实现与应用。 **1. IoC(控制反转)技术** IoC是Spring...
在给定的压缩包文件中,我们有两个关键的JAR文件:`commons-logging-1.0.4.jar`和`spring.jar`,它们都是Spring框架的核心组件。 首先,`commons-logging-1.0.4.jar`是Apache Commons Logging库的一个版本。这个库...
5. **Spring的Bean工厂与应用上下文**:Bean工厂和应用上下文是Spring容器的两个主要实现,它们负责管理Bean的实例化、配置和依赖注入。理解这两者之间的区别和应用场景是深入理解Spring的基础。 6. **数据访问集成...
在Spring 4.2.4版本中,我们关注的核心组件主要分为四个基础包和两个日志包。这些包构成了Spring框架的基础架构,使得开发者能够构建可扩展、松耦合的Java应用。以下是关于这些核心包及其功能的详细解释: 1. **...
【尚硅谷2018最新SpringBoot 上下 核心技术和整合,SpringCloud教学视频】是一套全面且深入的Java开发教程,旨在帮助开发者掌握Spring Boot和Spring Cloud这两个热门的微服务框架。教程分为三个部分,分别是Spring ...
6. **spring-web.jar** 和 **spring-webmvc.jar**:这两个包是针对Web开发的,前者提供了HTTP请求处理的基础支持,后者则是Spring MVC的实现,提供了模型-视图-控制器的设计模式,用于构建Web应用的后端控制器。...
同时,Spring5还提供了两个日志包,以实现更高效和精细的日志管理。接下来,我们将详细探讨这些核心包和日志包的功能及重要性。 1. **Spring Core Container**: 这是Spring框架的基础,主要包括`Core`和`Context`两...
Spring AOP基于两种代理机制实现:JDK动态代理和CGLIB代理。JDK动态代理适用于实现了接口的目标对象,通过反射机制创建一个代理类来拦截方法调用。而CGLIB是在运行时动态生成一个目标类的子类,从而实现对方法的...
Spring AOP基于代理模型来实现,支持两种类型的代理:JDK动态代理和CGLIB代理。 ### Spring MVC与Web开发 Spring框架提供了Spring MVC模块来支持Web应用开发。Spring MVC是一个基于MVC(Model-View-Controller)...
本项目"Spring+Hibernate实现用户登录"旨在演示如何整合这两个框架,构建一个能够处理用户登录功能的Web应用程序。下面将详细介绍这个项目涉及的关键知识点。 1. **Spring框架**:Spring是一个全面的Java应用开发...
本压缩包包含的是Spring 2和Spring 3两个版本的相关技术文档,对于理解和掌握Spring框架的核心概念和技术细节具有很高的参考价值。 《[www.java1234.com]spring3.0_CN.chm》可能是Spring 3.0中文官方手册,这份文档...
Spring的核心思想主要体现在依赖注入(Dependency Injection, DI)和面向切面编程(Aspect-Oriented Programming, AOP)两个方面。 首先,让我们深入理解依赖注入。在传统的面向对象编程中,对象之间的依赖关系通常...
**Spring Boot核心技术笔记** Spring Boot是Java开发领域中一个非常受欢迎的框架,它极大地简化了创建独立、生产级别的基于Spring的应用程序的过程。Spring Boot的核心特性包括自动配置、起步依赖、内嵌Web服务器...
在给出的示例中,我们可以看到Spring配置两个数据源的具体实现: 1. **外部文件配置**:首先,通过`PropertyPlaceholderConfigurer` Bean读取`db.properties`文件,该文件包含了数据库连接所需的参数如`...
《Spring技术内幕 学习笔记》是一份深入探讨Spring框架核心机制的学习资料,结合作者zzc1684在iteye博客上的博文,我们可以从中学习到Spring框架的多个重要知识点。Spring作为Java企业级应用开发的基石,其设计思想...
4. **依赖查找和依赖注入**:Spring提供了两种方式来实现依赖注入:setter注入和构造器注入。通过setter注入,Spring会在创建Bean后调用setter方法注入依赖;构造器注入则是在创建Bean时传入依赖。此外,还可以使用...
这两个概念是Spring解决复杂企业级问题的关键。通过DI,Spring管理对象的生命周期和它们之间的关系,使代码更易于测试和维护。AOP则允许开发者将关注点分离,提高代码的可复用性。 二、依赖注入 依赖注入是Spring...
【Spring技术手册Demo】是针对初学者的一份详尽指南,涵盖了Spring框架的基础及核心特性。这份手册将引领你从零开始,逐步深入理解并掌握Spring框架的强大功能。以下是手册中涉及的关键知识点: **CH2_Spring入门**...