美文网首页
SPRING_AOP_实现

SPRING_AOP_实现

作者: 打瞌睡了丶丶丶 | 来源:发表于2018-09-06 23:22 被阅读0次

    xml配置实现aop

    1)需要导入jar包:
    spring-aop-4.3.5.RELEASE.jar
    aopalliance.jar
    aspectjrt.jar aspectj-1.8.2\lib
    aspectjweaver.jar aspectj-1.8.2\lib

    2)引入aop的名称空间

    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:context="http://www.springframework.org/schema/context"
        xmlns:aop="http://www.springframework.org/schema/aop"
        xsi:schemaLocation="http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/context
            http://www.springframework.org/schema/context/spring-context.xsd
            http://www.springframework.org/schema/aop
            http://www.springframework.org/schema/aop/spring-aop.xsd"> 
    

    3)创建切面类对象和aop配置

       <aop:config>
            <!-- 切入点,对哪些方法织入切面方法 -->
            <!-- 第一个* 任意访问权限(public、private等等) 
                com.rr.aop 包
                第二个*  包下面的任意类
                *(..)  任意名称和参数的方法
            -->
            <aop:pointcut expression="execution(* com.rr.aop.*.*(..))" id="pc"/>
            
            <!-- 切面类,通过ref指定对应的切面类的bean -->
            <aop:aspect ref="logAOP">
                <!-- 前置通知 ,执行目标方法前执行的方法 -->
                <aop:before method="before" pointcut-ref="pc"/>
                <!-- 后置通知 ,执行目标方法后执行的方法 -->
                <aop:after method="end" pointcut-ref="pc"/>
                <!-- 方法返回后通知 -->
                <aop:after-returning method="afterReturn" pointcut-ref="pc"/>
                <!-- 环绕通知 -->
                <aop:around method="around" pointcut-ref="pc"/>
            </aop:aspect>
       
       </aop:config>
    

    切入点表达式用法:

    参考帮助文档11.2.3 Declaring a pointcut
    Some examples of common pointcut expressions are given below.
    the execution of any public method: 
    execution(public * *(..))
    the execution of any method with a name beginning with "set": 
    execution(* set*(..))
    the execution of any method defined by the AccountService interface: 
    execution(* com.xyz.service.AccountService.*(..))
    the execution of any method defined in the service package: 
    execution(* com.xyz.service.*.*(..))
    the execution of any method defined in the service package or a sub-package: 
    execution(* com.xyz.service..*.*(..))
    any join point (method execution only in Spring AOP) within the service package: 
    within(com.xyz.service.*)
    any join point (method execution only in Spring AOP) within the service package or a sub-package: 
    within(com.xyz.service..*)
    any join point (method execution only in Spring AOP) where the proxy implements the AccountService interface: 
    this(com.xyz.service.AccountService)
    

    五类通知类型:
    前置通知[Before advice]:在连接点前面执行,前置通知不会影响连接点的执行,除非此处抛出异常。
    正常返回通知[After returning advice]:在连接点正常执行完成后执行,如果连接点抛出异常,则不会执行。
    异常返回通知[After throwing advice]:在连接点抛出异常后执行。
    返回通知[After (finally) advice]:在连接点执行完成后执行,不管是正常执行完成,还是抛出异常,都会执行返回通知中的内容。
    环绕通知[Around advice]:环绕通知围绕在连接点前后,比如一个方法调用的前后。这是最强大的通知类型,能在方法调用前后自定义一些操作。环绕通知还需要负责决定是继续处理join point(调用ProceedingJoinPoint的proceed方法)还是中断执行。

    4 注解方式实现aop
    @Aspect
    @PointCut
    @Before

    @Component
    @Aspect //指定当前类为切面类

    public class LogAop {
    
        // 指定切入点表单式: 拦截哪些方法; 即为哪些类生成代理对象
        @Pointcut("execution(* com.rr.xmlaop.MyDao.*(..))")
        public void pointcut(){
            
        }
        
        //前置通知 执行目标方法前执行
        @Before("pointcut()")
        public void begin(JoinPoint jp) {
            System.out.println("begin:");
            System.out.println(jp.getSignature().getName());
        }
        
        //后置通知,执行目标方法后执行,不论是否异常
        @After("pointcut()")
    //  public void end(){
        public void end(JoinPoint jp) throws Exception, SecurityException {
            
        }
        
        //正常返回后通知,调用目标方法结束后执行,在代理返回前执行,异常不执行
        @AfterReturning("pointcut()")
        public void afterReturn(){
            System.out.println("after return");
        }
        
        //环绕方法,必须使用ProceedingJoinPoint参数
        @Around("pointcut()")
        public void around(ProceedingJoinPoint pjp) throws Throwable{
            System.out.println("环绕前....");
            pjp.proceed();  // 执行目标方法
            System.out.println("环绕后....");
        }
    }
    

    aop的扫描
    <aop:aspectj-autoproxy></aop:aspectj-autoproxy>

    相关文章

      网友评论

          本文标题:SPRING_AOP_实现

          本文链接:https://www.haomeiwen.com/subject/fjifgftx.html