Spring研磨分析
文章平均质量分 83
spring、springMVC学习回顾过程笔记记录,对其中重点难点如IOC、AOP、数据库连接等进行了分析。本专栏的主要特定是实例详实,基本文章中提到的实例都是经过实际代码测试的,而且需求结合实际,通俗易懂
jeanheo
这个作者很懒,什么都没留下…
展开
-
Spring研磨分析、Quartz任务调度、Hibernate深入浅出系列文章笔记汇总
这系列文章主要是对Spring、Quartz、Hibernate等JavaWeb相关框架学习、并用于实践开发相当一段时间后,进行回顾总结的一系列笔记记录,对其中重点难点如IOC、AOP、数据库连接等进行了分析。主要是基于一些经典书籍文档讲解的基础上,融入自己实践的感悟,,基本文章中提到的实例都是经过实际代码测试的,也力求讲得通俗易懂。Spring基础部分下面是Spring基础部分的访问链接,供大家方原创 2017-04-27 10:46:45 · 1969 阅读 · 0 评论 -
springMVC4(16)拦截器解析与登陆拦截模拟
在SpringMVC中,我们会经常使用到拦截器,虽然SpringAOP也能帮我们实现强大的拦截器功能,但在Web资源供给上,却没有SpringMVC来得方便快捷。 使用SpringMVC拦截器的核心应用场景是根据我们的实际需求,个性化定制拦截器,再对特定url进行拦截处理。 而自定义拦截器,首先需要我们实现HandlerInterceptor拦截器接口,下面是它的定义:原创 2016-04-08 20:36:25 · 14696 阅读 · 0 评论 -
springMVC4(15)RestFul多视图混合输出
混合使用多种视图技术。在前面文章里,我们对jsp、json、xml个中视图都进行了较为详细的实例解析,但涉及到的都是单视图使用配置。在实际开发中,我们可能需要混合是使用多种视图技术。尤其是针对REST编程风格,我们可以通过一个URL、多种视图来切合REST风格的同一资源、多种表述。 现在加入我们要输出JSP、JSON、XML多种视图技术,如果使用我之前文章《springMVC4(4)json与对象原创 2016-04-07 00:19:26 · 6690 阅读 · 1 评论 -
springMVC4(14)各类视图输出实例分析
1. 模板视图FreeMarkerViewResolver 、 VolocityViewResolver 这两个视图解析器都是 UrlBasedViewResolver 的子类。 FreeMarkerViewResolver 会把 Controller 处理方法返回的逻辑视图解析为 FreeMarkerView ,而 VolocityViewResolver 会把返回的逻辑视图解析为 Volocit原创 2016-04-07 00:14:34 · 3334 阅读 · 0 评论 -
springMVC4(13)视图解析器分类详解
在 《springMVC4(7)模型视图方法源码综合分析》 中,我们介绍了ModelAndView的用法,它会在控制层方法调用完毕后作为返回值返回,里面封装好了我们的业务逻辑数据和视图对象或视图名 。下一步,视图对象往往会对模型进一步渲染,再由视图解析器进一步解析并向前端发出响应。在下面,我们详细介绍视图和视图解析器的各种分类。 在View接口中,定义了一个核心方法是: void rend原创 2016-04-06 09:17:51 · 5326 阅读 · 0 评论 -
springMVC4(12)复杂对象和集合类型入参绑定
1. 复杂对象参数绑定对于普通的对象参数绑定,我们只需要对象成员变量名与请求参数名一一对应即可完成绑定。 而求对于组合对象,我们可以使用级联的方式来绑定方法参数。见下面实例: 我们先定义两个POJO类:User,Article其中Atricle是User的成员属性:public class Article { private Integer id; private String原创 2016-04-05 09:24:21 · 16620 阅读 · 2 评论 -
springMVC4(11)使用注解完成数据格式化
需求实例引入在实际开发中,我们会常常遇到需要对日期格式、数值格式进行转换的需求。在spring中,我们可以轻松通过注解的方式完成对数据的格式化处理,比如现在有个User POJO类: package com.mvc.model;import java.util.Date;public class Person { private String name; @DateTimeForm原创 2016-04-04 21:59:18 · 7603 阅读 · 4 评论 -
springMVC4(10)强大类型转换器实例解析
在《springMVC4(9)属性编辑器剖析入参类型转换原理 》一文中,我们通过分析Sping内置的属性编辑器来理解springMVC是如何完成请求参数到入参的类型的转换的。而在新版本中,SpringMVC使用了新的架构来完成类型转换的工作,而且它的工作更加强大,支持格式化参数输入输出,它的另一个实例可见我的另一篇文章《springMVC4(4)json与对象互转实例解析请求响应数据转换器》。在文原创 2016-04-04 15:28:55 · 8907 阅读 · 0 评论 -
Spring4新特性——集成Bean Validation 1.1(JSR-349)到SpringMVC
Bean Validation 1.1当前实现是Hibernate validator 5,且spring4才支持。接下来我们从以下几个方法讲解Bean Validation 1.1,当然不一定是新特性: 集成Bean Validation 1.1到SpringMVC 分组验证、分组顺序及级联验证 消息中使用EL表达式 方法参数/返回值验证 自定义验证规则 类级别验证器 脚本验证器 cro转载 2016-04-04 00:58:11 · 2354 阅读 · 2 评论 -
springMVC4(9)属性编辑器剖析入参类型转换原理
我们通过Http请求提交的参数都以字符串的形式呈现,但最终在springMVC的方法入参中,我们却能得到各种类型的数据,包括Number、Boolean、复杂对象类型、集合类型、Map类型等,这些都是springMVC内置的数据类型转换器帮我们完成的。springMVC的将请求数据绑定到方法入参的流程如下所示:Created with Raphaël 2.1.0数据绑定流程图解ServletRequ原创 2016-04-03 12:16:07 · 4031 阅读 · 1 评论 -
springMVC4(8)模型数据绑定全面分析
使用@ModelAttribute、Model、Map、@SessionAttributes能便捷地将我们的业务数据封装到模型里并交由视图解析调用。下面开始一一分析在方法入参上使用@ModelAttribute使用@ModelAttribute可以直接将我们的方法入参添加到模型中。我们先看一个实例:1. springMVC核心文件配置:<!-- 扫描com.mvc.controller包下所有的类,原创 2016-04-03 10:02:23 · 5046 阅读 · 0 评论 -
springMVC4(7)模型视图方法源码综合分析
在完整web开发中,springMVC主要充当了控制层的角色。它接受视图层的请求,获取视图层请求数据,再对数据进行业务逻辑处理,然后封装成视图层需要的模型数据,再将数据导向到jsp等视图界面。 在前面,我们通过对@RequestMapping和方法入参绑定的分析,完成了视图层->控制层的数据交接,然后业务逻辑处理主要由Service层进行。那么接下来很关键的就是,如何将视图数据导向到特定的视图中。原创 2016-04-02 16:33:51 · 4285 阅读 · 0 评论 -
springMVC4(6)Unitils断言与整合测试
反射断言反射对象断言在实际场景中,我们比较两个对象是否相等,可能会去选择重写equals方法去比较对象里的每一个属性,或者是直接将对象的属性一个个取出来比较,但这都比较麻烦,Unitils为我们提供了反射断言可直接完成这一任务,如下例所示:@Testpublic void test1(){ User user1 = new User(1,"a","b"); User user2 =原创 2016-04-02 12:26:40 · 2253 阅读 · 0 评论 -
springMVC4(5)RestTemplate控制层单元测试
在前面我们进行web测试,总要在游览器进行,数据组装、请求方法更给等都极为麻烦。 RestTemplate是Spring提供的一个web层测试模板类,我们可以通过RestTemplate在客户端方便的进行web层功能测试。它支持REST风格的URL,而且具有AnnotationMethodHandlerAdapter的数据转换器HttpMessageConverters的装配功能。RestTemp原创 2016-04-02 09:24:40 · 4560 阅读 · 5 评论 -
springMVC4(4)json与对象互转实例解析请求响应数据转换器
格式化数据输入输出Spring3.0的重要接口:HttpMessageConveter为我们提供了强大的数据转换功能,将我们的请求数据转换为一个java对象,或将java对象转化为特定格式输出等。比如我们常见的从前端注册表单获取json数据并转化为User对象,或前端获取用户信息,后端输出User对象转换为json格式传输给前端等。spring 为我们提供了众多的HttpMessageConvete原创 2016-04-01 21:11:59 · 14654 阅读 · 0 评论 -
springMVC4(3)方法入参灵活绑定
在原生Servlet中,我们通过在doGet和doPost方法绑定web资源访问接口:HttpServletRequest和HttpServletResponse到入参来进一步通过request.getParameter()等方法获取我们的web资源。在SpringMVC中,我们一样可以将HttpServletRequest和HttpServletResponse绑定到入参中使用,但除此之外,Spr原创 2016-04-01 15:57:14 · 4109 阅读 · 0 评论 -
springMVC4(2)请求映射全面分析
在springMVC的控制器中,我们常使用@RequestMapping来完成我们的请求映射,我们可以在类定义上和方法定义上使用注解,其配置的路径将为类中定义的所有方法的父路径,如上篇实例中的/user(类)/hello(方法)。 一般的,我们类定义上的路径注解起到命名空间的作用,防止不同方法的路径映射产生冲突,比如我在UserController和ArticleController下都定义了如下原创 2016-04-01 12:34:39 · 2999 阅读 · 0 评论 -
springMVC4(1)角色解析与入门配置实例
在一个web项目中,典型的MVC架构将后台分为Controller、Service、DAO三层,分别实现不同的逻辑功能,下面是一个web请求过程中,我们后台的处理过程:Created with Raphaël 2.1.0模拟服务端接受web请求并返回客户端客户端controllercontrollerserviceserviceDAO/数据库DAO/数据库发送请求进行业务逻辑处理调用DAO层API访原创 2016-03-30 19:57:25 · 3347 阅读 · 0 评论 -
spring4整合hibernate5.1
在另一篇文章hibernate5(2)初入门配置实例中,我们针对hibernate5.1版本的崭新引导配置方法,完成了对数据库的的插入实例操作,在本节内容中,我们开始引入spring4,完成spring4与hibernate5.1的整合工作,像数据库中插入一条记录。在后面学习hibernate中,我们都会使用spring来管理我们的Bean容器。1. 导入spring4所需jar包我们推荐使用mav原创 2016-03-30 12:10:25 · 15305 阅读 · 0 评论 -
spring学习笔记(26)spring整合Quartz2持久化稳健任务调度
在《Quartz任务调度(3)存储与持久化操作配置详细解析 》一文中,我们通过配置quartz.properties属性文件实现了Quartz的数据库持久化操作。现在整合spring的原理,就是相当于把我们在属性文件中的配置属性整合进SchedulerFactoryBean中,来生成我们的Scheduler类。 这里需要特别注意的是,我们通过Bean配置生成的JobDetail和CronTrigg原创 2016-03-28 17:04:53 · 3741 阅读 · 2 评论 -
spring学习笔记(25)spring整合quartz多版本实现企业级任务调度
在我们的另一个专栏《深入浅出Quartz任务调度》详细的讲解了使用Quartz适用于从普通门户至网站企业级系统的任务调度实现方法。在下面我们结合实例来完整spring和quartz的整合工作,将我们对quartz的配置统一交给spring容器进行管理。quartz1与quartz2两个版本的差别较大,他们的具体差别可参考我的另一篇文章Quartz任务调度(1)概念例析快速入门 。鉴于我们的实际项目中原创 2016-03-28 16:58:21 · 2057 阅读 · 1 评论 -
spring学习笔记(24)基于注解配置事务
使用注解的方式配置事务极为便利,在xml文件上只需声明我们的注解,然后即可直接在相应service类通过标注注解来完成事务配置。相对于配置在xml文件,简洁了需要,但配置信息分散,会导致易读性大大减弱。使用步骤:1. 在spring容器中注册注解搜索器目的是使分散在各业务类中的注解得以生效 tx:annotation-driven transaction-manage原创 2016-03-26 14:40:32 · 1373 阅读 · 1 评论 -
spring学习笔记(23)基于tx/aop配置切面增强事务
在上一篇文章中,我们使用了声明式事务来配置事务,使事务配置从service逻辑处理中解耦出来。但它还存在一些缺点: 1. 我们只针对方法名的特定进行拦截,但无法利用方法签名的其它信息定位,如修饰符、返回值、方法入参、异常类型等。如果我们需要为同名不同参的同载方法配置不同事务就会出问题了。 2. 事务属性的配置串虽然能包含较多信息,但配置较易出错。针对这些问题,我们可以基于Schema,引入tx和原创 2016-03-26 01:34:24 · 5652 阅读 · 0 评论 -
spring学习笔记(22)声明式事务配置,readOnly无效写无异常
在上一节内容中,我们使用了编程式方法来配置事务,这样的优点是我们对每个方法的控制性很强,比如我需要用到什么事务,在什么位置如果出现异常需要回滚等,可以进行非常细粒度的配置。但在实际开发中,我们可能并不需要这样细粒度的配置。另一方面,如果我们的项目很大,service层方法很多,单独为每个方法配置事务也是一件很繁琐的事情。而且也可能会造成大量重复代码的冗杂堆积。面对这些缺点,我们首要想到的就是我们sp原创 2016-03-26 00:33:02 · 4319 阅读 · 0 评论 -
spring学习笔记(21)编程式事务配置,service层概念引入
编程式事务配置实例导入访问数据库事务导入在我之前的文章《spring学习笔记(19)mysql读写分离后端AOP控制实例》中模拟数据库读写分离的例子,在访问数据库时使用的方法是:public <E> E add(Object object) { return (E) getSessionFactory().openSession().save(object);}通过直接开启session而原创 2016-03-25 22:59:46 · 2644 阅读 · 0 评论 -
spring学习笔记(20)数据库事务并发与锁详解
多事务运行并发问题在实际应用中,往往是一台(或多台)服务器向无数客户程序提供服务,当服务器查询数据库获取数据时,如果没有采用必要的隔离机制,可能会存在数据库事务的并发问题,下面是一些常见的并发问题分类:1. 第一类丢失更新:撤销一个事务,其他事务已提交的更新数据覆盖2. 第二类丢失更新:一个事务覆盖另一个事务已提交的更新数据3. 脏读:一个事务读到另一个事务未提交的数据4. 虚读:一个事物读到原创 2016-03-10 00:21:49 · 13267 阅读 · 0 评论 -
spring学习笔记(19)mysql读写分离后端AOP控制实例
在这里,我们接上一篇文章,利用JNDI访问应用服务器配置的两个数据源来模拟同时操作不同的数据库如同时操作mysql和oracle等。实际上,上个例子可能用来模拟mysql数据库主从配置读写分离更贴切些。既然如此,在本例中,我们就完成读写分离的模拟在web端的配置实例。续上次的例子,关于JNDI数据源的配置和spring datasource的配置这里不再重复。下面着重加入AOP实现DAO层动态原创 2016-03-25 00:19:31 · 1441 阅读 · 0 评论 -
spring学习笔记(18)使用JNDI模拟访问应用服务器多数据源实例
database2在这一篇文章中,我们要用JNDI访问我们的应用服务器配置好的多数据源。在本实例中,我们使用本地的tomcat服务器来模拟远程服务器,由于本地只有mysql数据库,故通过访问不同的mysql数据库不同database来模拟同时访问不同数据库如mysql和oracle等。 下面是我们的配置步骤。 1. 在服务器配置全局数据源 1. 在我们的tomcat服务器下找到c原创 2016-03-25 00:24:21 · 2492 阅读 · 2 评论 -
spring学习笔记(17)数据库配置[1]spring数据连接池详解
数据连接池在spring中,常使用数据库连接池来完成对数据库的连接配置,类似于线程池的定义,数据库连接池就是维护有一定数量数据库连接的一个缓冲池,一方面,能够即取即用,免去初始化的时间,另一方面,用完的数据连接会归还到连接池中,这样就免去了不必要的连接创建、销毁工作,提升了性能。当然,使用连接池,有一下几点是连接池配置所考虑到的,也属于配置连接池的优点,而这些也会我们后面的实例配置中体现: 1、原创 2016-03-24 22:59:31 · 6585 阅读 · 1 评论 -
spring学习笔记(16)趣谈spring 事件机制[2]:多监听器流水线式顺序处理
上一篇我们使用到的ApplicationListener是无序的,结合异步调度它能满足了我们的大部分应用场景,但现在我们来个另类的需求,我们来模拟一条作业调度流水线,它不能异步,必须按照先后次序执行不同的任务才能得到我们的最终结果。 需求示例:现在假如华中科技大学的小白想要为它的智能机器人作品申报国家创新奖,需要经过学校、省级创新科研机构、国家创新科研机构逐层审核。我们尝试通过事件来实现,核心就在原创 2016-03-24 00:32:29 · 5649 阅读 · 1 评论 -
spring学习笔记(7)AOP前夕[2]CGLib动态代理实例解析
CGLib动态代理基本原理CGLib——Code Generation Library,它是一个动态字节代码生成库,基于asm。使用CGLib时需要导入asm相关的jar包。而asm又是何方神圣? asm是一个java字节码操纵框架,它能被用来动态生成类或者增强既有类的功能。ASM 可以直接产生二进制 class 文件,也可以在类被加载入 Java 虚拟机之前动态改变类行为。Java class原创 2016-03-24 18:51:39 · 2218 阅读 · 2 评论 -
spring学习笔记(6)AOP前夕[1]jdk动态代理实例解析
JDK动态代理技术动态代理最常见应用是AOP(面向切面编程)。通过AOP,我们能够地拿到我们的程序运行到某个节点时的方法、对象、入参、返回参数,并动态地在方法调用前后新添一些新的方法逻辑,来满足我们的新需求,比如日志记录等。 动态代理常见有两种方式:基于JDK的反射技术的动态代理和基于CGLib的动态代理。使用反射技术创建动态代理JDK创建动态代理的核心是java.lang.reflect.Inv原创 2016-03-24 16:40:54 · 1455 阅读 · 0 评论 -
spring学习笔记(15)趣谈spring 事件:实现业务逻辑解耦,异步调用提升用户体验
分析需求引入事件机制使用spring的事件机制有助于对我们的项目进一步的解耦。假如现在我们面临一个需求: 我需要在用户注册成功的时候,根据用户提交的邮箱、手机号信息,向用户发送邮箱认证和手机号短信通知。传统的做法之一是在我们的UserService层注入邮件发送和短信发送的相关类,然后在完成用户注册同时,调用对应类方法完成邮件发送和短信发送 但这样做的话,会把我们邮件、短信发送的业务与我们的Us原创 2016-03-23 21:10:02 · 8555 阅读 · 5 评论 -
spring学习笔记(14)引介增强详解:定时器实例:无侵入式动态增强类功能
引介增强实例需求在前面我们已经提到了前置、后置、环绕、最终、异常等增强形式,它们的增强对象都是针对方法级别的,而引介增强,则是对类级别的增强,我们可以通过引介增强为目标类添加新的属性和方法,更为诱人的是,这些新属性或方法是可以根据我们业务逻辑需求而动态变化的。怎么来理解这一点?我们先展示一个用引介增强解决的显示需求问题,现在先来看看我们的一个需求: 我们要设计一个定时任务,在每天特定流量高峰时间原创 2016-03-23 13:48:15 · 6630 阅读 · 5 评论 -
spring学习笔记(13)基于Schema配置AOP详解
基于Schema配置入门实例除了基于@AspectJ注解的形式来实现AOP外,我们还可以在IOC容器中配置。先来看看一个常见的应用场景,在我们的web项目中,我们需要为service层配置事务,传统的做法是在每个业务逻辑方法重复下面配置中:Created with Raphaël 2.1.0程序开始 1. 获取DAO层封装好的数据库查询API(如HIbernate中的SessionFactory/S原创 2016-03-23 13:25:39 · 1616 阅读 · 1 评论 -
spring学习笔记(12)@AspectJ研磨分析[3]增强织入顺序实例详解
增强的织入顺序当一个连接点同时织入多个增强时,就存在顺序调用问题: 1. 增强在同一个切面类中定义:依照增强在切面类中定义的顺序依次织入。 2. 增强位于不同的切面,但果这些切面都实现了org.springframework.core.Ordered 接口,则由接口注解的顺序号决定,顺序号越小,对于不同的增强,织入顺序为: 1. 前置增强->越先织入 2. 后置增强->越后原创 2016-03-22 09:46:12 · 3365 阅读 · 1 评论 -
spring学习笔记(11)@AspectJ研磨分析[2]切点表达式函数详解
Spring中的AspectJ切点表达式函数切点表达式函数就像我们的GPS导航软件。通过切点表达式函数,再配合通配符和逻辑运算符的灵活运用,我们能很好定位到我们需要织入增强的连接点上。经过上面的铺垫,下面来看看Springz中支持的切点表达式函数。1. 方法切点函数 函数 入参 说明 示例 execution() 方法匹配字符串 满足某一匹配模式的的所有目标类方法连接点原创 2016-03-22 01:40:34 · 9728 阅读 · 2 评论 -
spring学习笔记(10)@AspectJ研磨分析[1]入门、注解基本介绍
@AspectJ AspectJ是一个面向切面的框架,它扩展了Java语言。AspectJ定义了AOP语法所以它有一个专门的编译器用来生成遵守Java字节编码规范的Class文件。 在使用AspectJ之前,我们需要导入aspectJ相应的jar包,可到我的资源页http://download.csdn.net/detail/qwe6112071/9468329 中下载,而如果使用mave原创 2016-03-21 21:21:27 · 1437 阅读 · 1 评论 -
spring学习笔记(9)AOP基本概念
通过上一篇文章对AOP的一些实例讲解后,我们在这篇文章中结合一些例子来系统地了解AOP中涉及到的一些基本概念。1. 增强上一篇文章我们都在讲增强,但并未谈及它的概念,但通过很多实例分析,我们很容易理解,增强就是为程序执行过程的很多特定地方添加一些新的功能。2. 连接点程序执行过程的某个特定位置点,如增强嵌入(织入)处的方法调用前,调用后、抛出异常后等程序执行点,乃至类初始化前后、类销毁前后等,都能称原创 2016-03-21 01:12:55 · 1018 阅读 · 1 评论 -
spring学习笔记(8)AOP增强(advice)配置与应用
增强类型增强(advice)主要包括如下五种类型 1. 前置增强(BeforeAdvice):在目标方法执行前实施增强 2. 后置增强(AfterReturningAdvice):在目标方法执行后实施增强 3. 环绕增强(MrthodInterceptor):在目标方法执行前后实施增强 4. 异常抛出增强(ThrowsAdvice):在目标方法抛出异常后实施增强 5. 引介增强(Intro原创 2016-03-20 21:14:13 · 5676 阅读 · 1 评论