• Spring-Aop梳理


    org.springframework.aop.config.internalAutoProxyCreator
    -->AnnotationAwareAspectJAutoProxyCreator
    
    AnnotationAwareAspectJAutoProxyCreator 重写了initBeanFactory
    	AspectJAwareAdvisorAutoProxyCreator
    		AbstractAdvisorAutoProxyCreator (重写了setbeanFactory)
    			AbstractAutoProxyCreator
    				AbstractAutoProxyCreator 
    					-->implements SmartInstantiationAwareBeanPostProcessor, BeanFactoryAware
    


    Aop原理就是:首先通过@EnableAspectJAutoProxy注册了AnnotationAwareAspectJAutoProxyCreator类型的组件

    然后这个组件在前后会拦截创建,也就是在创建前,就是实例化前,会判断,如果被拦截下来,使用动态代理创建,否则再使用基本的反射创建。

    动态代理创建完成后,对象就被包装成了增强对象,这个对象的这个方法就具有切面的功能了。

    最最最最清晰讲解:https://www.bilibili.com/video/BV1ME411o7Uu?p=35

    具体的后面切面顺序,首先获取这些代理对象的增强器,形成chain链,然后调用process,反射调用方法,递归调用,然后层层返回,最后执行完成。

    具体使用:

    package com.nxj.aop;
    
    /**
     * @author ningxinjie
     * @date 2021/1/17
     */
    public class AopTest {
        public void myAopTestMethod(){
            System.out.println("myAopTestMethod~~~");
        }
    }
    
    package com.nxj.aop;
    
    import org.aspectj.lang.JoinPoint;
    import org.aspectj.lang.ProceedingJoinPoint;
    import org.aspectj.lang.annotation.*;
    
    /**
     * @author ningxinjie
     * @date 2021/1/17
     */
    @Aspect
    public class LogAspects {
    
        @Pointcut("execution(public * com.nxj.aop.AopTest.myAopTestMethod())")
        public void pointCut(){};
    
        @Before(value = "execution(public * com.nxj.aop.AopTest.myAopTestMethod())")
        public void logBefore(JoinPoint joinPoint){
            System.out.println("logBefore" + joinPoint.getArgs().length);
        }
    
        @After("pointCut()")
        public void logAfter(){
            System.out.println("logAfter");
        }
    
        @AfterReturning("pointCut()")
        public void logReturn(){
            System.out.println("logReturn");
        }
    
        @AfterThrowing("pointCut()")
        public void logThrowing(){
            System.out.println("logThrowing");
        }
    
        @Around("pointCut()")
        public void logAround(ProceedingJoinPoint point) throws Throwable {
            System.out.println("logAround around之前");
            point.proceed();
            System.out.println("logAround around之后");
        }
    }
    
    package com.nxj.config;
    
    import com.nxj.aop.AopTest;
    import com.nxj.aop.LogAspects;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.ComponentScan;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.context.annotation.EnableAspectJAutoProxy;
    
    /**
     * @author ningxinjie
     * @date 2021/1/17
     */
    @Configuration
    @EnableAspectJAutoProxy
    public class MyAopConfig {
        @Bean
        public AopTest aopTest(){
            return new AopTest();
        }
    
        @Bean
        public LogAspects logAspects(){
            return new LogAspects();
        }
    
    }
    

    测试:

    /**
     * @author ningxinjie
     * @date 2021/1/17
     */
    public class MyAopTest {
        @Test
        public void aopTest(){
            ApplicationContext context = new AnnotationConfigApplicationContext(MyAopConfig.class);
            AopTest aopTest = context.getBean("aopTest", AopTest.class);
            aopTest.myAopTestMethod();
        }
    }
    

    结果:

    logAround around之前
    logBefore0
    myAopTestMethod~~~
    logAround around之后
    logAfter
    logReturn
    
  • 相关阅读:
    [python] pprika:基于werkzeug编写的web框架(6) ——restful的错误处理
    [python] pprika:基于werkzeug编写的web框架(5) ——蓝图blueprint
    [python] pprika:基于werkzeug编写的web框架(4) ——请求上下文与helpers
    [python] pprika:基于werkzeug编写的web框架(3) ——错误处理
    [python] pprika:基于werkzeug编写的web框架(2) ——路由与请求响应
    [python] pprika:基于werkzeug编写的web框架(1) ——序言与简介
    2019寒假训练营第四次作业
    2019寒假训练营第三次作业
    【学习笔记】福州大学网络课程 网络空间安全概论(5)
    【学习笔记】福州大学网络课程 网络空间安全概论(1,4)
  • 原文地址:https://www.cnblogs.com/ningxinjie/p/14289184.html
Copyright © 2020-2023  润新知