版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第三章: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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 第一次月考卷03(全解全析)
- 2024销售智能客服与CRM超兔一体云平台合同3篇
- 2025届新疆生产建设兵团图木舒克市三年级数学第一学期期末学业水平测试模拟试题含解析
- 浙江2024年浙江省有色金属地质勘查院选调专业技术人员历年参考题库(频考版)含答案解析
- 2024苏州房屋买卖合同贷款服务合作协议3篇
- 2024船舶租赁合同
- 2024物流管理专业实训基地合作研发合同3篇
- 2024年特色乡土树苗保护与采购合同范本3篇
- 2024版工厂生产流程承包合同书版B版
- 2024版建筑行业广告发布合同
- 《安的种子》幼儿故事
- 机械工程师笔试题目
- 实用卫生统计学题库(附参考答案)
- 浙江省杭州市拱墅区2023-2024学年数学三年级第一学期期末质量检测试题含答案
- 伤口敷料种类及作用-课件
- 电力安全工作规程(变电部分)课件
- 高考语文复习:作文主题训练自然情怀
- 减速机基础知识-课件
- 2023年小学生六年级毕业班评语
- 单位干部职工捐款情况统计表
- 环保设施安全风险告知卡
评论
0/150
提交评论