08、Spring框架入门:AspectJ

AspectJ

我们目前使用AOP的不足?
我们目前使用的schema Baes 实现的方式,发现了每一个通知都需要实现对应的接口,每一个接口中就是一个方法,这样的书写方式比较的麻烦的,我们想所有的方法都在一个类中书写就比较方便了


Aspect J方式实现:
Aspect J方式实现
我们发现 Aspect J的方式虽然可以把所有的通知都结合到一起,书写方便,但是获得切点中的参数和切点所在的类的时候比较的繁琐


两种方式的使用场景:

  • schema base :如果我们需要使用切点中的参数或者切点所在的类对象的时候
  • aspect J:就是简单的给切点增加通知的时候使用这个方式比较简单

具体实现:

package com.test;

import com.pojo.User;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Test2 {
   
     

    public static void main(String[] args) {
   
     
        ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext2.xml");
        User us = app.getBean("us", User.class);
        us.a();
    }
}

package com.advice;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

//@Component
//@Aspect
public class AspectJAdvice {
   
     
    //前置通知方法
    //@Before("execution(* com.pojo.User.a())")
    public void beforAd(JoinPoint joinPoint) {
   
     
        System.out.println("前置通知");
    }
    //后置通知方法
    public void afterAd() {
   
     
        System.out.println("后置通知");
    }
    //环绕通知方法
    public Object aroundAd(ProceedingJoinPoint point) throws Throwable {
   
     
        System.out.println("环绕通知--前");
        Object o = point.proceed();
        System.out.println("环绕通知--后");
        return o;
    }

    //异常通知方法
    public void throwsAd() {
   
     
        System.out.println("异常通知");
    }
}

<?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:context="http://www.springframework.org/schema/context"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="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/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx.xsd">
    <bean id="us" class="com.pojo.User"></bean>

    <!--配置通知类的对象-->
    <bean id="aps" class="com.advice.AspectJAdvice"></bean>

    <aop:config>
        <aop:aspect ref="aps">
            <aop:pointcut id="pt" expression="execution(* com.pojo.User.a())"></aop:pointcut>
            <!--给切点增加对应的通知-->
            <aop:before method="beforAd" pointcut-ref="pt"></aop:before>
            <!--无论切点中方法是否有异常,这个后置通知都会执行-->
            <aop:after method="afterAd" pointcut-ref="pt"></aop:after>
            <!--只有切点中的方法没有异常的时候才会执行这个通知-->
            <!--<aop:after-returning method="afterAd" pointcut-ref="pt"></aop:after-returning>-->
            <aop:around method="aroundAd" pointcut-ref="pt"></aop:around>
            <aop:after-throwing method="throwsAd" pointcut-ref="pt"></aop:after-throwing>
        </aop:aspect>
    </aop:config>
</beans>

运行结果:
*