美文网首页从零开始的springboot生活
从零开始的springboot生活(三)--实现一下aop吧

从零开始的springboot生活(三)--实现一下aop吧

作者: 邱风扫落叶 | 来源:发表于2019-01-20 23:58 被阅读0次

    在开始实现之前,先解决一下controller,先把controller调用service,这个可以看之前的一和二

    package com.example.test.demotest.controller;
    
            import com.example.test.demotest.service.IGetService;
            import org.springframework.beans.factory.annotation.Autowired;
            import org.springframework.web.bind.annotation.RequestMapping;
            import org.springframework.web.bind.annotation.RequestMethod;
            import org.springframework.web.bind.annotation.RestController;
    
    /**
     * @author qiubo
     * @date 2019/1/20
     */
    @RestController
    public class TestController {
        @Autowired
        IGetService getService;
        @RequestMapping(value = "/test",method = RequestMethod.GET)
        String getTest(){
            return getService.getTest();
        }
    }
    

    然后增加依赖


    image.png
       <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-aop</artifactId>
            </dependency>
    

    写一个简单的处理TestController的aop方法

    package com.example.test.demotest.aop;
    
    import org.aspectj.lang.ProceedingJoinPoint;
    import org.aspectj.lang.annotation.*;
    import org.springframework.stereotype.Component;
    
    /**
     * @author qiubo
     * @date 2019/1/21
     */
    @Aspect
    @Component
    public class TestAop {
        @Pointcut("execution(* com.example.test.demotest.controller.TestController..*(..))")
        private void pointcut() {
        }
            @Before("pointcut()")
            public void beforeLog(){
                System.out.println("before");
            }
            @After("pointcut()")
            public void afterLog(){
                System.out.println("after");
            }
            @Around("pointcut()")
        public void aroundLog(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
                System.out.println("around before");
                String s= (String) proceedingJoinPoint.proceed();
                System.out.println("around after"+" "+s);
            }
    }
    
    

    解释一下,pointcut是切点,@Before与@After是运行方法之前调用和之后调用的,@Around是可以实现自定方法之前和之后的方法。还有execution里面的内容,我看了一篇不错的网址,里面介绍十分详细https://blog.csdn.net/ABCD898989/article/details/50809321这里就不解释了

    image.png

    http://localhost:8080/test访问这个url结果,可以明显看到执行顺序

    image.png

    说完了例子,可以探讨一下aop的原理,aop的代理实现有两种,一种的java的动态代理,一种是cglib代理,他们的主要区别是,java动态代理是利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。而cglib动态代理是利用asm开源包,对代理对象类的class文件加载进来,通过修改其字节码生成子类来处理。其实说到底,aop只是一种设计模式的思想--代理模式。感觉思想比调用更加重要

    相关文章

      网友评论

        本文标题:从零开始的springboot生活(三)--实现一下aop吧

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