从零开始的springboot生活

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

2019-01-20  本文已影响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只是一种设计模式的思想--代理模式。感觉思想比调用更加重要

上一篇 下一篇

猜你喜欢

热点阅读