s2sh框架-课件3-springSpring开发培训_第1页
s2sh框架-课件3-springSpring开发培训_第2页
s2sh框架-课件3-springSpring开发培训_第3页
s2sh框架-课件3-springSpring开发培训_第4页
s2sh框架-课件3-springSpring开发培训_第5页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第三章:Spring

AOP目标:本章旨在向学员介绍:1)2)时间:学时2教学方法:AOP是什么面向方面编程(Aspect

Oriented

Programming)OOP的补充及延续AOP和OOD/OOP并不

完全可以在一个应用系统中同时应用OOD/OOP和AOP设计思想,通过OOD/OOP对系统中的业务对象进行建模,同时通过AOP对实体处理过程中的阶段进行

处理。Spring

AOP是基于Spring

IoC基础上所做的扩展把程序分解为方面或关注点,使程序员可以把精力集中在他们专注的领域AOP还有另外一个重要特点:源码组成无关性。为了实现源码组成无关性,AOP往往通过预编译方式(如AspectJ)和运行期动态 模式(如Spring

AOP

和JBossAOP)实现。3Without

AOP4With

AOP5Without

AOP:

当抛出异常时发送public

class

AccountManagerImpl

implements

AccountManager

{private

AccountDAO

accountDAO;private

void

sendMail(Exception

ex)

{...}public

Account

getAccount(String

accountId)throws

AccountNotFoundException,

DataAccessException

{try

{return

this.accountDAO.findAccount(accountId);}

catch(AccountNotFoundException

ex)

{sendMail(ex);throw

ex;}

catch(DataAccessException

ex)

{sendMail(ex);throw

ex;}}public

void

createAccount(Account

account)

throws

DataAccessException

{try

{this.accountDAO.saveAccount(account);}

catch(DataAccessException

ex)

{sendMail(ex);throw

ex;}6Without

AOP:当抛出异常时发送7With

AOP:当抛出异常时发送public

class

AccountManagerImpl

implements

AccountManager

{AccountDAO

accountDAO;public

void

setAccountDAO(AccountDAO

accountDAO)

{this.accountDAO

=

accountDAO;}public

Account

getAccount(String

accountId)throws

AccountNotFoundException,

DataAccessException

{return

this.accountDAO.findAccount(accountId);}public

void

createAccount(Account

account)

throws

DataAccessException

{this.accountDAO.saveAccount(account);}public

class

NotificationThrowsAdvice

implements

ThrowsAdvice

{private

void

sendMail(Exception

ex)

{...}publicvoid

afterThrowing(Exception

ex)

throws

Throwable

{this.sendMail(ex);}}8With

AOP:当抛出异常时发送<bean

id="accountManager

"

class="com.trivadis.aop.AccountManagerImpl"><property

name="accountDAO"><ref

bean="accountDAO"/></property></bean><bean

id="

NotificationThrowAdvice"class="com.trivadis.aop.

NotificationThrowsAdvice"><property

name="mailSender"><ref

bean="mailSender"/></property></bean><bean

id="accountManagerBeanNameProxyCreator”class="

.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"><property

name="beanNames"><value>accountManager

</value></property><property

name="interceptorNames"><list>NotificationThrowAdvice</value><value></list></property></bean>9With

AOP:当抛出异常时发送10为何使用AOP高度模块化,使得

的系统更易实现和更易使每个模块承担的责任更清晰,提高代码的可追踪性解决设计时两难的局面,在不需改动原先代码的情况下推迟不必要的需求的实现提高代码的重用性加速系统的开发和部署,提高程序员的开发效率降低系统开发的成本11AOP应用范围,优化,)Persistence(持久化)Transaction

management(事务管理)Security(安全)Logging,tracing,profiling and

monitoring(日志,Debugging(调试)Authentication(认证)Context

passing(上下文传递)Error/Exception

handling(错误/异常处理)Lazy

loading(懒加载)Performance

optimization(性能优化)Resource

pooling(资源池)Synchronization(同步)12概念Joinpoint(连接点)–接点是一个程序执行过程中的特定点。典型的连接点包括对一个方法的调用、方法执行的过程本身、类的初始化、对象的实例化等。–

连接点是AOP概念之一,它用来定义在程序的什么地方能通过AOP加入额外的逻辑。Advice(通知)–

在某一个特定的连接点处运行的代码称为“通知”。通知有很多种,比如在连接点之前执行的前置通知(befor

advice)和在连接点之后执行的后置通知(afteradvice)。Pointcut(切入点)切入点是用来定义某一个通知该何时执行的一组连接点。通过创建切入点,可以精确地控制程序中什么组件接到什么通知。例如:之前 提到过,一个典型的连接点是方法的调用,而一个典型的切入点就是对某一个类的所有方法调用的集合。通常通过类名和方法名,或者匹配类名和方法式样的正则表达式来指定切入点。一些AOP支持动态切入点,在运行时根据条件决定是否应用切面,如方法参数值。Aspect(方面)通知和切入点的组合叫方面。这个组合定义了一段程序中应该包括的逻辑以及何时应该执行该逻辑。13概念Weaving(织入)–织入是将方面真正加入程序代码的过程。对于编译时AOP方案而言,织入自然是在编译时完成的,它通常是作为编译过程中的一个额外步骤。类似地,对于运行时AOP方案,织入过程是在程序运行时动态执行的。•object(目标对象)–

如果一个对象的执行过程受到某个AOP操作的修改,那么它就叫做一个目标对象。目标对象通常也称为被通知对象。Introduction(引入)–通过引入,可以在一个对象中加入新的方法或字段,以改变它的结构。你可以使用引入来让任何对象实现一个特定接口,而不需要这个对象的类显示地实现这个接口。AOP

proxy(AOP

)–是将通知应用到目标对象后创建的对象。对于客户对象来说,目标对象(应用AOP之前的对象)和 对象(应用AOP之后的对象)是一样的。也就是,应用系统的其他部分不用为了支持

对象而改变。Advisor(顾问)–

在Spring中,一个advisor就是一个aspect的完整的模块化标识。一般地,一个advisor包括切入点和通知,是切入点和通知的配置器。14AOP

模型ProxyObjectAdviceAdvisorPointcutJoinPoint15AOP原理(图1-理解))示例:SpringAOP01(Without示例:SpringAOP02(静态

示例:SpringAOP03(动态))静态

对象与被

对象都必须实现同一个接口。在

对象中可以实现日志记录等相关服务,并在需要的时候再呼叫被 的对象;被

对象当中就可以仅保留业务相关的职责。动态

:在程序运行时,运用反射机制动态创建而成。16AOP原理(图2)Advisor/InterceptorAOPProxyreturnCallerMethodAdvisor/InterceptorCaller

invokes

proxy,notProxy

invokesinterceptorsForward

processing

of

interceptorchain

concludes

with

invocationof

method

on

objectControl

flows

backthrough

interceptor

chainto

return

result

to

caller1718通知的类型(掌握)编写adviceBefore

advice(前置通知)After

returning

advice(返回后通知)Throws

advice(抛出通知)Around

advice(环绕通知)示例:SpringAOP04(Before

advice)示例:SpringAOP05(After

Returning

Adivce)19Around

Advice

Demo(掌握)public

class

PerformanceMonitorDetailInterceptorimplements

MethodInterceptor

{protected

final

Log

logger

=

LogFactory.getLog(getClass());public

Object

invoke(MethodInvocation

invocation)

throws

Throwable

{String

name

=invocation.getMethod().getDeclaringClass().getName()+

"."+

invocation.getMethod().getName();StopWatchsw

=

new

StopWatch(name);sw.start(name);Object

rval

=

ceed();sw.stop();(sw.prettyPrint());return

rval;}}示例:SpringAOP06_01(Around

Advice)Around

Advice

Demo(了解)<bean

id="perfMonInterceptor"class="...PerformanceMonitorDetailInterceptor"/><bean

id="performanceAdvisor"class="

.springframework.aop.support.RegexpMethodPointcutAdvisor"><property

name="advice"><ref

local="perfMonInterceptor"/></property><property

name="patterns"><list><value>.*find.*</value><value>.*save.*</value><value>.*update.*</value></list></property></bean>示例:SpringAOP06_02(Around

Advice

RegexpMethodPointcutAdvisor)20After

Throwing

Advice

Demo(掌握)public

class

ExceptionLogger

implements

ThrowAdvice

{protected

final

Log

logger

=

LogFactory.getLog(getClass());public

void

afterThrowing(Method

m,

Object[]

args,ObjectThrowable

ex)

throws

Throwable

{,logger.log(Level.INFO,

arg[0]+“执行”+

method.getName+“时有异常抛出…”+ex);}}示例:SpringAOP07_01(Throws

Advice)21After

Throwing

Advice

Demo(Advisor)<bean

id=“exceptionLogger"class="...

ExceptionLogger

"/><bean

id=“exceptionLoggerAdvisor"class="

.springframework.aop.support.RegexpMethodPointcutAdvisor"><property

name="advice"><ref

local="exceptionLogger

"/></property><property

name="patterns"><value>.*</value></property></bean>示例:SpringAOP07_02(Throws

Advice)22切入点的接口前、编写advisor–

之前,

所定义的Adivce都是直接织入至后或者在异常发生时;事实上还可以定义更细的织入时机:Pointcut定义了Advice的应用时机;在Spring中,使用PointcutAdvisor将Pointcut与Advice结合成为一个对象;Spring内建的Pointcut都有对应的PointcutAdvisor。23切入点的类型静态NameMat

ethodPointcut匹配方法名称无法对重载(Overload)的方法名进行匹配,因为它仅对方法名进行匹配,不会考虑参数相关信息,而且也没有提供可以指定参数匹配信息的途径。–RegexpMethodPointcut根据正则表达式计算切入点,要匹配完整的类名和方法名对应的Advisor是RegexpMethodPointcutAdvisor,会根据当前JDK版本来决定使用JdkRegexpMethodPointcut

,还是Perl5RegexpMethodPointcut

。动态–

ControlFlowPointcut24NameMatethodPointcut

Demo(掌握)<bean

id="nameMat

ethodPointcut"ethodPointcut">class="

.springframework.aop.support.NameMat•<property

name="mappedName"><value>

o*</value></property></bean>02例子中直接把切入点放入Advisor中,不像01例子中那样还需要单独定义切入点。示例:SpringAOP08_01(NameMat示例:SpringAOP08_02(NameMatethodPointcut)ethodPointcutAdvisor)25RegexpMethodPointcut

Demo<bean

id="gettersAndSettersPointcut"class="

.springframework.aop.support.

RegexpMethodPointcut"><property

name="patterns"><list><value>.*\.get.*</value><value>.*\.set.*</value></list></property></bean>2627正则表达式符号说明(了解)SymbolDescriptionExample.匹配任何单个字符setFoo.匹配

setFooB,但不匹配setFoo

setFooBar+匹配前一个字符一次或多次setFoo.+匹配

setFooBar

andsetFooB,但不匹配

setFoo*匹配前一个字符零次或多次setFoo.*

匹配

setFoo,setFooB

和setFooBar\匹配任何正则表达式符号\.setFoo.匹配

.setFooB,但不匹配setFoo示例:SpringAOP09(Rege

xpMethodPointcutAdvisor)ControlFlowPointcut

Demo(了解)oFlowControlPointcut"/>class="

.springframework.aop.support.ControlFlowPointcut"><constructor-arg><value>neu.danny.Some</value></constructor-arg></bean><bean

id="

oAdvisor"class="

.springframework.aop.support.DefaultPointcutAdvisor"><property

name="advice"><ref

bean="logBeforeAdvice"/></property><property

name="pointcut"><bean

id="

oFlowControlPointcut"•••••••••••••••<ref

bean="</property></bean>示例:SpringAOP10ControlFlowPointcut是Spring所提供的类:判断在方法的执行堆栈中,某个指定类的某个方法中,是否曾经要求您的目标对象执行某个动作,由于这是在执行时期才会确定是否介入Advices,因此是Spring提供的动态Pointcut功能。28ProxyFactoryBean是什么创建AOP

proxy的基本方法,结合Spring的IoC容器一起使用使用ProxyFactoryBean最大的优点是:通知和切入点都可以被Spring的IoC管理起来通过使用Java的动态

或CGLIB,能够

接口或class29ProxyFactoryBean的主要属性•–

的目标对象proxyInterfaces–

生成的

类需要实现的接口列表interceptorNames–

作用于或顾问名字的列表singleton–

工厂返回的

类是否为单实例proxy–

是否Class目标类,而不是实现接口30ProxyFactoryBean

Demo<!--目标对象等--><beanid=" "

class="eg.Impl"><property

name="name"><value>Tony</value></property><property

name="age"><value>51</value></property></bean><bean

id="myAdvisor"

class="eg.MyAdvisor"><property

name="someProperty"><value>Something</value></property></bean><bean

id="debugInterceptor"

class="...erceptor.NopInterceptor"></bean>31ProxyFactoryBean

Demo(接口)<bean

id=""class="...aop.framework.ProxyFactoryBean"><property

name="proxyInterfaces"><value>eg.</property><property

name="<ref

local="</value>">"/></property><property

name="interceptorNames"><list><value>myAdvisor</value><value>debugInterceptor</value></list></property></bean>32ProxyFactoryBean

Demo(类)<bean

id="

"class="...aop.framework.ProxyFactoryBean">Class">"><property

name="proxy<value>true</value></property><property

name="<ref

local=""/></property><property

name="interceptorNames"><list><value>myAdvisor</value><value>debugInterceptor</value></list></property></bean>33自动,不需要使用ProxyFactoryBean为每个bean能够自动创建生成一个避免为每个的目标对象显式的创建一个自动

的两个默认实现BeanNameAutoProxyCreatorDefaultAdvisorAutoProxyCreator3435BeanNameAutoProxyCreator

Demo<bean

id="employee1"

class="eg.Employee">...</bean><bean

id="employee2"

class="eg.Employee">...</bean><bean

id="myInterceptor"

class="eg.DebugInterceptor"/><bean

id="beanNameProxyCreator"class="...aop.framework.autoproxy.BeanNameAutoProxyCreator"><property

name="beanNames"><value>employee*</value></property>

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论