aop

SpringAOP

只愿长相守 提交于 2020-03-12 22:00:16
1、AOP(Aspect Oriented Programming)面向切面编程 概述:通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术 AOP是OOP的延续,是函数式编程的一种衍生范型,利用AOP可以对业务逻辑的各个部分进行隔离,,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率. 作用:在程序运行期间,不修改源码对已有方法进行增强(加上统一的逻辑处理)。 优势:减少重复代码、提高开发效率、维护方便 AOP是一门统一拦截处理的技术,类似于过滤器技术。与过滤器不同的是过滤过滤是请求路径,而AOP拦截的是方法。 AOP技术的底层技术就是动态代理模式的实现,所有先了解代理模式和动态代理模式 2、代理模式 概述:为其他对象(代理对象)提供一种代理以控制对这个对象(源对象)的访问。就是说,声明一个代理对象去控制对源的对象的访问 代理模式的缺陷: (1)代理类必须要继承或者实现一个基类或者接口,每个接口都要实现一个新的代理类,限制了代理的源对象的类型 (2) 每个方法的逻辑处理,还是要重复编写。(代理模式并不可以减少代码) 3、动态代理模式 (1)动态代理解决了以上代理模式两个问题:    代理模式的类型是固定的,而动态代理模式的代理类,不需要指定固定的接口,可以自由的使用任何接口来实现代理    代理模式的代码还是重复编写的

Spring+Mybatis

六月ゝ 毕业季﹏ 提交于 2020-03-12 11:01:43
1、整合方式共有四种,这里总结了三种。 2、通用配置 2.1、依赖包: 在导依赖包时,不能导入 < dependency > < groupId > org.ow2.asm </ groupId > < artifactId > asm </ artifactId > < version > 5.0.3 </ version > </ dependency > 此包,否则会报方法找不到的异常,其实是jar包中的类冲突。 < project xmlns = "http://maven.apache.org/POM/4.0.0" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" > < modelVersion > 4.0.0 </ modelVersion > < groupId > com.lin </ groupId > < artifactId > spring-mybatis </ artifactId > < version > 0.0.1-SNAPSHOT </ version > < dependencies

Spring Boot 中的AOP使用示例,打印请求执行时间等

