关闭

spring aop

标签: springaop
141人阅读 评论(0) 收藏 举报
分类:

Aspect(切面):集成了各种通知(Adivce)
JoinPoint(连接点):方法的调用
Adivce(通知):对切入点的额外处理。around,before,after,after-returning等
Pointcut:可以插入通知的连接点
ProceedingJoinPoint 只能处理环绕通知

配置文件:

<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:tx="http://www.springframework.org/schema/tx"
 xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="
              http://www.springframework.org/schema/context
      http://www.springframework.org/schema/context/spring-context.xsd
            http://www.springframework.org/schema/beans 
            http://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/aop 
            http://www.springframework.org/schema/aop/spring-aop.xsd
            http://www.springframework.org/schema/tx 
           http://www.springframework.org/schema/tx/spring-tx.xsd">
  <context:annotation-config />
  <context:component-scan base-package="com.xll"/>
  <bean id="teacher" class="com.xll.Teacher"/>
  <bean id="aspectTest" class="com.xll.AspectTest"/>
  <aop:config >
    <aop:pointcut expression="execution(* com.xll.Teacher.*(..))" id="joinpoint"/>
    <aop:aspect ref="aspectTest">
        <aop:around method="around" pointcut-ref="joinpoint"/>
        <aop:before method="before" pointcut-ref="joinpoint"/>
        <aop:after method="after" pointcut-ref="joinpoint"/>
        <aop:after-returning method="returnAfter" pointcut-ref="joinpoint" returning="re"/>
    </aop:aspect>
  </aop:config>
</beans>

切面代码:

package com.xll;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
public class AspectTest {   
    public Object around(ProceedingJoinPoint pp) throws Throwable
    {
        System.out.println("around增强处理开始,为方法参数赋值!");
        Object[] args = pp.getArgs();
        if(args[0] != null)
            args[0] = "小明";
        Object obj = pp.proceed(args);
        return obj; 
    }
    public void before(JoinPoint jp){
        System.out.println("方法" + jp.getSignature().getName() + "即将被执行!");
    }
    public void after(JoinPoint jp){
        System.out.println("方法" + jp.getSignature().getName() + "已经执行完了!");
    }
    public void returnAfter(JoinPoint jp , Object re){
        System.out.println("我到底在哪?" + re);
    }
}

最终运行结果:

环绕通知中需要有返回值,afterreturning的re中才会有值!
顺序是:around,before,after,afterreturning
其中环绕通知可以对目标方法的中参数进行修改

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:66862次
    • 积分:1770
    • 等级:
    • 排名:千里之外
    • 原创:106篇
    • 转载:41篇
    • 译文:1篇
    • 评论:11条
    最新评论