springboot(十二)AOP的使用

概述:

        说起AOP就不得不说下OOP了,OOP中引入封装、继承和多态性等概念来建立一种对象层次结构,用以模拟公共行为的一个集合。但是,如果我们需要为部分对象引入公共部分的时候,OOP就会引入大量重复的代码。例如:日志功能。

   AOP技术利用一种称为“横切”的技术,解剖封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,这样就能减少系统的重复代码,降低模块间的耦合度,并有利于未来的可操作性和可维护性。AOP把软件系统分为两个部分:核心关注点和横切关注点。业务处理的主要流程是核心关注点,与之关系不大的部分是横切关注点。横切关注点的一个特点是,他们经常发生在核心关注点的多处,而各处都基本相似。比如权限认证、日志、事务处理。
 

springboot集成AOP:

新建项目:springboot-aop,pom.xml

<dependencies>
		<!--aop-->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-aop</artifactId>
		</dependency>
		<!--web-->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
 
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>

新建web层测试接口:TestController.java

@RestController
public class TestController {
   private final static Logger logger=LoggerFactory.getLogger(TestController.class);
 
    @GetMapping("/test")
    public String test(String name){
        logger.info("进入controller test方法");
        return "name:"+name;
    }
}

新建切面类:TestAspect.java,实现web层的日志切面

@Aspect
@Component
public class TestAspect {
 
    private final static Logger logger= LoggerFactory.getLogger(TestAspect.class);
    /**
     * 指定切点
     */
    @Pointcut("execution(public * com.example.springbootaop.controller.TestController.*(..))")
    public void webLog(){}
 
    /**
     * 前置通知:方法调用前被调用
     * @param joinPoint
     */
    @Before("webLog()")
    public void doBefore(JoinPoint joinPoint){
        logger.info("doBefore 方法执行之前");
 
        Signature signature = joinPoint.getSignature();
        //获取request
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = attributes.getRequest();
        //url
        logger.info("url={}",request.getRequestURI());
        //method
        logger.info("method={}",request.getMethod());
        //ip
        logger.info("ip={}",request.getRemoteAddr());
        //代理类
        logger.info("代理类:"+signature.getDeclaringTypeName());
        //代理类法
        logger.info("代理类方法:"+signature.getName());
        //请求参数名称
        MethodSignature methodSignature = (MethodSignature) signature;
        String[] parameterNames = methodSignature.getParameterNames();
        logger.info("parameterNames={}", Arrays.toString(parameterNames));
        //请求参数值
        logger.info("parameterValues={}", Arrays.toString(joinPoint.getArgs()));
    }
    /**
     * 后置通知:方法调用后被调用
     */
    @After("webLog()")
    public void doAfter(){
        logger.info("doAfter:方法执行之后");
    }
 
 
    /**
     * 获取返回值
     * @param object
     */
    @AfterReturning(returning = "object",pointcut = "webLog()")
    public void doAfterReturning(Object object){
        logger.info("response={}",object);
    }
}

    注:@Component 注解把类给ioc容器管理

            @Aspect 注解 标明为切面类

            @Pointcu t注解 定义的切入点

            @Before 注解 切入点的前置通知

            @After 注解 切入点的后置通知

            @AfterReturning 注解 记录请求返回的对象。

测试:

 启动项目,访问 localhost:8080/test?name=zhangsan

 

   执行顺序:访问test接口---> 前置通知(doBefore) ---> 切入点方法(controller test方法) --> 后置通知(doAfter) --> 请求返回的对象(doAfterReturning)

         

源码地址:https://gitee.com/xu0123/springboot2

上一篇:springboot(十一)WebSocket实现前后端消息推送

下一篇:springboot(十三)全局异常处理

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值