美文网首页
【Spring基础】Spring 中的 AOP框架

【Spring基础】Spring 中的 AOP框架

作者: Tcpieg | 来源:发表于2020-10-23 15:31 被阅读0次

    什么是AOP

    OOP(面向对象编程)提供“从上到下”的关系,而AOP(面向方面编程)提供一种“横切”的方式,也可以说是“从左到右”。
    简单来说就是将那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可操作性和可维护性。

    实例

    可能光是说AOP的定义,大家都不太能理解。
    举个例子,比如日志功能,实现这个功能的代码可能是很多类所需要的功能之一,但是如果我们在每一个类里都重复添加实现日志功能的代码,将会有很多重复代码。
    上代码(代码参考https://blog.csdn.net/JinXYan/article/details/89302126

    /**
     * @description: 业务类
     */
    public class Calculator {
    
        public int add(int i, int j) {
            System.out.println("加法");
            return i + j;
        }
    
        public int sub(int i, int j) {
            System.out.println("减法");
            return i - j;
        }
    
        public int mul(int i, int j) {
            System.out.println("乘法");
            return i * j;
        }
    
        public int div(int i, int j) {
            System.out.println("除法");
            return i / j;
        }
    }
    

    通过切入点,把业务类Calculator“横向”切开,这样很好的把业务类和日志类解耦。

    /**
     * @description: 日志切面类,
     */
    @Aspect
    public class LogAspects {
        //切入点
        @Pointcut("execution(public int Calculator.*(..))")
        public void pointCut(){};
    
        //代表在目标方法执行前切入, 并指定在哪个方法前切入
        @Before("pointCut()")
        public void logStart(){
            System.out.println("@Before");
        }
        //代表在目标方法运行结束之后 ,不管有没有异常
        @After("pointCut()")
        public void logEnd(){
            System.out.println("@After");
        }
        //代表在目标方法正常返回值后运行
        @AfterReturning("pointCut()")
        public void logReturn(){
            System.out.println("@AfterReturning");
        }
        //代表在目标方法出现异常后运行
        @AfterThrowing("pointCut()")
        public void logException(){
            System.out.println("@AfterThrowing");
        }
        //动态代理,手动执行joinPoint.procced方法(程序执行过程中明确的点,一般指方法的调用)
        //简单的来说就是,在目标方法执行之前是前置通知,在目标方法执行之后是后置通知
        @Around("pointCut()")
        public Object Around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable{
            System.out.println("@Around:执行目标方法之前...");
            Object obj = proceedingJoinPoint.proceed();
            System.out.println("@Around:执行目标方法之后...");
            return obj;
        }
    
    }
    
    /**
     * @description: 配置类
     */
    @Configuration
    @EnableAspectJAutoProxy
    public class Config {
        @Bean
        public Calculator calculator(){
            return new Calculator();
        }
    
        @Bean
        public LogAspects logAspects(){
            return new LogAspects();
        }
    }
    

    测试一下

    public class test {
        public static void main(String[] args) {
            AnnotationConfigApplicationContext app = new AnnotationConfigApplicationContext(Config.class);
            Calculator c = app.getBean(Calculator.class);
            c.add(2, 3);
        }
    }
    
    运行结果

    相关文章

      网友评论

          本文标题:【Spring基础】Spring 中的 AOP框架

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