让我们说一下AOP吧

前言

  如果您觉得有用的话,记得给博主点个赞,评论,收藏一键三连啊,写作不易啊^ _ ^。
  而且听说点赞的人每天的运气都不会太差,实在白嫖的话,那欢迎常来啊!!!


让我们说一下AOP吧

1、AOP是什么?

我们都知道的AOP是用来面向切面编程,目的是为了解耦。
但是除了概念以外,你会用吗,这一章就让我们来说一说AOP。

1.1、首先让我们说一下关于AOP的组成。

总结了一下,总共4点。
(1)切面
代码层面,使用@Aspect注解 来声明一个切面,即当你的类上被@Aspect声明的时候,就表示这个类为切面类,当然除了这个注解外,你也要加上另一个注解@Component或者等待,原因就不说明了,毕竟这个切面类写的再好,该bean没有注入了,不是也没用。
(2)建言
使用 @before,@After,@Around等注解建立建言
这里有个重点我要说一下,即建言的执行顺序。
在这里插入图片描述
注:当同一个方法被多个注解了@Aspect的类拦截时,可以通过@Order指定Aspect类的执行顺序,此时的执行顺序为:
在这里插入图片描述
3、切点
拦截规则为切点(PointCut)。
4、连接点
符合条件的每一个连接处。


1.2、实现方式种类

Spring AOP中的动态代理主要有两种方式,JDK动态代理和 cglib 动态代理


1.3、AOP的相关概念

(1)横切关注点:对哪些方法进行拦截,拦截后怎么处理,这些关注点称之为横切关注点
(2)Aspect(切面):通常是一个类,里面可以定义切入点和通知
(3)JointPoint(连接点):程序执行过程中明确的点,一般是方法的调用。被拦截到的点,因为Spring只支持方法类型的连接点,所以在Spring中连接点指的就是被拦截到的方法,实际上连接点还可以是字段或者构造器
(4)Advice(通知):AOP在特定的切入点上执行的增强处理,有before(前置),after(后置),afterReturning(最终),afterThrowing(异常),around(环绕)
(5)Pointcut(切入点):就是带有通知的连接点,在程序中主要体现为书写切入点表达式
(6)weave(织入):将切面应用到目标对象并导致代理对象创建的过程
(7)introduction(引入):在不修改代码的前提下,引入可以在运行期为类动态地添加一些方法或字段
(8)AOP代理(AOP Proxy):AOP框架创建的对象,代理就是目标对象的加强。Spring中的AOP代理可以使JDK动态代理,也可以是CGLIB代理,前者基于接口,后者基于子类


1.4、Advice通知类型

(1)Before:在目标方法被调用之前做增强处理
(2)AfterReturning:在目标方法正常完成后做增强
(3)AfterThrowing:主要用来处理程序中未处理的异常
(4)After:在目标方法完成之后做增强
(5)Around:环绕通知,在目标方法完成前后做增强处理,环绕通知是最重要的通知类型,像事务,日志等都是环绕通知,注意编程中核心是一个ProceedingJoinPoint

2、AOP编码例子

废话不多说,直接上干货。

/**
 * AOP切面练习
 * @author yangzhenyu
 * */
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@Documented
public @interface AopTest {
    
    
    String name() default "";
}


/**
 * AOP切面练习
 * @author yangzhenyu
 * */
@Aspect
@Component
public class AopTestAspect {
    
    
    private static Logger log = LoggerFactory.getLogger(AopTestAspect.class);
    @Pointcut("@annotation(com.yzy.demo.aop.annotation.AopTest)")
    public void pointcut(){
    
    };

    /**
     * 注解式拦截
     * */
    @Before("pointcut()")
    public void before(JoinPoint joinPoint){
    
    
        MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
        Method method = methodSignature.getMethod();
        AopTest aopTest = method.getAnnotation(AopTest.class);
        log.info("=============【@Before】=【{}】,当前执行的方法名:【{}】================",aopTest.name(),method.getName());
    }
    /**
     * 注解式拦截
     * */
    @AfterReturning(returning = "obc",pointcut = "pointcut()")
    public void afterReturning(JoinPoint joinPoint,Object obc){
    
    
        log.info("=============【@AfterReturning】=【方法规则拦截】,返回数据:【{}】================",obc.toString());
    }
    /**
     * 方法规则式拦截
     * */
    @After("execution(* com.yzy.demo.test.service.TestAopTransactionalService.*(..))")
    public void after(JoinPoint joinPoint){
    
    
        MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
        Method method = methodSignature.getMethod();
        log.info("=============【@After】=【方法规则拦截】,当前执行的方法名:【{}】================",method.getName());

    }
}

猜你喜欢

转载自blog.csdn.net/weixin_38316697/article/details/115904849