02 2012 档案
【第六章】 AOP 之 6.9 代理机制 ——跟我学spring3 【私塾在线原创】
摘要:Spring AOP通过代理模式实现,目前支持两种代理:JDK动态代理、CGLIB代理来创建AOP代理,Spring建议优先使用JDK动态代理。JDK动态代理:使用java.lang.reflect.Proxy动态代理实现,即提取目标对象的接口,然后对接口创建AOP代理。CGLIB代理:CGLIB代理不仅能进行接口代理,也能进行类代理,CGLIB代理需要注意以下问题: 不能通知final方法,因为final方法不能被覆盖(CGLIB通过生成子类来创建代理)。 会产生两次构造器调用,第一次是目标类的构造器调用,第二次是CGLIB生成的代理类的构造器调用。如果需要CGLIB代理方法,请确保... 阅读全文
posted @ 2012-02-29 07:08 kaitao1987 阅读(1295) 评论(3) 推荐(3) 编辑
【第六章】 AOP 之 6.8 切面实例化模型 ——跟我学spring3【私塾在线原创】
摘要:私塾在线原创内容,转载请注明出处【http://sishuok.com/forum/blogPost/list/0/2475.html】 所谓切面实例化模型指何时实例化切面。 Spring AOP支持AspectJ的singleton、perthis、pertarget实例化模型(目前不支持percflow、percflowbelow 和pertypewithin)。singleton:即切面只会有一个实例;perthis:每个切入点表达式匹配的连接点对应的AOP对象都会创建一个新切面实例;pertarget:每个切入点表达式匹配的连接点对应的目标对象都会创建一个新的切面实例;默认是sin.. 阅读全文
posted @ 2012-02-28 07:09 kaitao1987 阅读(1177) 评论(0) 推荐(2) 编辑
【第六章】 AOP 之 6.7 通知顺序 ——跟我学spring3 【私塾在线原创】
摘要:原创内容,转载请注明出处【http://sishuok.com/forum/blogPost/list/0/2474.html】 如果我们有多个通知想要在同一连接点执行,那执行顺序如何确定呢?Spring AOP使用AspectJ的优先级规则来确定通知执行顺序。总共有两种情况:同一切面中通知执行顺序、不同切面中的通知执行顺序。 首先让我们看下1)同一切面中通知执行顺序:如图6-6所示。图6-6 同一切面中的通知执行顺序而如果在同一切面中定义两个相同类型通知(如同是前置通知或环绕通知(proceed之前))并在同一连接点执行时,其执行顺序是未知的,如果确实需要指定执行顺序需要将通知重构到两个.. 阅读全文
posted @ 2012-02-27 07:32 kaitao1987 阅读(1203) 评论(0) 推荐(4) 编辑
【第六章】 AOP 之 6.6 通知参数 ——跟我学spring3
摘要:包括使用JoinPoint获取 参数自动获取流程 私塾在线原创 sishuok.com 阅读全文
posted @ 2012-02-26 21:04 kaitao1987 阅读(1001) 评论(0) 推荐(4) 编辑
【第六章】 AOP 之 6.5 AspectJ切入点语法详解 ——跟我学spring3
摘要:私塾在线原创内容, http://sishuok.com6.5.1 Spring AOP支持的AspectJ切入点指示符 切入点指示符用来指示切入点表达式目的,,在Spring AOP中目前只有执行方法这一个连接点,Spring AOP支持的AspectJ切入点指示符如下: execution:用于匹配方法执行的连接点; within:用于匹配指定类型内的方法执行; this:用于匹配当前AOP代理对象类型的执行方法;注意是AOP代理对象的类型匹配,这样就可能包括引入接口也类型匹配; target:用于匹配当前目标对象类型的执行方法;注意是目标对象的类型匹配,这样就不包... 阅读全文
posted @ 2012-02-26 08:01 kaitao1987 阅读(970) 评论(0) 推荐(2) 编辑
【第六章】 AOP 之 6.4 基于@AspectJ的AOP ——跟我学spring3
摘要:原创内容,同步发布到私塾在线 sishuok.comSpring除了支持Schema方式配置AOP,还支持注解方式:使用@AspectJ风格的切面声明。6.4.1 启用对@AspectJ的支持 Spring默认不支持@AspectJ风格的切面声明,为了支持需要使用如下配置:java代码:<aop:aspectj-autoproxy/>这样Spring就能发现@AspectJ风格的切面并且将切面应用到目标对象。6.4.2 声明切面 @AspectJ风格的声明切面非常简单,使用@Aspect注解进行声明:java代码:@Aspect()Public class Aspect{……} 然 阅读全文
posted @ 2012-02-25 12:12 kaitao1987 阅读(1619) 评论(0) 推荐(2) 编辑
【第六章】 AOP 之 6.3 基于Schema的AOP ——跟我学spring3
摘要:6.3 基于Schema的AOP 基于Schema的AOP从Spring2.0之后通过“aop”命名空间来定义切面、切入点及声明通知。 在Spring配置文件中,所以AOP相关定义必须放在<aop:config>标签下,该标签下可以有<aop:pointcut>、<aop:advisor>、<aop:aspect>标签,配置顺序不可变。<aop:pointcut>:用来定义切入点,该切入点可以重用;<aop:advisor>:用来定义只有一个通知和一个切入点的切面;<aop:aspect>:用来定义切面,该切面 阅读全文
posted @ 2012-02-25 08:28 kaitao1987 阅读(954) 评论(1) 推荐(2) 编辑
【第六章】 AOP 之 6.2 AOP的HelloWorld ——跟我学spring3
摘要:6.2.1 准备环境 首先准备开发需要的jar包,请到spring-framework-3.0.5.RELEASE-dependencies.zip和spring-framework-3.0.5.RELEASE-with-docs中查找如下jar包:org.springframework.aop-3.0.5.RELEASE.jarcom.springsource.org.aspectj.weaver-1.6.8.RELEASE.jarcom.springsource.org.aopalliance-1.0.0.jarcom.springsource.net.sf.cglib-2.2.0.jar 阅读全文
posted @ 2012-02-24 13:21 kaitao1987 阅读(320) 评论(0) 推荐(1) 编辑
【第六章】 AOP 之 6.1 AOP基础 ——跟我学spring3
摘要:6.1.1 AOP是什么 考虑这样一个问题:需要对系统中的某些业务做日志记录,比如支付系统中的支付业务需要记录支付相关日志,对于支付系统可能相当复杂,比如可能有自己的支付系统,也可能引入第三方支付平台,面对这样的支付系统该如何解决呢?传统解决方案: 1)日志部分提前公共类LogUtils,定义“longPayBegin”方法用于记录支付开始日志,“logPayEnd”用于记录支付结果: 2)支付部分,定义IPayService接口并定义支付方法“pay”,并定义了两个实现:“PointPayService”表示积分支付,“RMBPayService”表示人民币支付;并且在每个... 阅读全文
posted @ 2012-02-24 08:53 kaitao1987 阅读(233) 评论(0) 推荐(2) 编辑
【第五章】Spring表达式语言 之 5.1 概述 5.2 SpEL基础 ——跟我学spring3
摘要:5.1概述5.1.1 概述 Spring表达式语言全称为“Spring Expression Language”,缩写为“SpEL”,类似于Struts2x中使用的OGNL表达式语言,能在运行时构建复杂表达式、存取对象图属性、对象方法调用等等,并且能与Spring功能完美整合,如能用来配置Bean定义。 表达式语言给静态Java语言增加了动态功能。 SpEL是单独模块,只依赖于core模块,不依赖于其他模块,可以单独使用。5.1.2 能干什么 表达式语言一般是用最简单的形式完成最主要的工作,减少我们的工作量。 SpEL支持如下表达式:一、基本表达式:字面量表达式、关系,逻辑与算数运算表达式、字 阅读全文
posted @ 2012-02-24 08:28 kaitao1987 阅读(313) 评论(0) 推荐(0) 编辑
【第五章】Spring表达式语言 之 5.3 SpEL语法 ——跟我学spring3
摘要:5.3 SpEL语法5.3.1 基本表达式一、字面量表达式:SpEL支持的字面量包括:字符串、数字类型(int、long、float、double)、布尔类型、null类型。类型示例字符串String str1 = parser.parseExpression("'Hello World!'").getValue(String.class);String str2 = parser.parseExpression("\"Hello World!\"").getValue(String.class);数字类型int in 阅读全文
posted @ 2012-02-24 08:28 kaitao1987 阅读(256) 评论(0) 推荐(1) 编辑
【第五章】Spring表达式语言 之 5.4在Bean定义中使用EL—跟我学spring3
摘要:5.4.1 xml风格的配置 SpEL支持在Bean定义时注入,默认使用“#{SpEL表达式}”表示,其中“#root”根对象默认可以认为是ApplicationContext,只有ApplicationContext实现默认支持SpEL,获取根对象属性其实是获取容器中的Bean。 首先看下配置方式(chapter5/el1.xml)吧:java代码:查看复制到剪贴板打印<beanid="world"class="java.lang.String"><constructor-argvalue="#{'World! 阅读全文
posted @ 2012-02-24 08:28 kaitao1987 阅读(174) 评论(0) 推荐(1) 编辑
【第四章】 资源 之 4.3 访问Resource ——跟我学spring3
摘要:4.3.1 ResourceLoader接口 ResourceLoader接口用于返回Resource对象;其实现可以看作是一个生产Resource的工厂类。java代码:public interface ResourceLoader { Resource getResource(String location); ClassLoader getClassLoader();} getResource接口用于根据提供的location参数返回相应的Resource对象;而getClassLoader则返回加载这些Resource的ClassLoader。 Spring提供... 阅读全文
posted @ 2012-02-23 08:04 kaitao1987 阅读(451) 评论(0) 推荐(0) 编辑
【第四章】 资源 之 4.4 Resource通配符路径 ——跟我学spring3
摘要:4.4.1 使用路径通配符加载Resource 前面介绍的资源路径都是非常简单的一个路径匹配一个资源,Spring还提供了一种更强大的Ant模式通配符匹配,从能一个路径匹配一批资源。 Ant路径通配符支持“?”、“*”、“**”,注意通配符匹配不包括目录分隔符“/”: “?”:匹配一个字符,如“config?.xml”将匹配“config1.xml”; “*”:匹配零个或多个字符串,如“cn/*/config.xml”将匹配“cn/javass/config.xml”,但不匹配匹配“cn/config.xml”;而“cn/config-*.xml”将匹配“cn/config-dao... 阅读全文
posted @ 2012-02-23 08:04 kaitao1987 阅读(1402) 评论(0) 推荐(2) 编辑
【第四章】 资源 之 4.1 基础知识 ——跟我学spring3
摘要:4.1.1 概述 在日常程序开发中,处理外部资源是很繁琐的事情,我们可能需要处理URL资源、File资源资源、ClassPath相关资源、服务器相关资源(JBoss AS 5.x上的VFS资源)等等很多资源。因此处理这些资源需要使用不同的接口,这就增加了我们系统的复杂性;而且处理这些资源步骤都是类似的(打开资源、读取资源、关闭资源),因此如果能抽象出一个统一的接口来对这些底层资源进行统一访问,是不是很方便,而且使我们系统更加简洁,都是对不同的底层资源使用同一个接口进行访问。 Spring 提供一个Resource接口来统一这些底层资源一致的访问,而且提供了一些便利的接口,从而能提供我们的生产力 阅读全文
posted @ 2012-02-23 08:03 kaitao1987 阅读(174) 评论(0) 推荐(0) 编辑
【第四章】 资源 之 4.2 内置Resource实现 ——跟我学spring3
摘要:4.2 内置Resource实现4.2.1 ByteArrayResource ByteArrayResource代表byte[]数组资源,对于“getInputStream”操作将返回一个ByteArrayInputStream。首先让我们看下使用ByteArrayResource如何处理byte数组资源:java代码: package cn.javass.spring.chapter4;import java.io.IOException;import java.io.InputStream;import org.junit.Test;import org.springframework. 阅读全文
posted @ 2012-02-23 08:03 kaitao1987 阅读(256) 评论(0) 推荐(0) 编辑
【第三章】 DI 之 3.3 更多DI的知识 ——跟我学spring3
摘要:3.3.1 延迟初始化Bean 延迟初始化也叫做惰性初始化,指不提前初始化Bean,而是只有在真正使用时才创建及初始化Bean。 配置方式很简单只需在<bean>标签上指定 “lazy-init” 属性值为“true”即可延迟初始化Bean。 Spring容器会在创建容器时提前初始化“singleton”作用域的Bean,“singleton”就是单例的意思即整个容器每个Bean只有一个实例,后边会详细介绍。Spring容器预先初始化Bean通常能帮助我们提前发现配置错误,所以如果没有什么情况建议开启,除非有某个Bean可能需要加载很大资源,而且很可能在整个应用程序生命周期中很可能 阅读全文
posted @ 2012-02-22 08:49 kaitao1987 阅读(170) 评论(0) 推荐(0) 编辑
【第三章】 DI 之 3.4 Bean的作用域 ——跟我学spring3
摘要:3.4 Bean的作用域 什么是作用域呢?即“scope”,在面向对象程序设计中一般指对象或变量之间的可见范围。而在Spring容器中是指其创建的Bean对象相对于其他Bean对象的请求可见范围。Spring提供“singleton”和“prototype”两种基本作用域,另外提供“request”、“session”、“global session”三种web作用域;Spring还允许用户定制自己的作用域。3.4.1 基本的作用域一、singleton:指“singleton”作用域的Bean只会在每个Spring IoC容器中存在一个实例,而且其完整生命周期完全由Spring容器管理。对于 阅读全文
posted @ 2012-02-22 08:49 kaitao1987 阅读(218) 评论(0) 推荐(0) 编辑
【第三章】 DI 之 3.2 循环依赖 ——跟我学spring3
摘要:3.2.1 什么是循环依赖 循环依赖就是循环引用,就是两个或多个Bean相互之间的持有对方,比如CircleA引用CircleB,CircleB引用CircleC,CircleC引用CircleA,则它们最终反映为一个环。此处不是循环调用,循环调用是方法之间的环调用。如图3-5所示:图3-5 循环引用 循环调用是无法解决的,除非有终结条件,否则就是死循环,最终导致内存溢出错误。 Spring容器循环依赖包括构造器循环依赖和setter循环依赖,那Spring容器如何解决循环依赖呢?首先让我们来定义循环引用类:java代码:查看复制到剪贴板打印packagecn.javass.spring.ch 阅读全文
posted @ 2012-02-22 08:48 kaitao1987 阅读(1134) 评论(3) 推荐(2) 编辑
【第三章】 DI 之 3.1 DI的配置使用 ——跟我学spring3
摘要:3.1.1 依赖和依赖注入 传统应用程序设计中所说的依赖一般指“类之间的关系”,那先让我们复习一下类之间的关系: 泛化:表示类与类之间的继承关系、接口与接口之间的继承关系; 实现:表示类对接口的实现; 依赖:当类与类之间有使用关系时就属于依赖关系,不同于关联关系,依赖不具有“拥有关系”,而是一种“相识关系”,只在某个特定地方(比如某个方法体内)才有关系。 关联:表示类与类或类与接口之间的依赖关系,表现为“拥有关系”;具体到代码可以用实例变量来表示; 聚合:属于是关联的特殊情况,体现部分-整体关系,是一种弱拥有关系;整体和部分可以有不一样的生命周期;是一种弱关联; 组合:属于是关联的... 阅读全文
posted @ 2012-02-21 17:33 kaitao1987 阅读(1050) 评论(0) 推荐(0) 编辑
【第二章】 IoC 之 2.3 IoC的配置使用——跟我学Spring3
摘要:2.3.1 XML配置的结构一般配置文件结构如下:java代码:查看复制到剪贴板打印<beans><importresource=”resource1.xml”/><beanid=”bean1”class=””></bean><beanid=”bean2”class=””></bean><beanname=”bean2”class=””></bean><aliasalias="bean3"name="bean2"/><importresour 阅读全文
posted @ 2012-02-21 17:31 kaitao1987 阅读(299) 评论(0) 推荐(1) 编辑
【第二章】 IoC 之 2.2 IoC 容器基本原理 ——跟我学Spring3
摘要:2.2.1 IoC容器的概念IoC容器就是具有依赖注入功能的容器,IoC容器负责实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。应用程序无需直接在代码中new相关的对象,应用程序由IoC容器进行组装。在Spring中BeanFactory是IoC容器的实际代表者。Spring IoC容器如何知道哪些是它管理的对象呢?这就需要配置文件,Spring IoC容器通过读取配置文件中的配置元数据,通过元数据对应用中的各个对象进行实例化及装配。一般使用基于xml配置文件进行配置元数据,而且Spring与配置文件完全解耦的,可以使用其他任何可能的方式进行配置元数据,比如注解、基于java文件的、 阅读全文
posted @ 2012-02-21 17:30 kaitao1987 阅读(1301) 评论(0) 推荐(3) 编辑
【第二章】 IoC 之 2.1 IoC基础 ——跟我学Spring3
摘要:2.1.1 IoC是什么Ioc—Inversion of Control,即“控制反转”,不是什么技术,而是一种设计思想。在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。如何理解好Ioc呢?理解好Ioc的关键是要明确“谁控制谁,控制什么,为何是反转(有反转就应该有正转了),哪些方面反转了”,那我们来深入分析一下:●谁控制谁,控制什么:传统Java SE程序设计,我们直接在对象内部通过new进行创建对象,是程序主动去创建依赖对象;而IoC是有专门一个容器来创建这些对象,即由Ioc容器来控制对象的创建;谁控制谁?当然是IoC 容器控制了对象;控制什么 阅读全文
posted @ 2012-02-21 17:23 kaitao1987 阅读(490) 评论(0) 推荐(0) 编辑