Spring AOP 杂谈
其实AOP的思想现在讲的已经很多了,本身没有什么难点,难的是AOP有自己的一套术语,而我们经常被这套术语搞晕。术语没招,只能理解背诵了,尽管背诵很讨厌,可大家都这么说,不知道,就会被说晕。
AOP思想:如下图,面向切面编程。就是“切“。执行自己的方法时,“在之前,之后,异常,返回,或者前后”都去顺便执行一下其他业务方法,切面就是其他业务方法。

AOP术语:如下图,简单示例

通知:通知定义了切面是什么以及何时使用,首先该通知方法实现了“做什么的代码业务逻辑”,然后确定了在什么时候执行。
前置通知:在目标方法调用之前调用通知。
后置通知:在目标方法完成之后调用通知。
返回通知:在目标方法成功执行之后调用通知。
异常通知:在目标方法抛出异常后调用通知。
环绕通知:通知包裹了被通知的方法,在被通知的方法调用之前和之后执行的自定义行为。
连接点:连接点 是在应用执行过程中能够插入 切面 的一个点。这个点可以是调用方法时、抛出异常时、甚至修改一个字段时。切面代码可以利用这些点插入到应用的正常流程之中,并添加新的行为。
切点:切点就是在 “哪个连接点或哪些连接点处”执行通知。定义了何处执行。
切面:通知+切点=切面 定义了 1.何时2.何处3.干什么 这三要素。
以下的两个概念定义了如何实现AOP
引入:引入允许我们向现有的类添加新方法或属性。而无需修改这些现有的类的情况下,让他们具有新的行为和状态。
织入:是切面应用到目标对象并创建新的代理对象的过程。
这两个概念都是 “动作”。
在目标对象的生命周期里可以有多个点进行织入(这里要了解一下 java类的运行过程)
编译期:切面在目标类编译时被织入,这种方式需要特殊的编译器。
类加载期:切面在目标类加载到JVM时被织入。这种方式需要特殊的类加载器(ClassLoader),它可以在目标类被引入应用之前增强该目标类的字节码。
运行期:切面在应用运行的某个时刻被织入。(一般情况下,在织入切面时,AOP容器会为目标对象动态的创建一个代理对象)
AOP实现:
JAVA静态代理 : 代理对象和被代理对象实现相同的接口。
//接口
public interface StaticProxy {
void action();
}
//被代理类
public class BProxy implements StaticProxy {
@Override
public void action() {
System.out.println(BProxy.class.getName()+":做一些事情");
}
}
//代理类
public class DProxy implements StaticProxy{
StaticProxy BProxy;
public DProxy() {
BProxy = new BProxy();
}
@Override
public void action() {
System.out.println(DProxy.class.getName()+":先做一些事情");
BProxy.action();
System.out.println(DProxy.class.getName()+":再做一些事情");
}
}
JDK动态代理:动态代理类的字节码在程序运行时由Java反射机制动态生成。java.lang.reflect 包中的Proxy类和InvocationHandler 接口提供了生成动态代理类的能力。一个类 和一个接口实现。JDK动态代理的缺点:被代理类必须是实现接口的类。
//代理类 实现 InvocationHandler
public class DynamicProxy implements InvocationHandler {
private Object target;
public DynamicProxy(Object target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//目标方法之前执行
System.out.println("do sth Before...");
//通过反射机制来调用目标类方法
Object result = method.invoke(target, args);
//目标方法之后执行
System.out.println("do sth After...\n");
return result;
}
}
//供被代理类实现的接口
public interface userSrevices {
public void addUser();
public void deleteUser();
}
//实现接口的被代理类
public class userSrevicesImpl implements userSrevices{
@Override
public void addUser() {
System.out.println("增加了一个用户");
}
@Override
public void deleteUser() {
System.out.println("删除了一个用户");
}
}
//测试
public class test {
public static void main(String[] args) {
//被代理类
userSrevices target = new userSrevicesImpl();
//代理类
DynamicProxy handle = new DynamicProxy(target);
//获取代理
userSrevices proxy = (userSrevices)Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), handle);//Proxy类创建代理对象。
//执行
proxy.addUser();
proxy.deleteUser();
}
}
Cglib动态代理:(目前尚未有实例。。。故引用一哈别的大神的讲解)https://www.cnblogs.com/yangming1996/p/6824249.html
AspectJ实现:
未完待续。
Spring AOP 杂谈的更多相关文章
- 学习AOP之深入一点Spring Aop
上一篇<学习AOP之认识一下SpringAOP>中大体的了解了代理.动态代理及SpringAop的知识.因为写的篇幅长了点所以还是再写一篇吧.接下来开始深入一点Spring aop的一些实 ...
- 学习AOP之认识一下Spring AOP
心碎之事 要说知道AOP这个词倒是很久很久以前了,但是直到今天我也不敢说非常的理解它,其中的各种概念即抽象又太拗口. 在几次面试中都被问及AOP,但是真的没有答上来,或者都在面上,这给面试官的感觉就是 ...
- spring aop
什么是AOP AOP(Aspect-OrientedProgramming,面向方面编程),它利用一种称为“横切”的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将 ...
- spring aop注解方式与xml方式配置
注解方式 applicationContext.xml 加入下面配置 <!--Spring Aop 启用自动代理注解 --> <aop:aspectj-autoproxy proxy ...
- 基于Spring AOP的JDK动态代理和CGLIB代理
一.AOP的概念 在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是OOP的 ...
- Spring AOP详解
一.前言 在以前的项目中,很少去关注spring aop的具体实现与理论,只是简单了解了一下什么是aop具体怎么用,看到了一篇博文写得还不错,就转载来学习一下,博文地址:http://www.cnbl ...
- Spring AOP实例——异常处理和记录程序执行时间
实例简介: 这个实例主要用于在一个系统的所有方法执行过程中出线异常时,把异常信息都记录下来,另外记录每个方法的执行时间. 用两个业务逻辑来说明上述功能,这两个业务逻辑首先使用Spring AOP的自动 ...
- 从零开始学 Java - Spring AOP 实现用户权限验证
每个项目都会有权限管理系统 无论你是一个简单的企业站,还是一个复杂到爆的平台级项目,都会涉及到用户登录.权限管理这些必不可少的业务逻辑.有人说,企业站需要什么权限管理阿?那行吧,你那可能叫静态页面,就 ...
- 从零开始学 Java - Spring AOP 实现主从读写分离
深刻讨论为什么要读写分离? 为了服务器承载更多的用户?提升了网站的响应速度?分摊数据库服务器的压力?就是为了双机热备又不想浪费备份服务器?上面这些回答,我认为都不是错误的,但也都不是完全正确的.「读写 ...
随机推荐
- sql查询exist替换in
很多时候用 exists 代替 in 是一个好的选择: select num from a where num in(select num from b) 用下面的语句替换: select num f ...
- appium_server_v1.4.16版本不适配android7.0系统,运行报错“Attempt to re-install io.appium.settings without first uninstalling”
要解决的问题:appium在androidV7.0系统上运行时报错 Failure [INSTALL_FAILED_ALREADY_EXISTS: Attempt to re-install io.a ...
- BCompare 4重置试用天数
BCompare安装后有30天试用期,试用结束后,你可以卸载重装,以重新获得30天试用天数. BCompare的使用天数记录保存在注册表中,如果不想每次重装,也可删除对应的注册表值来重置激活天数. 命 ...
- 没有Reduce的MapReduce(一)
尝试了一个没有Reduce的MapReduce. [应用场景]: 从Hbase的A表中进行数据抽样,直接输出到B表中. 这种场景下,相当于只进行了一个数据检索,本来是用Hive就可以实现,但是考虑到业 ...
- hdu Lovekey(水题)
#include<stdio.h> #include<string.h> ]; int main() { ],s2[]; int l1,l2,i,j,k; while(scan ...
- 编写高质量代码改善C#程序的157个建议——建议144:一个方法只做一件事
建议144:一个方法只做一件事 “单一职责原则”(SRP)要求每一个类型只负责一件事情.我们将此概念扩展到方法上,就变成了:一个方法只做一件事. 回顾上一建议的代码,LocalInit和RemoteI ...
- APUE(4)---文件和目录 (1)
一.引言 上一章执行I/O的基本函数(打开文件.读文件和写文件),本章将描述文件系统的其他特征和文件的性质,我们将从stat函数开始,并逐个说明stat结构的每一个成员以了解文件的所有属性.在此过程中 ...
- 洛谷 P2596 [ZJOI2006]书架 (splay)
题目描述 小T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在看书的时候,每次取出一本书,看完后放回书柜然后再拿下一本.由于这些 ...
- linux 分区 文件系统
操作系统通过文件系统管理文件及数据,磁盘或分区需要创建文件系统之后才能为操作系统使用,创建文件系统的过程又称之为格式化. 没有文件系统的设备称之为裸设备(raw); 常见的文件系统有fat32,NTF ...
- Android-显示意图和隐式意图
显示意图,一般情况下是用于,APP应用自身:组件(Activity,Service,...) 与 组件(Activity,Service,...) 的激活调用: 显示意图,是可以看得到,明确激活哪一个 ...