1-8SpringBoot之切面AOP
SpringBoot提供了强大AOP支持,我们前面讲解过AOP面向切面,所以这里具体AOP原理就补具体介绍;
AOP切面主要是切方法,我们一般搞一些日志分析和事务操作,要用到切面,类似拦截器;
@Aspect注解是切面注解类
@Pointcut切点定义
@Before是方法执行前调用
@After是方法执行后调用
@AfterReturning方法执行返回值调用
Service层本身就可以切入事务,所以我们这类搞个常用的 切controller层方法
每个执行controller层的方法 都记录下请求Url,访问者IP 执行类方法参数等信息;
定义一个切面类:RequestAspect
import
javax.servlet.http.HttpServletRequest;
import
org.apache.log4j.Logger;
import
org.aspectj.lang.JoinPoint;
import
org.aspectj.lang.annotation.After;
import
org.aspectj.lang.annotation.AfterReturning;
import
org.aspectj.lang.annotation.Aspect;
import
org.aspectj.lang.annotation.Before;
import
org.aspectj.lang.annotation.Pointcut;
import
org.springframework.stereotype.Component;
import
org.springframework.web.context.request.RequestContextHolder;
import
org.springframework.web.context.request.ServletRequestAttributes;
@Aspect
@Component
public
class
RequestAspect {
private
Logger logger=Logger.getLogger(RequestAspect.
class
);
@Pointcut
(
"execution(public * com.java1234.controller.*.*(..))"
)
public
void
log(){
}
@Before
(
"log()"
)
public
void
deoBefore(JoinPoint joinPoint){
logger.info(
"方法执行前..."
);
ServletRequestAttributes sra=(ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request=sra.getRequest();
logger.info(
"url:"
+request.getRequestURI());
logger.info(
"ip:"
+request.getRemoteHost());
logger.info(
"method:"
+request.getMethod());
logger.info(
"class_method:"
+joinPoint.getSignature().getDeclaringTypeName()+
"."
+joinPoint.getSignature().getName());
logger.info(
"args:"
+joinPoint.getArgs());
}
@After
(
"log()"
)
public
void
doAfter(JoinPoint joinPoint){
logger.info(
"方法执行后..."
);
}
@AfterReturning
(returning=
"result"
,pointcut=
"log()"
)
public
void
doAfterReturning(Object result){
logger.info(
"执行返回值:"
+result);
}
}
execution(public * com.java1234.controller.*.*(..)) 这个定义 意思是 对 com.java1234.controller包下的任意类,任意方法,任意参数,任意返回值的方法都进行切入
我们测试 StudentController
请求:http://localhost:8888/studentAdd.html
点击“提交”,
控制台显示:
2017-08-11 11:22:46.357 INFO 9896 --- [nio-8888-exec-9] com.java1234.aspect.RequestAspect : 方法执行前...
2017-08-11 11:22:46.358 INFO 9896 --- [nio-8888-exec-9] com.java1234.aspect.RequestAspect : url:/student/add
2017-08-11 11:22:46.358 INFO 9896 --- [nio-8888-exec-9] com.java1234.aspect.RequestAspect : ip:0:0:0:0:0:0:0:1
2017-08-11 11:22:46.358 INFO 9896 --- [nio-8888-exec-9] com.java1234.aspect.RequestAspect : method:POST
2017-08-11 11:22:46.358 INFO 9896 --- [nio-8888-exec-9] com.java1234.aspect.RequestAspect : class_method:com.java1234.controller.StudentController.add
2017-08-11 11:22:46.358 INFO 9896 --- [nio-8888-exec-9] com.java1234.aspect.RequestAspect : args:[Ljava.lang.Object;@fd1ee9
Hibernate: insert into t_student (age, name) values (?, ?)
2017-08-11 11:22:46.372 INFO 9896 --- [nio-8888-exec-9] com.java1234.aspect.RequestAspect : 方法执行后...
2017-08-11 11:22:46.373 INFO 9896 --- [nio-8888-exec-9] com.java1234.aspect.RequestAspect : 执行返回值:添加成功!
这里得到了我们需要的信息;
当然这里用到了日志 springboot推荐logback log4j的升级版 用法基本差不多;
1-8SpringBoot之切面AOP的更多相关文章
- Puzzle 面向服务/切面(AOP/IOC)开发框架 For .Net
Puzzle 面向服务/切面AOP开发框架 For .Net AOP主要实现的目的是针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个步骤或阶段,以获得逻辑过程中各部分之间低耦合性的隔离效 ...
- Liferay7 BPM门户开发之36: 使用Portlet filters过滤器做切面AOP
使用Portlet filters过滤器做切面AOP Portlet Filters定义于JSR286 Java Portlet Specification 2.0 Portlet Filters是为 ...
- Spring框架系列(五)--面向切面AOP
背景: 当需要为多个不具有继承关系的对象引入一个公共行为,例如日志.权限验证.事务等功能时,如果使用OOP,需要为每个对象引入这些公共 行为.会产生大量重复代码,并且不利用维护.AOP就是为了解决这个 ...
- Spring基础(二)_面向切面(AOP)
面向切面编程 面向切面编程[AOP,Aspect Oriented Programming]:通过预编译方式和运行期间动态代理实现程序功能的统一维护的技术.AOP 是 Spring 框架中的一个重要内 ...
- SpringBoot切面Aop的demo简单讲解
前言 本篇文章主要介绍的是SpringBoot切面Aop的demo简单讲解. SpringBoot Aop 说明:如果想直接获取工程那么可以直接跳到底部,通过链接下载工程代码. 切面(Aop) 一.概 ...
- 在IDEA 、springboot中使用切面aop实现日志信息的记录到数据库
文章目录 1.导入相关的依赖 2.创建要保存的数据信息实体类 3 .编写对应的sql语句 4.使用spring 的 aop 技术切到自定义注解上,所以先创建一个自定义注解类 5. 创建aop切面实现类 ...
- Java 面向切面 AOP
参考: :http://www.blogjava.net/supercrsky/articles/174368.html AOP: Aspect Oriented Programming 即面向切面编 ...
- Spring框架使用(控制反转,依赖注入,面向切面AOP)
参见:http://blog.csdn.net/fei641327936/article/details/52015121 Mybatis: 实现IOC的轻量级的一个Bean的容器 Inversion ...
- Spring 在XML中声明切面/AOP
在Spring的AOP配置命名空间中,我们能够找到声明式切面选择.看以下: <aop:config> <!-- AOP定义開始 --> <aop:pointcut/> ...
- Spring4面向切面AOP
AOP(Aspect Oriented Programming)面向切面编程,通过预编译方式和运行期动态代理实现程序功能的横向多模块统一控制的一种技术.AOP是OOP的补充,是spring框架中的一个 ...
随机推荐
- STM32F4/F7运算性能
参考http://bbs.21ic.com/icview-1622796-1-1.html
- Notepad++查看文本文件的总的字符数、GBK字节数、UTF8字节数
如果其编码是 小结:UTF-8编码下,一个汉字占3字节,GBK编码下,一个汉字占2字节:
- 二十二、mysql 执行计划与存储引擎
1.explain(执行计划)中涉及的各字段理解1.1) select_type列的取值及含义: SIMPLE :简单的SELECT语句(不包括UNION操作或子 ...
- JAVA GUI窗体及控件
Swing基本操作: JAVA显示一个带按钮的窗口: import java.awt.*; import javax.swing.*; import javax.swing.border.EmptyB ...
- Python 爬取 热词并进行分类数据分析-[热词关系图+报告生成]
日期:2020.02.05 博客期:144 星期三 [本博客的代码如若要使用,请在下方评论区留言,之后再用(就是跟我说一声)] 所有相关跳转: a.[简单准备] b.[云图制作+数据导入] c.[拓扑 ...
- SpringBoot与Jpa入门
一.JPA简介 目前JPA主要实现由hibernate和openJPA等. Spring Data JPA 是Spring Data 的一个子项目,它通过提供基于JPA的Repository极大了减少 ...
- Oracle Parallel使用方法
一. 并行查询 并行查询允许将一个sql select语句划分为多个较小的查询,每个部分的查询并发地运行,然后将各个部分的结果组合起来,提供最终的结果,多用于全表扫描,索引全扫描等,大表的扫描和连接. ...
- SpringMVC笔记三
课程安排: 第一天:springmvc的基础知识 什么是springmvc? springmvc框架原理(掌握) 前端控制器.处理器映射器.处理器适配器.视图解析器 springmvc入门程序 目的: ...
- python开发接口
享一段代码,开发了3个接口: 1.上传文件 2.查看所有文件 3.下载文件 使用python开发,需要安装flask模块,使用pip ...
- 吴裕雄 Bootstrap 前端框架开发——Bootstrap 显示代码:变量赋值
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...