Springboot Aop实现

本文介绍了SpringBoot Aop如何实现动态代理,通过Aop解决在不修改源代码的情况下,对特定功能进行增强。示例展示了在Controller方法前后插入逻辑的场景,并提供了相关代码实现和依赖引入。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SpringBoot Aop实现


在学习代理模式时候,想到sping中Aop实现为动态代理,因此学习记录一下。学习动态代理

  • spring Aop 解决的问题:Aop也称切面编程,即不修改源代码情况下,使用代理模式针对源代码功能进行修改。
  • Spring Aop代码实现场景:针对controller方法进行切面编程,即在方法前以及方法后执行对应逻辑。
  • 代码实现:
    • maven 项目加入依赖
    	<dependency>
    		<groupId>org.springframework.boot</groupId>
    		<artifactId>spring-boot-starter-aop</artifactId>
    	</dependency>
    
    • 被代理方法
    package com.spring.agent.controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    @RequestMapping(value = "/test")
    public class TestController{
    
    	@RequestMapping(value = "/request1")
    	public String getRequest1(){ return "request1 return success"; }
    
    	@RequestMapping(value = "/request2")
    	public String getRequest2(){
    		return "request2 return success";
    	}
    }
    
    • Aop(代理方法)实现
    package com.spring.agent.agent;
    
    import org.aspectj.lang.ProceedingJoinPoint;
    import org.aspectj.lang.annotation.After;
    import org.aspectj.lang.annotation.AfterReturning;
    import org.aspectj.lang.annotation.AfterThrowing;
    import org.aspectj.lang.annotation.Around;
    import org.aspectj.lang.annotation.Aspect;
    import org.aspectj.lang.annotation.Before;
    import org.aspectj.lang.annotation.Pointcut;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.stereotype.Component;
    
    @Component
    @Aspect
    public class AopTestController {
    
    	Logger logger = LoggerFactory.getLogger(AopTestController.class);
    
    	/**
    	 * 定义一个切入点
    	 *  execution 定一格式:execution([方法的可见性] 返回类型 [方法所在类的全路径名] 方法名(参数类型列表) [方法抛出的异常类型]) 
    	 *  * 匹配任何数量字符
    	 *  ..  匹配任何数量字符的重复,如在类型模式中匹配任何数量子包;而在方法参数模式中匹配任何数量参数
    	 *   + 匹配指定类型的子类型;仅能作为后缀放在类型模式后边
    	 */
    	  
    	@Pointcut(value = "execution(* com.spring.agent.controller..*(..))")
    	public void cutOffPoint() {
    	}
    
    	/**
    	 * 在切入点之前执行该方法
    	 */
    	@Before("cutOffPoint()")
    	public void beforeTest(){
    		logger.info(">>>>>>>>>>>>>>>>>>>start execute method<<<<<<<<<<<<<<<<<<<<<");
    	}
    
    	/**
    	 * 在切入点之后执行该方法
    	 */
    	@After("cutOffPoint()")
    	public void afterTest(){
    		logger.info(">>>>>>>>>>>>>>>>>>>end execute method<<<<<<<<<<<<<<<<<<<<<");
    	}
    
    	/**
    	 * 环绕通知(涵盖了 @Before and @After)
    	 */
    	@Around("cutOffPoint()")
    	public Object aroundTest(ProceedingJoinPoint pjp){
    		Long startTime = System.currentTimeMillis();
    		Object obj = null;
    		try {
    			//切入方法执行
    			obj = pjp.proceed();
    			Long endTime = System.currentTimeMillis();
    			logger.info(">>>>>>>>> method execute time is: " + (endTime - startTime));
    		} catch (Throwable throwable) {
    			throwable.printStackTrace();
    		}
    		return obj;
    	}
    
    	/**
    	 * 切入点返回之后执行,即在 @After 之后执行
    	 */
    	@AfterReturning("cutOffPoint()")
    	public void afterReturnTest(){
    		logger.info(">>>>>>>>>>>>>>>>>>>method returned<<<<<<<<<<<<<<<<<<<<<");
    	}
    
    	/**
    	 * 切入方法有异常抛出(可以作为项目异常总体处理)
    	 */
    	@AfterThrowing("cutOffPoint()")
    	public void afterThrowTest(){
    		logger.info(">>>>>>>>>>>>>>>>>>>method exception<<<<<<<<<<<<<<<<<<<<<");
    	}
    }
    
    以上就是针对springboot aop 实现,如有问题还请留言指教
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值