巧了我就是萌 提交于 2020-03-12 10:15:49
参考书: Spring实战(第4版) Spring Boot 2 精髓 IDE: IDEA 2019.2.3 Maven 3.6.2 Spring Boot 2.1.10.RELEASE Knife4j 一、准备: 1. 对Spring AOP 有点了解 2. pom中添加aop的starter 如果parent定义了版本,此处可以不加version <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> <version>2.1.10.RELEASE</version> </dependency> 二、配置 1. 在启动类添加自动代理注解 @EnableAspectJAutoProxy 2. 编写切面 import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.util.StopWatch; @Configuration public class GlobalConfig { @Bean StopWatch

22-Spring源码解析之AOP(1)——@EnableAspectJAutoProxy注解原理

早过忘川 提交于 2020-03-12 08:54:25
Spring版本: <version>5.2.1.RELEASE</version> 目录 一、`AOP`概览 1. 例子 1.1 创建用于拦截的`Bean` 1.2 切面类 1.3 配置类 1.4 测试类 1.5 测试结果 二、 `@EnableAspectJAutoProxy`注解 三、解析`@EnableAspectJAutoProxy`注解 上一篇: 21-Spring源码解析——IOC容器创建与Bean生命周期总结 截至到本篇文章,我终于把 IOC 写完啦!现在开启 Spring 的第二个百宝箱: AOP 一、 AOP 概览 我们知道,使用 面向对象编程( OOP ) 有一些弊端,当需要为多个不具有继承关系的对象引入同一个公共行为的时候,例如:日志、安全检测等,我们只有在每个对象里引用公共行为,这样程序中就产生了大量的重复代码,程序就不便于维护了,所以就有了一个对面向对象编程的补充,即 面向切面编程( AOP ) , AOP 所关注的方向是横向的,不同于 OOP 的纵向。 Spring 2.0 采用 @AspectJ 注解对 POJO 进行标注,从而定义了包含 切点信息 和 增强横切逻辑 的切面。 Spring 2.0 将这个切面织入到匹配的目标 Bean 中。 下面,我们先来直观地浏览一下 Spring 中 AOP 的简单示例。 1. 例子 我们这个例子比较纯粹

装饰者模式(Decorator pattern)

半城伤御伤魂 提交于 2020-03-12 04:54:16
说起来惭愧,在某群解答别人问题时居然回答错误,羞煞我也。为此特地补习一下。 :( 装饰者模式 作用: 动态给对象添加职责 典型案例: 在一般的留言本中(支持UBB)输入文本,按B设置为粗体,I为斜体,实际上就是给文本动态的加上了<b>文本</b>,<I>等文字环绕</I>,而后通过解释器进行替换于是就有了最终页面的效果。这样的思路是很简单的,然而对于面向对象的实现方式来说其实还是有点麻烦的. 鉴于关于文本的例子过多,我们这里举的例子采用Stream的简化版本 类图: 对于.Net Framework中存在N种流, FileStream, MemoryStream, BinaryStream, NullStream等等,无非这些Stream都是Stream的确定实例,而通过CryptoStream的子类来对各种流进行加密解密等等功能的操作,在我们的类图里使用SecurityStream和子类HashedStreamDecorator, SHAStreamDecorator等来表示 关于实现的代码的方式则很简单,相信读者通过类图即可得到程序。实际BCL中的Stream会麻烦许多,会有很多的虚方法,Read, Seek,同步流,异步流等等,然而架构是一样的 关于动态职责的添加还有很多实现,这里还有一种AOP的方法, :) http://msdn.microsoft.com/en-us

一个简单的Spring的AOP例子

给你一囗甜甜゛ 提交于 2020-03-11 04:15:26
目标对象的接口:IStudent.java 1 /** 2 * 3 */ 4 package com.dragon.study; 5 6 /** 7 * @author dragon 8 * 9 */ 10 public interface IStudent { 11 12 public void addStudent(String name); 13 } 14 目标类:StudentImpl.java 1 /** 2 * 3 */ 4 package com.dragon.study.Impl; 5 6 import com.dragon.study.IStudent; 7 8 /** 9 * @author dragon 10 * 11 */ 12 public class StudentImpl implements IStudent { 13 14 public void addStudent(String name) { 15 System.out.println( " 欢迎 " + name + " 你加入Spring家庭! " ); 16 } 17 } 18 前置通知:BeforeAdvice.java 1 /** 2 * 3 */ 4 package com.dragon.Advice; 5 6 import java.lang.reflect.Method; 7

spring AOP(2)

强颜欢笑 提交于 2020-03-11 02:14:36
前面写过一篇关于 Spring AOP 方面的文章,探讨了 Spring AOP 底层实现的一些细节知识,这里面涉及到了 JAVA 反射机制,代理模式以及 CGLIB 库的使用。也就是说, Spring AOP 底层实现就是靠动态代理(针对有接口的类)和 CGLIB (针对没有实现接口的一般类),那么,有了这些知识,再辅佐对核心配置 XML 文件解析的能力,其实就可以实现一个简易的基于 IOC 和 AOP 的小框架,大家可以自己尝试着写一下。下面呢我们就由浅入深地来看看在 Spring 中 AOP 是怎么实现的。 最简单的 AOP 实现只需要涉及 3 个概念:目标 (Target) ,通知 (Advice) 和代理 (Proxy) 。目标呢,当然就是真实的需要被代理的对象,一般它会实现至少一个接口。通知呢,就是当目标的方法调用时需要调用的代码,也叫拦截器。而代理,毫无疑问就是加入了通知的目标了,它可以作为目标的替身出现。为了说明这三者的关系,我们来看一个网上有趣的小例子:一间书店开始打折促销,规则是每一名顾客只能买一本书,并且当顾客来到书店时,要说喜欢您来。顾客走的时候,还要说喜欢您再来!(麦当劳啊 ^_^ ) 顾客如果买到 <hibernate in action> 这本书,要抛出异常,告知他没有存货!呵呵,好啦,洪哥,我们动手吧! package com.wepull

基于spring自动注入及AOP的表单二次提交验证

£可爱£侵袭症+ 提交于 2020-03-10 23:24:50
这几天在网上闲逛,看到了几个关于spring的token二次提交问题,受到不少启发,于是自己动手根据自己公司的项目框架结构,制作了一个基于spring自动注入加上AOP的表单二次提交。 原理:建立两个注解类,一个进行token的设置,一个进行token的验证。在一个Aspect中,对这两个注解进行捕获并进行相应的验证。 废话不多说,下面是代码: Token注解类,标记需要设置token的方法。 @Documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) //设定此注解对应的是方法。 public @interface Token { } TokenValid注解类,标记需要验证token的方法。 @Documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface TokenValid { } TokenAspect类,对上面两个注解标识的方法的访问进行捕获并处理。 @Aspect @Component public class TokenAspect { @Around("@annotation(token)") //可以直接捕获下面这个方法中参数所设定的注解类型

Spring+SpringMVC+Hibernate整合

守給你的承諾、 提交于 2020-03-10 13:43:51
使用Maven构建项目,用pom.xml引入相应jar,配置以下文件 创建spring.xml: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context

18、spring注解学习(AOP)——AOP功能测试

為{幸葍}努か 提交于 2020-03-10 13:19:46
AOP-AOP功能测试 AOP : 【动态代理】指程序运行期间动态的将某段代码切入到制定方法位置进行运行的编程方式。 导入AOP模块:Spring AOP(spring-aspects) 定义一个业务逻辑类(Mathcalculator);在业务逻辑运行的时候将日志进行打印(方法之前、方法运行之后等) 定义一个日志切面类(LogAspects):切面类里面的方法需要动态感知MathCalculator(div)运行到哪里,然后执行 方法通知: 前置通知(@Befor):LogStart 后置通知(@After):LogEnd 返回通知(@AfterReturning):LogReturn 异常通知(@AfterThrowing):LogException 环绕通知(@Aound):动态代理,手动推进目标方法运行(joinPoint.procced()) 将切面类的目标犯法标注何时何地运行(通知注释); 将切面类和业务逻辑类(目标方法所在类 )加入到容器类; 配置类中@EnableAspectJAutoProxy 开启基于注解的AOP模式 导入spring-aspects依赖 <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> <version>4.3