Spring入门Aop(3)

@·AOP基本概念及其特点
<1>什么是AOP<2>AOP基本概念<3>Spring的AOP
1)什么是AOP
AOP:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。
主要的功能是:日志记录,性能统计,安全控制,事务处理,异常处理等等。

2)对切面的理解
程序中的每一个模块或者说功能,任何一个模块中都要记录它的日志、事务、安全验证等等,给我们带来的工作量非常大。
当程序到达某种规模时,尤其是格式调整之类的,这种改动量是非常大的。如果通过切面方式,对开发人员是不可见的,默认地会对每一个子模块记录日志等这些工作。通过预编译或者动态代理的方式来执行这个功能,
对开发人员是透明,他不需要知道。
切面是和功能垂直的,也就是切面是横切与各个功能之上的
3)AOP实现方式
①预编译-AspectJ
②运行期动态代理(JDK动态代理、CGLib动态代理)-SpringAOP、JbossAOP
4)AOP几个相关概念
①切面—一个关注点的模块化,这个关注点可能会横切多个对象
②连接点–程序执行过程中的某个特定的点
③通知—-在切面的某个特定的连接点上执行的动作
④切入点–匹配连接点的断言,在AOP中通知和一个切入点表达式关联
⑤引入—-在不修改类代码的前提下,为类添加新的方法和属性
⑥目标对象-被一个或者多个切面所通知的对象
⑦AOP代理–AOP框架创建的对象,用来实现切面契约(包括通知方法执行等功能)
⑧织入—把切面连接到其他的应用程序类型或者对象上,并且创建一个被通知的对象,分为:编译时织入,执行时织入

Spring的AOP实现
纯java实现,无需特殊的编译过程·,不需要控制类加载器层次
目前只支持方法执行连接点(通知Spring Bean的方法执行)
不是为了提供最完整的AOP实现(尽管它非常强大);而是侧重于提供一种AOP实现和Spring IOC容器之间的整合,用于帮助解决企业应用中的常见问题
·Spring AOP不会与AspectJ竞争,从而提供综合全面的AOP解决方案。

有接口和无接口的Spring AOP实现区别
Spring AOP默认使用标准的JAVASE动态代理作为AOP代理,使得任何接口(或者接口集)都可以被代理
Spring AOP中也可以使用CGLIB代理(如果一个业务对象并没有实现一个接口)

Schema–based AOP
Spring所有的切面和通知器都必须放在一个< aop:config>内(可以配置包含多个< aop:config>元素),每一个< aop:config>可以包含pointcut,advisor和aspect元素
(它们必须按照这个顺序进行声明)
< aop:config>风格的配置大量使用了Spring的自动代理机制。

使用ExpressionPointcut接口

Spring2.0在Pointcut的基础上引入了一个ExpressionPointcut接口.通过切入点表达语言来描述切入点.有了ExpressionPointcut可以更加简单的方式来描述切入点.

切入点指示符用来指示切入点表达式目的,在Spring AOP中目前只有执行方法这一个连接点,Spring AOP支持的AspectJ切入点指示符如下:
execution:用于匹配方法执行的连接点
within:用于匹配指定类型内的方法执行
this:用于匹配当前AOP代理对象类型的执行方法,注意是AOP代理对象的类型匹配,这样就可能包括引入接口也类型匹配
target:用于匹配当前目标对象类型的执行方法;注意是目标对象的类型匹配,这样就不包括引入接口也类型匹配
args:用于匹配当前执行的方法传入的参数为指定类型的执行方法
@within:用于匹配所持有指定注解类型内的方法
@target:用于匹配当前目标对象类型的执行方法,其中目标对象持有指定的注解
@args:用于匹配当前执行的方法传入的参数持有指定注解的执行
@annotation:用于匹配当前执行方法持有指定注解的方法

AspectJ切入点支持的切入点指示符还有:call、get、set、preinitialization、staticinitialization、initialization、handler、adviceexecution、withincode、cflow、cflowbelow、if、@this、@withincode;但Spring AOP目前不支持这些指示符

AspectJ类型匹配的通配符:
*:匹配任何数量字符
..:匹配任何数量字符的重复如在类型模式中匹配任何数量子包,而在方法参数模式中匹配任何数量参数
+:匹配指定类型的子类型,仅能作为后缀放在类型模式后边
例如excution(*Money(..)),配合”ProxyFactoryBean”的target,表示执行所有Component的带有”Money”的方法.

