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(代理方法)实现
以上就是针对springboot 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<<<<<<<<<<<<<<<<<<<<<"); } }