spring boot 入门3 如何在springboot 上使用AOP
Posted liuwd
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spring boot 入门3 如何在springboot 上使用AOP相关的知识,希望对你有一定的参考价值。
Aop是spring的两大核心之一
那么如何在springboot中采用注解的形式实现aop那?
1)首先我们定义一个相关功能的切面类 并 采用@Aspect 注解来声明当前类为切面 同时采用@Component 注解将当前类交与spring管理
@Aspect @Component public class HttpAspect {}
2)定义切点 声明一个方法将在方法上采用@Pointcut
/** * 定义一个方法 为切点 统一的切入方法点 */ @Pointcut(value = "execution(public * com.lwd.web.LoginController.*(..))") public void log(){ }
3) 声明增强方法
/** * 采用统一切入点进行增强 切入的方法 执行之前进行切入 */ @Before("log()") public void login(){ System.out.println("----------ddddddddddddd----------------"); }
/** * 切入的方法执行完成之后执行 */ @After("log()") public void doAfter(){ System.out.println("777777777777777777777777"); } @Before("log()") public void doAfterReturning(JoinPoint joinPoint){ ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); HttpServletRequest request = requestAttributes.getRequest(); //url String requestURI = request.getRequestURI(); logger.info("url={}",requestURI); //method String method = request.getMethod(); logger.info("method=",method); //ip //类方法 Signature signature = joinPoint.getSignature(); String declaringTypeName = signature.getDeclaringTypeName(); String name = signature.getName(); Object[] args = joinPoint.getArgs(); } //如何在做切面的时候获取切点的返回数据内容 @AfterReturning(returning = "object",pointcut = "log()") public void doAfterReturning(Object object){ }
具体代码实现方式:
package com.lwd.aspect; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.Signature; import org.aspectj.lang.annotation.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; import org.springframework.web.context.request.RequestAttributes; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import javax.servlet.http.HttpServletRequest; /** * 1.定义了一个切面类 @Aspect 注解 @Component 注解 * 2.定义切点 声明一个方法 添加@Pointcut 注解 execution表达式来声明切入的点 * 3.定义 增强 @befor @after @AfterReturning 等一系列注解来进行增强 * Created by andyliu on 2018/11/5. */ @Aspect @Component public class HttpAspect { private static final Logger logger = LoggerFactory.getLogger(HttpAspect.class); /** * 这样试用于对指定方法进行增强 或者 对所有方法都进行增强 当前表达式只当前增强方法使用 */ @Before("execution(public * com.lwd.web.LoginController.*(..))") public void doBefor(){ System.out.println("---实现对当前类下的任意方法执行前进行增强----"); } /** * 定义一个方法 为切点 统一的切入方法点 */ @Pointcut(value = "execution(public * com.lwd.web.LoginController.*(..))") public void log(){ } /** * 采用统一切入点进行增强 切入的方法 执行之前进行切入 */ @Before("log()") public void login(){ System.out.println("----------ddddddddddddd----------------"); } /** * 切入的方法执行完成之后执行 */ @After("log()") public void doAfter(){ System.out.println("777777777777777777777777"); } /** * 获取http请求 * @param joinPoint */ @Before("log()") public void doAfterReturning(JoinPoint joinPoint){ //requestContextHolder request reponse 控制器 ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); //获取httpServlerRequst请求 HttpServletRequest request = requestAttributes.getRequest(); //url String requestURI = request.getRequestURI(); logger.info("url={}",requestURI); //method String method = request.getMethod(); logger.info("method=",method); //ip String remoteAddr = request.getRemoteAddr(); //类方法 Signature signature = joinPoint.getSignature(); String declaringTypeName = signature.getDeclaringTypeName(); String name = signature.getName(); Object[] args = joinPoint.getArgs(); } //如何在做切面的时候获取切点的返回数据内容 @AfterReturning(returning = "object",pointcut = "log()") public void doAfterReturning(Object object){ } }
以上是关于spring boot 入门3 如何在springboot 上使用AOP的主要内容,如果未能解决你的问题,请参考以下文章
Spring Boot快速入门:使用MyBatis(注解形式)进行数据库操作
如何结合 Spring Boot HornetQAutoConfiguration 和 CachingConnectionFactory?