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的更多相关文章

  1. Spring boot入门(三):SpringBoot集成结合AdminLTE(Freemarker),利用generate自动生成代码,利用DataTable和PageHelper进行分页显示

    关于SpringBoot和PageHelper,前篇博客已经介绍过Spring boot入门(二):Spring boot集成MySql,Mybatis和PageHelper插件,前篇博客大致讲述了S ...

  2. Springboot 系列(一)Spring Boot 入门篇

    注意:本 Spring Boot 系列文章基于 Spring Boot 版本 v2.1.1.RELEASE 进行学习分析,版本不同可能会有细微差别. 前言 由于 J2EE 的开发变得笨重,繁多的配置, ...

  3. 161103、Spring Boot 入门

    Spring Boot 入门 spring Boot是Spring社区较新的一个项目.该项目的目的是帮助开发者更容易的创建基于Spring的应用程序和服务,让更多人的人更快的对Spring进行入门体验 ...

  4. Spring Boot入门教程1、使用Spring Boot构建第一个Web应用程序

    一.前言 什么是Spring Boot?Spring Boot就是一个让你使用Spring构建应用时减少配置的一个框架.约定优于配置,一定程度上提高了开发效率.https://zhuanlan.zhi ...

  5. Spring Boot入门(四):开发Web Api接口常用注解总结

    本系列博客记录自己学习Spring Boot的历程,如帮助到你,不胜荣幸,如有错误,欢迎指正! 在程序员的日常工作中,Web开发应该是占比很重的一部分,至少我工作以来,开发的系统基本都是Web端访问的 ...

  6. Spring Boot入门(二):使用Profile实现多环境配置管理&如何获取配置文件值

    在上一篇博客Spring Boot入门(一):使用IDEA创建Spring Boot项目并使用yaml配置文件中,我们新建了一个最原始的Spring Boot项目,并使用了更为流行的yaml配置文件. ...

  7. Spring boot 入门(四):集成 Shiro 实现登陆认证和权限管理

    本文是接着上篇博客写的:Spring boot 入门(三):SpringBoot 集成结合 AdminLTE(Freemarker),利用 generate 自动生成代码,利用 DataTable 和 ...

  8. Spring Boot入门 and Spring Boot与ActiveMQ整合

    1.Spring Boot入门 1.1什么是Spring Boot Spring 诞生时是 Java 企业版(Java Enterprise Edition,JEE,也称 J2EE)的轻量级代替品.无 ...

  9. Spring Boot 入门day01

    一.Spring Boot入门 1.Spring Boot简介 Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特 ...

随机推荐

  1. 函子(Monad)新解:函子定义了一个类型(泛型)和建立在这个类型上的一组运算符

    这组运算符和代数中的运算加减乘除运算符一样,符合一定的定律:结合律.(交换律)等: 函数式编程的核心(底层支持)就是这些类型和运算符的定义. 函子就是定义这些类型和运算符的(). 运算符通常为单目运算 ...

  2. 【转】Java虚拟机类型卸载和类型更新解析

    [摘要]         前面系统讨论过java类型加载(loading)的问题,在这篇文章中简要分析一下java类型卸载(unloading)的问题,并简要分析一下如何解决如何运行时加载newly ...

  3. js实现div滚动条在页面刷新 滚动条位置固定

    思想:1.通过div的onscroll事件记录滚动条的scrollTop值,设置到document.cookie 2.页面加载时再读取document.cookie的值,设置给div的scrollTo ...

  4. 【转载】Atom 是一款各方面体验都很像 Sublime Text 的编辑器

    转载:http://www.appinn.com/atom-editor/ Atom 是一款各方面体验都很像 Sublime Text 的编辑器,它由 Github 出品,目前免费. Atom 功能的 ...

  5. Openresty最佳案例 | 第6篇:OpenResty连接Mysql

    转载请标明出处: http://blog.csdn.net/forezp/article/details/78616698 本文出自方志朋的博客 centos 安装mysl Centos系统下安装my ...

  6. 跨Vlan通信:单臂路由,三层交换机

    实验涉及命令以及知识补充(涉及Vlan通过的以太网口需要设置为Trunk口) 单臂路由 父接口 no ip address :删除实现单臂路由接口的IP no shutdown 虚拟子接口 R2(co ...

  7. IOS中使用百度地图定位后获取城市坐标,城市名称,城市编号信息

    IOS中使用百度地图定位后获取城市坐标,城市名称,城市编号信息 /**当获取到定位的坐标后,回调函数*/ - (void)didUpdateBMKUserLocation:(BMKUserLocati ...

  8. MySQL提升课程 全面讲解MySQL架构设计

    1:并发量:同一时间处理请求数量,同一时间处理请求数量和连接数量是两个概念,连接数大于处理请求数量, MySQL参数最大连接数max_connections 这是是查询数据库当前设置的最大连接数 my ...

  9. call、apply和bind的用法

    在改变 this 指向的时候,经常会把这三个方法混淆,下面就详细的整理一下三者的用法和区别 call() 方法 call() 方法可以有无数个参数 第一个参数是改变 this 指向的对象 后面的参数直 ...

  10. plupload批量上传分片(后台代码)

    plupload批量上传分片功能, 对于文件比较大的情况下,plupload支持分片上传,后台代码如下: /** * * 方法:upLoadSpecialProgramPictrue * 方法说明:本 ...