Spring AOP

切面是与业务功能垂直的

AOP的实现方式:

1、预编译 AspectJ

2、运行期动态代理(JDK动态代理,CGLib动态代理)

SpringAOP、JbossAop

概念

切面aspect:一个关注点模块化。比如事务切面。

连接点joinpoint:程序执行过程中特定的点。比如方法的开始。

通知Advice:在连接点上执行的动作

切入点PointCut:匹配连接点的断言。切点表达式

引入Introduction:在不修改类代码前提下,为类添加新的方法和属性

目标对象target Object:被一个或多个切面所通知的对象

AOP代理:Aop框架创建的对象。

织入weaving:把切面链接到其他的应用程序类型或者对象上

 

Advice类型

Before、After return、After throwing、After advice、Around、After

After advice:当连接点退出的时候执行的通知(不论是正常返回还是异常退出)

After时方法最后一条语句执行完执行,在return之后,在抛出异常之后

PointCut表达式

execution(public **(..))  执行所有public方法

execution(* set*(..))  执行所有set开始的方法

execution(* com.xyz.service.AccountService.*(..))执行AccountService类中所有的方法时

execution(* com.xyz.service..(..))  执行com.xyz.service包下所有方法时

execution(* com.xyz.service...(..))  执行com.xyz.service包和其子包下的所有方法时(3个点)

within(com.xyz.service.*)

within(com.xyz.service..*)

within用于匹配制定类型内的方法执行

this(com.xyz.service.AccountService) 用于匹配当前AOP代理对象类型的执行方法

target()目标类型匹配

args()参数类型匹配

@target()注解匹配

@annotation()

bean()

 

Around advice:

<aop:around method:"around" pointcut-ref="moocPointcut"/>

 

public Object around(ProceedingJoinPoint pjp){

  Object obj = null;

  try{

    obj = pjp.proceed();

  }catch(Throwable e){

    e.printStackTrace();

  }

}

 

introductions

允许一个切面声明一个实现指定接口的通知对象,并且提供了一个接口实现类来代表这些对象。

<aop:aspect..>

 <aop:declare-parents types-matching="com.biz.*(+)"

    implement-interface="com.fit"

    default-impl="cpm.fitImpl"/>

</aop:aspect>

 

@Test

public void testFit(){

  Fit fit = (Fit)super.getBean("aspectBiz");

  fit.filter();

}

将com.biz下类添加了父类Fit及父类的实现

 

1、Advisor:充当Advice和Pointcut的适配器,类似使用Aspect的@Aspect注解的类(前一章节所述)。一般有advice和pointcut属性。

祖先接口为org.springframework.aop.Advisor,应用中可直接使用org.springframework.aop.support.DefaultPointcutAdvisor

 

1、Adivisor是一种特殊的Aspect,Advisor代表spring中的Aspect 
2、区别:advisor只持有一个Pointcut和一个advice,而aspect可以多个pointcut和多个advice

 

posted on 2016-04-27 22:30  多看多学  阅读(162)  评论(0编辑  收藏  举报

导航