SpringBoot中AOP的配置
来源:互联网 发布:linux打包命令 zip 编辑:程序博客网 时间:2024/05/21 09:56
AOP目的:
面向切面编程(aspect-oriented programming,AOP)主要实现的目的是针对业务处理过程中的切面进行提取,诸如日志、事务管理和安全这样的系统服务,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
Spring AOP术语:
1.连接点(Joinpoint)
程序执行的某个特定位置:如类某个方法调用前、调用后、方法抛出异常后。一个类或一段程序代码拥有一些具有边界性质的特定点,这些点中的特定点就称为“连接点”。Spring仅支持方法的连接点,即仅能在方法调用前、方法调用后、方法抛出异常时以及方法调用前后这些程序执行点织入通知。连接点由两个信息确定:第一是用方法表示的程序执行点;第二是用相对点表示的方位。连接点是在应用执行过程中能够插入切面的一个点。
以查电表为例子:电力公司为多个住户提供服务,连接点就是每一家的电表所在的位置(类中的方法的调用前、调用后…)。
2.切点(Pointcut)
AOP通过“切点”定位特定的连接点。切点和连接点不是一对一的关系,一个切点可以匹配多个连接点。在Spring中,切点通过org.springframework.aop.Pointcut接口进行描述,它使用类和方法作为连接点的查询条件,Spring AOP的规则解析引擎负责切点所设定的查询条件,找到对应的连接点。其实确切地说,不能称之为查询连接点,因为连接点是方法执行前、执行后等包括方位信息的具体程序执行点,而切点只定位到某个方法上,所以如果希望定位到具体连接点上,还需要提供方位信息。
电力公司为每一个抄表员都分别指定某一块区域的住户。切点就是划分的区域。
3.通知(Advice)
切面的工作被称为通知。是织入到目标类连接点上的一段程序代码。
Spring切面可以应用5种类型的通知:
- 前置通知(Before):在目标方法被调用之前调用通知功能;
-后置通知(After):在目标方法完成之后调用通知,此时不会关心方 法的输出是什么;
-返回通知(After-returning):在目标方法成功执行之后调用通知;
-异常通知(After-throwing):在目标方法抛出异常后调用通知;
-环绕通知(Around):通知包裹了被通知的方法,在被通知的方法调 用之前和调用之后执行自定义的行为。
抄表员的本职工作是登记用电量,但他们还需要向电力公司汇报的信息。
登记用电量是目标对象,汇报的信息就是通知。
4.引介(Introduction)
引入允许我们向现有的类添加新方法或属性,是一种特殊的通知。这样,即使一个业务类原本没有实现某个接口,通过AOP的引介功能,我们可以动态地为该业务类添加接口的实现逻辑,让业务类成为这个接口的实现类。
5.切面(Aspect)
切面由切点和通知(引介)组成,它既包括了横切逻辑的定义,也包括了连接点的定义。
抄表员的开始一天的工作时,他要知道从哪些区域(切点)收集信息,从而进行汇报(通知)。
6.织入(Weaving)
织入是把切面应用到目标对象并创建新的代理对象的过程。
AOP有三种织入的方式:
a、编译期:切面在目标类编译时被织入。这种方式需要特殊的编译器。AspectJ的织入编译器就是以这种方式织入切面的。
b、类加载期:切面在目标类加载到JVM时被织入。这种方式需要特殊的类加载器(ClassLoader),它可以在目标类被引入应用之前增
强该目标类的字节码。AspectJ 5的加载时织入(load-time weaving,LTW)就支持以这种方式织入切面。
c、运行期:切面在应用运行的某个时刻被织入。一般情况下,在织入切面时,AOP容器会为目标对象动态地创建一个代理对象。Spring
AOP就是以这种方式织入切面的。
简单例子:
1、在浏览器中打开http://start.spring.io/,如图
点击“Switch to the full version.”,勾选”Web”和AOP,然后点击“ Generate Project alt +”按钮,把文件保存到本地某个位置
2、解压文件直接在IDEA中open,项目目录如下:
3.编制Example.java存于demo\src\main\java\com\example\web下
package com.example.web;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;@RestControllerpublic class Example { @RequestMapping("/") public String home() { return "Hello World!"; }}
4.编制WebLogAspect.java在demo\src\main\java\com\example\aop下:
package com.example.aop;import org.aspectj.lang.JoinPoint;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.slf4j.LoggerFactory;import org.springframework.stereotype.Component;import org.springframework.web.context.request.RequestContextHolder;import org.springframework.web.context.request.ServletRequestAttributes;import javax.servlet.http.HttpServletRequest;import java.util.Arrays;@Aspect@Componentpublic class WebLogAspect { protected static org.slf4j.Logger logger = LoggerFactory.getLogger(WebLogAspect.class); @Pointcut("execution(public * com.example.web..*.*(..))") public void webLog() { } @Before("webLog()") public void doBefore(JoinPoint joinPoint) throws Throwable { System.out.println( "进入doBefore切面"); // 接收到请求,记录请求内容 ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); HttpServletRequest request = attributes.getRequest(); // 记录下请求内容 logger.info("URL : " + request.getRequestURL().toString()); logger.info("HTTP_METHOD : " + request.getMethod()); logger.info("IP : " + request.getRemoteAddr()); logger.info("CLASS_METHOD : " + joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName()); logger.info("ARGS : " + Arrays.toString(joinPoint.getArgs())); } @AfterReturning(returning = "ret", pointcut = "webLog()") public void doAfterReturning(Object ret) throws Throwable { // 处理完请求,返回内容 logger.info("RESPONSE : " + ret); }}
5.运行
通过运行程序并访问:http://localhost:8080,可以获得下面的日志输出:
实现AOP的切面主要有以下几个要素:
- 使用@Aspect注解将一个java类定义为切面类
- 使用@Pointcut定义一个切入点,可以是一个规则表达式,比如下例中某个package下的所有函数,也可以是一个注解等。
- 根据需要在切入点不同位置的切入内容,5种类型的通知
- 使用@Before在切入点开始处切入内容
- 使用@After在切入点结尾处切入内容
- 使用@AfterReturning在切入点return内容之后切入内容(可以用来对处理返回值做一些加工处理)
- 使用@Around在切入点前后切入内容,并自己控制何时执行切入点自身的内容
- 使用@AfterThrowing用来处理当切入内容部分抛出异常之后的处理逻辑
总结:
使用http://start.spring.io/可以快速的搭建项目,另AOP原理主要是使用动态代理详见:
http://blog.csdn.net/qq_29614459/article/details/53941359
- SpringBoot中AOP的配置
- SpringBoot中aop的使用
- Springboot配置aop
- springboot之AOP配置
- SpringBoot 中Aop处理请求
- springboot中通过aop的形式获取方法执行时间
- Springboot的AOP不生效
- 第七节:SpringBoot 的AOP
- java 关于Spring中Aop的简单理解以及SpringBoot如何添加Aop实现步骤
- springboot中Listener的配置方法
- SpringBoot中使用AOP 监控sql耗时
- springboot中aop(注解切面)应用
- SpringBoot中使用AOP 监控sql耗时
- SpringBoot中配置logback
- SpringBoot中SSL配置
- SpringBoot中配置简介
- springboot-AOP
- SpringBoot-AOP
- 寒假篇12-笨小猴
- Linux查找当前目录下的文件
- 火星人家园接手无穷小放飞互联网计划,打造火星人的“百年老店”
- Jmeter监控系统资源
- 简单博弈
- SpringBoot中AOP的配置
- ligerUI调用$.ligerDialog.open弹出窗
- 3.9.1 磁道、扇区、柱面和磁头数
- tomcat 设置http代理
- Android开发:创建项目后报错,com.android.ide.common.process.ProcessException: Failed to execute aapt
- Win7下java环境变量参数配置
- 超简单的使用drawerlayout实现QQ的侧拉面板效果
- zb的生日
- 字符串左右旋转问题