@声明after throwing advice(抛出异常后通知)的两种方式
aop:after 所指定的切面方法,会在对应类中的方法执行完后再执行。

before所指定的切面方法 会在监控的方法执行前执行;
after-returning所指定的切面方法 会在监控方法正常执行结束后执行;
after-throwing所指定的切面方法 会在监控方法抛出异常时执行;
after所指定的切面方法 会在监控方法执行结束后,无论方法执行时是否有异常抛出,均会执行此切面方法。

< aop:before method=”before” pointcut-ref=”moocPiontcut”> 指的是切面MoocAspect中的方法,会在业务类中的方法执行之前被执行。 method=”before”中的before就是切面MoocAspect中的方法
after finally advice 执行完finally后执行的切面方法。
after-throwing. 当抛出某个异常时,需要调用的切面方法。

//相关代码——(下):
< aop:config>
< aop:aspect id=”moocAspectAOP” ref=”moocAspect”>
< !– 起到切入(关联)作用 –>

< !– 在aop:pointcut执行之前会执行前置通知 –>
< aop:before method=”before” pointcut-ref=”moocPiontcut”>
< !– 在aop:pointcut执行之后会执行返回后通知 –>
< aop:after-returning method=”afterReturning” pointcut-ref=”moocPiontcut”>< /aop:after>
< !– 在aop:pointcut执行碰到异常会执行该通知。如果有异常抛出,则after returning advice会失效。 –>
< aop:after-throwing method=”afterThrowing” pointcut-ref=”moocPiontcut”>< /aop:after>
< !– 无论是否有异常,结束后都会加上这条(finally) –>
< aop:after method=”after” pointcut-ref=”moocPiontcut”>
< aop:around method=”around” pointcut-ref=”moocPiontcut”>
< !– 参数名称要一致–>
< aop:around method=”aroundInit” pointcut=”execution(* com.imooc.aop.schema.advice.biz.AspectBiz.init(String,int))
and args(bizName,times)”/>
< /aop:aspect>
< /aop:config>
< /beans>

around表示在一个方法执行前或者后执行

< aop:around method=”around” pointcut-ref=”pointcut”/>

需要在around中加上ProceedingJoinPoint的参数,proceed是执行业务方法,表示在这个方法前后执行输入输出

public Object around(ProceedingJoinPoint pjp) throws Throwable {
System.out.println(“Around start…”);
Object obj = pjp.proceed();
System.out.println(“Around stop…”);
return obj;
}

带参数的方法实现around,在配置中使用直接配置切入点,需要配置对应方法的参数类型,和形参的名称

< aop:around method=”around”
pointcut=”execution(* com.aspect.AspectBiz.init(String, int)) and args(name, time)” />
< /aop:aspect>

在around方法中,可以通过这两个参数,对其进行操作

public Object around(ProceedingJoinPoint pjp, String name, int time) throws Throwable {
System.out.println(name + ” ” + time);
System.out.println(“Around start…”);
Object obj = pjp.proceed();
System.out.println(“Around stop…”);
return obj;
}
advice parameters指定具体某个方法(带参数)的配置方式,参数可以被对应的advice方法使用,一下以aroud为例< aop:aroud method=”aroundInit” pointcut=”exeution”(*com.imooc.aop.schema.advice,biz.AspectBiz.init(String,int))and args(bizName,times)”/>

基于XML Schema的引介

Spring中提供了< aop:declare-parents types-matching=”” implement-interface=”” delegate-ref=”” >元素来支持传统AOP中的引介.该标签要在< aop:aspect>下使用,不需要定义切入点.
其中types-matching:表示要应用引介的目标对象(全限类名,可使用AspectJ提供的通配符)
implements-interface:表示要引入的新接口
delegate-ref:表示新接口的实现类(关联bean),或者使用default-imp属性,该属性指定新接口的实现类(全限类名)
@Introductions(简介):
1、简介允许一个切面声明一个实现指定接口的通知对象,并且提供了一个接口实现类来代表这些对象。
2、由 < aop:aspect>中的< aop:declare-parents>元素声明该元素用于声明所匹配的类型拥有一个新的parent。
基于配置文件的aspects只支持singleton model
为匹配到的类型强制制定一个父类 故是可以强制类型转换的

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值