spring
文章平均质量分 82
jeanheo
这个作者很懒,什么都没留下…
展开
-
【Spring源码阅读】populateBean实现 依赖注入源码解析
在完成Bean实例化后,Spring容器会给这个Bean注入相关的依赖Bean,在源码中,这一步通过类AbstractAutowireCapableBeanFactory中的populateBean方法完成。测试代码下面开始进入源码分析之前,先基于以下实例进行:// 基础属性类public class Student { private String name; pub...原创 2018-12-23 19:48:58 · 10313 阅读 · 3 评论 -
spring学习笔记(22)声明式事务配置,readOnly无效写无异常
在上一节内容中,我们使用了编程式方法来配置事务,这样的优点是我们对每个方法的控制性很强,比如我需要用到什么事务,在什么位置如果出现异常需要回滚等,可以进行非常细粒度的配置。但在实际开发中,我们可能并不需要这样细粒度的配置。另一方面,如果我们的项目很大,service层方法很多,单独为每个方法配置事务也是一件很繁琐的事情。而且也可能会造成大量重复代码的冗杂堆积。面对这些缺点,我们首要想到的就是我们sp原创 2016-03-26 00:33:02 · 4344 阅读 · 0 评论 -
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 · 2245 阅读 · 2 评论 -
spring学习笔记(19)mysql读写分离后端AOP控制实例
在这里,我们接上一篇文章,利用JNDI访问应用服务器配置的两个数据源来模拟同时操作不同的数据库如同时操作mysql和oracle等。实际上,上个例子可能用来模拟mysql数据库主从配置读写分离更贴切些。既然如此,在本例中,我们就完成读写分离的模拟在web端的配置实例。续上次的例子,关于JNDI数据源的配置和spring datasource的配置这里不再重复。下面着重加入AOP实现DAO层动态原创 2016-03-25 00:19:31 · 1450 阅读 · 0 评论 -
spring学习笔记(18)使用JNDI模拟访问应用服务器多数据源实例
database2在这一篇文章中,我们要用JNDI访问我们的应用服务器配置好的多数据源。在本实例中,我们使用本地的tomcat服务器来模拟远程服务器,由于本地只有mysql数据库,故通过访问不同的mysql数据库不同database来模拟同时访问不同数据库如mysql和oracle等。 下面是我们的配置步骤。 1. 在服务器配置全局数据源 1. 在我们的tomcat服务器下找到c原创 2016-03-25 00:24:21 · 2537 阅读 · 2 评论 -
Spring4.1新特性——Spring缓存框架增强
本文其实不应该算作Spring4.1新特性,该测试框架目前是独立于Spring Framework发展的。Spring MVC Test HtmlUnit提供了Spring MVC测试框架、HtmlUnit、 WebDriver、Geb的集成测试,简化页面自动化测试,利用这些技术可以完成无需启动服务器即可进行页面测试、自动化页面/页面流程测试、Javascript测试、Mock Servi转载 2016-03-14 19:36:08 · 895 阅读 · 0 评论 -
Spring4.1新特性——Spring MVC增强
Spring 4.1对Spring MVC部分做的增强是最多的,提供了一些视图解析器的mvc标签实现简化配置、提供了GroovyWebApplicationContext用于Groovy web集成、提供了Gson、protobuf的HttpMessageConverter、提供了对groovy-templates模板的支持、JSONP的支持、对Jackson的@JsonView的支持等。转载 2016-03-14 19:34:28 · 2297 阅读 · 0 评论 -
Spring4.1新特性——Spring缓存框架增强
Spring 4.1提供了对jcache的支持,并对cache抽象部分进行了一些简单的增强。在集成jcache时是非常费劲的,版本之间各种不兼容,不建议用于正式环境,在正式环境中可以使用如Guava Cache或Ehcache。 jcache依赖:Java代码 net.sf.ehcache ehcache-jcache ${ehca转载 2016-03-14 19:28:54 · 1114 阅读 · 0 评论 -
Spring4.1新特性——异步调度和事件机制的异常处理
Spring 4.1对异步调用提供了AsyncResult及SuccessCallback、FailureCallback、和异常处理的支持;对事件调度也提供了相应的异常处理器。 1、事件调度异常处理器1.1、定义异常处理器:Java代码 public class MyErrorHandler implements ErrorHandler { @O转载 2016-03-14 19:30:38 · 2790 阅读 · 0 评论 -
Spring4.1新特性——数据库集成测试
在Spring 4.1之前我们在准备测试数据时可能通过继承AbstractTransactionalJUnit4SpringContextTests,然后调用executeSqlScript()进行测试,其中存在一个主要问题:如果要同时执行多个数据源的初始化就靠不住了,而且使用起来也不是特别便利,Spring4.1提供了@Sql注解来完成这个任务。 1、初始化Spring配置:转载 2016-03-14 19:32:05 · 1199 阅读 · 0 评论 -
Spring4.1新特性——静态资源处理增强
Spring 4.1对静态资源处理进行了细化,ResourceHttpRequestHandler细分为两大部分:ResourceResolver和ResourceTransformer。Java代码 public interface ResourceResolver { Resource resolveResource(HttpServletRequest req转载 2016-03-10 00:31:11 · 1855 阅读 · 0 评论 -
spring学习笔记(5)属性文件引入使用
外部文件引用在配置数据库参数或邮箱服务器参数等静态资源时,相对于直接将信息写入Spring的.xml,.java等配置文件中,更好的做法是将配置信息分类独立地存放到外部属性文件中,然后在Spring配置文件中引入使用。这种做法的好处是: 1. 提高配置信息的资源的复用性,可以供多个应用共享,同时若资源数据发生变化时,我们可以直接修改属性文件,即可使更改对多个应用生效。 2. 应用部署人员不用在复原创 2016-03-14 19:23:05 · 1576 阅读 · 0 评论 -
spring学习笔记(1)IOC核心原理解析
Ioc—Inversion of Control,即“控制反转”。在传统面向对象编程中,我们往往会在客户类里主动去创建、配置我们需要用到的依赖。比如,我们有一个客户类userDao需要完成数据库的增删改查操作,我们需要先在客户类对象中创建我们需要的依赖(数据库连接对象conn): Class.forName("com.mysql.jdbc.Driver"); //加载mysql驱动 u原创 2016-03-13 10:17:50 · 1626 阅读 · 0 评论 -
spring学习笔记(2)文件资源访问接口Resource
spring 资源抽象接口下的几个常用实现类 实现类 说明 ClassPathResource 类路径下的资源,资源以相对类路径的方式表示 FileSystemResource 文件系统资源,资源以文件系统路径的的方式表示,如/home/root/test.txt ServletContextResource 为访问web上下文中的资源而设计的类,负责以相对于web应用原创 2016-03-14 10:56:44 · 1704 阅读 · 0 评论 -
springMVC4(14)各类视图输出实例分析
1. 模板视图FreeMarkerViewResolver 、 VolocityViewResolver 这两个视图解析器都是 UrlBasedViewResolver 的子类。 FreeMarkerViewResolver 会把 Controller 处理方法返回的逻辑视图解析为 FreeMarkerView ,而 VolocityViewResolver 会把返回的逻辑视图解析为 Volocit原创 2016-04-07 00:14:34 · 3346 阅读 · 0 评论 -
spring学习笔记(23)基于tx/aop配置切面增强事务
在上一篇文章中,我们使用了声明式事务来配置事务,使事务配置从service逻辑处理中解耦出来。但它还存在一些缺点: 1. 我们只针对方法名的特定进行拦截,但无法利用方法签名的其它信息定位,如修饰符、返回值、方法入参、异常类型等。如果我们需要为同名不同参的同载方法配置不同事务就会出问题了。 2. 事务属性的配置串虽然能包含较多信息,但配置较易出错。针对这些问题,我们可以基于Schema,引入tx和原创 2016-03-26 01:34:24 · 5700 阅读 · 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 · 2673 阅读 · 0 评论 -
【Spring源码阅读】 preInstantiateSingletons方法分析,单例Bean获取/实例化流程
在初始化ClassPathXmlApplicatonContext过程中,核心初始化逻辑在AbstractApplicationContext的refresh函数中:public void refresh() throws BeansException, IllegalStateException { synchronized (this.startupShutdownMonitor) { ...原创 2018-12-23 17:43:53 · 4457 阅读 · 2 评论 -
【Spring源码阅读】BeanDefinition原理与加载流程
BeanDefinition接口定义及其相关子类实现在Spring容器初始化过程中,Spring会将配置文件中配置的Java类封装成一个个BeanDefinition。BeanDefinition存储了具体代表Bean的类,并通过实现了AttributeAccessor接口定义了读写属性配置的相关方法。在基于xml配置Spring容器中,我们为某个Bean配置了具体的属性值,这些都根据name...原创 2018-12-23 14:34:40 · 1493 阅读 · 0 评论 -
【Spring源码阅读】 Spring容器初始化流程
以下面测试代码为例:public class BaseTest { public static void main(String[] args) { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(&amp;quot;config.xml&amp;quot;); TestBean test...原创 2018-12-23 12:25:33 · 463 阅读 · 1 评论 -
【Spring源码阅读】IOC核心容器基础和继承体系结构
BeanFactoryBeanFacotry作为Spring的根容器对象,提供了对Bean的基础操作功能,包括实例化、配置、管理Bean等。ApplicationContextApplicationContext对BeanFactory进行了进一步地封装,内置了BeanFacotry实例,不仅具备BeanFactory提供的所有功能,还提供了更丰富的配置管理BeanFacotry生命周期的能...原创 2018-12-23 12:23:49 · 351 阅读 · 0 评论 -
【Spring源码阅读】Spring源码阅读环境搭建
阅读Spring源码,我们可以通过以下两种方式:直接在Idea/Eclipse上创建自己的java maven/gradle项目,导入Spring特定版本依赖Jar和源码,直接运行测试代码,逐步调试阅读从github直接获取Spring源码项目,基于Spring源码项目,创建自己的子模块,进行本地项目的Spring源码调试。对于方式一的好处是可以方便快捷地开始阅读Spring源码,但由于...原创 2018-12-23 12:22:17 · 478 阅读 · 0 评论 -
【Spring源码阅读】 DefaultListableBeanFactory继承结构讲解分析
在基于ClassPathXmlApplicationContext创建BeanFactory时,我们从代码里看到,创建的BeanFactory的类型是DefaultListableBeanFactory。下面我们来分析下DefaultListableBeanFactory的继承结构,以及基于这个结构下,每个父类接口的用途。具体UML类图实现如下:下面开始从顶层实现类开始,依次向下逐层分析:...原创 2018-12-27 12:49:51 · 1002 阅读 · 0 评论 -
spring学习笔记(26)spring整合Quartz2持久化稳健任务调度
在《Quartz任务调度(3)存储与持久化操作配置详细解析 》一文中,我们通过配置quartz.properties属性文件实现了Quartz的数据库持久化操作。现在整合spring的原理,就是相当于把我们在属性文件中的配置属性整合进SchedulerFactoryBean中,来生成我们的Scheduler类。 这里需要特别注意的是,我们通过Bean配置生成的JobDetail和CronTrigg原创 2016-03-28 17:04:53 · 3749 阅读 · 2 评论 -
spring学习笔记(25)spring整合quartz多版本实现企业级任务调度
在我们的另一个专栏《深入浅出Quartz任务调度》详细的讲解了使用Quartz适用于从普通门户至网站企业级系统的任务调度实现方法。在下面我们结合实例来完整spring和quartz的整合工作,将我们对quartz的配置统一交给spring容器进行管理。quartz1与quartz2两个版本的差别较大,他们的具体差别可参考我的另一篇文章Quartz任务调度(1)概念例析快速入门 。鉴于我们的实际项目中原创 2016-03-28 16:58:21 · 2069 阅读 · 1 评论 -
springMVC4(15)RestFul多视图混合输出
混合使用多种视图技术。在前面文章里,我们对jsp、json、xml个中视图都进行了较为详细的实例解析,但涉及到的都是单视图使用配置。在实际开发中,我们可能需要混合是使用多种视图技术。尤其是针对REST编程风格,我们可以通过一个URL、多种视图来切合REST风格的同一资源、多种表述。 现在加入我们要输出JSP、JSON、XML多种视图技术,如果使用我之前文章《springMVC4(4)json与对象原创 2016-04-07 00:19:26 · 6716 阅读 · 1 评论 -
springMVC4(16)拦截器解析与登陆拦截模拟
在SpringMVC中,我们会经常使用到拦截器,虽然SpringAOP也能帮我们实现强大的拦截器功能,但在Web资源供给上,却没有SpringMVC来得方便快捷。 使用SpringMVC拦截器的核心应用场景是根据我们的实际需求,个性化定制拦截器,再对特定url进行拦截处理。 而自定义拦截器,首先需要我们实现HandlerInterceptor拦截器接口,下面是它的定义:原创 2016-04-08 20:36:25 · 14731 阅读 · 0 评论 -
spring学习笔记(12)@AspectJ研磨分析[3]增强织入顺序实例详解
增强的织入顺序当一个连接点同时织入多个增强时,就存在顺序调用问题: 1. 增强在同一个切面类中定义:依照增强在切面类中定义的顺序依次织入。 2. 增强位于不同的切面,但果这些切面都实现了org.springframework.core.Ordered 接口,则由接口注解的顺序号决定,顺序号越小,对于不同的增强,织入顺序为: 1. 前置增强->越先织入 2. 后置增强->越后原创 2016-03-22 09:46:12 · 3399 阅读 · 1 评论 -
spring学习笔记(14)引介增强详解:定时器实例:无侵入式动态增强类功能
引介增强实例需求在前面我们已经提到了前置、后置、环绕、最终、异常等增强形式,它们的增强对象都是针对方法级别的,而引介增强,则是对类级别的增强,我们可以通过引介增强为目标类添加新的属性和方法,更为诱人的是,这些新属性或方法是可以根据我们业务逻辑需求而动态变化的。怎么来理解这一点?我们先展示一个用引介增强解决的显示需求问题,现在先来看看我们的一个需求: 我们要设计一个定时任务,在每天特定流量高峰时间原创 2016-03-23 13:48:15 · 6672 阅读 · 5 评论 -
spring学习笔记(24)基于注解配置事务
使用注解的方式配置事务极为便利,在xml文件上只需声明我们的注解,然后即可直接在相应service类通过标注注解来完成事务配置。相对于配置在xml文件,简洁了需要,但配置信息分散,会导致易读性大大减弱。使用步骤:1. 在spring容器中注册注解搜索器目的是使分散在各业务类中的注解得以生效 tx:annotation-driven transaction-manage原创 2016-03-26 14:40:32 · 1402 阅读 · 1 评论 -
springMVC4(9)属性编辑器剖析入参类型转换原理
我们通过Http请求提交的参数都以字符串的形式呈现,但最终在springMVC的方法入参中,我们却能得到各种类型的数据,包括Number、Boolean、复杂对象类型、集合类型、Map类型等,这些都是springMVC内置的数据类型转换器帮我们完成的。springMVC的将请求数据绑定到方法入参的流程如下所示:Created with Raphaël 2.1.0数据绑定流程图解ServletRequ原创 2016-04-03 12:16:07 · 4041 阅读 · 1 评论 -
spring学习笔记(17)数据库配置[1]spring数据连接池详解
数据连接池在spring中,常使用数据库连接池来完成对数据库的连接配置,类似于线程池的定义,数据库连接池就是维护有一定数量数据库连接的一个缓冲池,一方面,能够即取即用,免去初始化的时间,另一方面,用完的数据连接会归还到连接池中,这样就免去了不必要的连接创建、销毁工作,提升了性能。当然,使用连接池,有一下几点是连接池配置所考虑到的,也属于配置连接池的优点,而这些也会我们后面的实例配置中体现: 1、原创 2016-03-24 22:59:31 · 6602 阅读 · 1 评论 -
springMVC4(8)模型数据绑定全面分析
使用@ModelAttribute、Model、Map、@SessionAttributes能便捷地将我们的业务数据封装到模型里并交由视图解析调用。下面开始一一分析在方法入参上使用@ModelAttribute使用@ModelAttribute可以直接将我们的方法入参添加到模型中。我们先看一个实例:1. springMVC核心文件配置:<!-- 扫描com.mvc.controller包下所有的类,原创 2016-04-03 10:02:23 · 5057 阅读 · 0 评论 -
springMVC4(7)模型视图方法源码综合分析
在完整web开发中,springMVC主要充当了控制层的角色。它接受视图层的请求,获取视图层请求数据,再对数据进行业务逻辑处理,然后封装成视图层需要的模型数据,再将数据导向到jsp等视图界面。 在前面,我们通过对@RequestMapping和方法入参绑定的分析,完成了视图层->控制层的数据交接,然后业务逻辑处理主要由Service层进行。那么接下来很关键的就是,如何将视图数据导向到特定的视图中。原创 2016-04-02 16:33:51 · 4299 阅读 · 0 评论 -
springMVC4(6)Unitils断言与整合测试
反射断言反射对象断言在实际场景中,我们比较两个对象是否相等,可能会去选择重写equals方法去比较对象里的每一个属性,或者是直接将对象的属性一个个取出来比较,但这都比较麻烦,Unitils为我们提供了反射断言可直接完成这一任务,如下例所示:@Testpublic void test1(){ User user1 = new User(1,"a","b"); User user2 =原创 2016-04-02 12:26:40 · 2274 阅读 · 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 · 3370 阅读 · 0 评论 -
springMVC4(2)请求映射全面分析
在springMVC的控制器中,我们常使用@RequestMapping来完成我们的请求映射,我们可以在类定义上和方法定义上使用注解,其配置的路径将为类中定义的所有方法的父路径,如上篇实例中的/user(类)/hello(方法)。 一般的,我们类定义上的路径注解起到命名空间的作用,防止不同方法的路径映射产生冲突,比如我在UserController和ArticleController下都定义了如下原创 2016-04-01 12:34:39 · 3033 阅读 · 0 评论 -
springMVC4(3)方法入参灵活绑定
在原生Servlet中,我们通过在doGet和doPost方法绑定web资源访问接口:HttpServletRequest和HttpServletResponse到入参来进一步通过request.getParameter()等方法获取我们的web资源。在SpringMVC中,我们一样可以将HttpServletRequest和HttpServletResponse绑定到入参中使用,但除此之外,Spr原创 2016-04-01 15:57:14 · 4119 阅读 · 0 评论 -
springMVC4(4)json与对象互转实例解析请求响应数据转换器
格式化数据输入输出Spring3.0的重要接口:HttpMessageConveter为我们提供了强大的数据转换功能,将我们的请求数据转换为一个java对象,或将java对象转化为特定格式输出等。比如我们常见的从前端注册表单获取json数据并转化为User对象,或前端获取用户信息,后端输出User对象转换为json格式传输给前端等。spring 为我们提供了众多的HttpMessageConvete原创 2016-04-01 21:11:59 · 14665 阅读 · 0 评论 -
springMVC4(5)RestTemplate控制层单元测试
在前面我们进行web测试,总要在游览器进行,数据组装、请求方法更给等都极为麻烦。 RestTemplate是Spring提供的一个web层测试模板类,我们可以通过RestTemplate在客户端方便的进行web层功能测试。它支持REST风格的URL,而且具有AnnotationMethodHandlerAdapter的数据转换器HttpMessageConverters的装配功能。RestTemp原创 2016-04-02 09:24:40 · 4589 阅读 · 5 评论