Spring笔记5---Spring AOP编程

1. JointPoint接口。一般直接使用它的子接口ProceedingJointPoint。

    如果开发者不需要修改传入目标操作参数,则直接调用pjp.proceed()无参方法即可,如需要修改过目标参数,则需要调用

    pjp.proceed(java.lang.Object[])方法。

    代码片段:

 

 

@Pointcut("execution(public * test.service..*(..))&&args(str)")
public void service(String str){}

@Around("service(str)"+"&&target(obj)&&this(proxy)")
public Object aroundAspect(ProceedingJointPoint pjp,String str,Object obj,Object proxy){
 .......

 try{
    str="s.s.lazio";
    return pjp.proceed(new Object[]{str});  //修改了str的值
  }catch(Throwable e){
      ......
   }
}

 2. Ordered接口和@Order注解

 

    如下例中LoggingBeforeAspect1作用的@Order注解取值更小,因此比LoggingBeforeAspect2先被触发

 

@Aspect   
@Order(2)
public class LoggingBeforeAspect1{
  .......
}

@Aspect
@Order(8)
LoggingBeforeAspect2{
......
}
 

    而实现Ordered接口方法则看返回值的大小,如下:

 

@Aspect 
public class LoggingBeforeAspect1 implements Ordered{
   public int getOrder(){
     return 2;
  }
}


@Aspect   
public class LoggingBeforeAspect2 implements Ordered{
   public int getOrder(){
     return 8;
  }
}
 

 

3. pointcut表达语言

 

    示例如下:

 

execution(public * test.service..*(..))
  

    其中public指可见性模式,指定了目标方法的可见性;第一个*指定了返回类型模式,即各种返回类型,包括void;test.service..指定声明类型模式,即service包及其子包中所有java 类型;第二个*指定了方法名模式,即所有方法;第二个*后面的..指定了参数模式,即含有若干参数,包括无参情况。

    +表示子类,比Info+表示Info类及其子类。

 

4. Spring 2.x的关键字

 

    execution

 

    within

 

    @within

 

    this

 

    target

 

    @target

 

    args

 

    @args

 

    @annotation

 

    bean

 

 

5. 基于<aop:config/>元素的AOP。(在不满足jdk5以下系统可采用此基于xml的aop编程)

 

<aop:pointcut/> : 用于指定pointcut表达式,id属性是指定表达式的唯一名称。注意expression中,不能像annotation一样,xml要用"and"和"or"替代"&&"和"||",另外非运算用"not"代替"!"

 

 

<aop:config>
<aop:pointcut id="before" expression="test.aspect.LoggingBefore.before() and args(str) and target(obj) and this(proxy)">

<aop:aspect ref="loggingBeforeAspect">
  <aop:before pointcut-ref="before" method="beforeAspect"/>
</aop:aspect>

</aop:config>

 

常见的<aop:config/>元素支持的其他装配:

 

<aop:before/>,<aop:after-returning/>,<aop:after-throwing/>,<aop:after/>,<aop:around/>,<aop:declare-parents/>

 

 

<aop:advisor/>元素:

Advisor对象是个特殊的切面,仅仅包含单个装备。

 

 

<bean id="simpleTraceInterceptor" class="...."/>

<aop:config>
<aop:pointcut id="all" expression="execution(public void or String test.service..*(..))"/>

<aop:advisor advice-ref="simpleTraceInterceptor" pointcut-ref="all"/>

</aop:config>

你可能感兴趣的:(spring,AOP,编程,bean,xml)