什么是AOP?

          AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。

应用场合:事务管理、性能监视、安全检查、缓存 、日志等。

Spring AOP使用纯Java实现,不需要专门的编译过程和类加载器,在运行期通过代理方式向目标类织入增强代码。

AOP采取横向抽取机制,取代了传统纵向继承体系重复性代码。

纵向继承:

横向抽取:

AOP底层将采用代理机制实现

1.接口 + 实现类 :spring采用 jdk 的动态代理Proxy

2.实现类:spring 采用 cglib字节码增强代理。

代码实现:在增删改方法之前,增加事务处理(开启事物,提交事物),前提不修改当前类。

userService.java
public interface userService {
void save();
void delete();
void update();
void find();
}
userServiceImpl.java
@Component("userService")
public class userServiceImpl implements userService{
//增强 public void save() { System.out.println("保存用户"); } public void delete() {
//
System.out.println("删除用户");
//
} public void update() { System.out.println("修改用户");
} public void find() {
System.out.println("查找用户");
} }

1)JDK 动态代理

jdk动态代理实现主要靠Proxy类和InvocationHandler接口来实现。

userServiceProxyFactory.java

public class userServiceProxyFactory implements InvocationHandler{
//代理对象
private userService us; public userServiceProxyFactory(userService us){
super();
this.us=us;
}
//返回代的对象
//参数1,类加载器 参数2,代理类的接口 参数3.实现增强的代码(对原方法增强的一个方法)
public userService getUserServiceProxy(){
return (UserService)Proxy.newProxyInstance(userServiceProxyFactory.class.getClassLoader(),
UuerServiceImpl.class.getInterfaces(),this); }
@Override
//参数1,代理对象 参数2,原代理对象的方法 参数3,代理方法的参数
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//增强
System.out.println("开启事务"); //前置通知
Object invoke = method.invoke(us, args); //调用原方法(切入点) + (通知) = 切面
System.out.println("提交事务"); //后置通知
return invoke;
} }

测试代码:

public class Mytest {

    @Test//动态代理
public void test(){
userService us = new userServiceImpl();
userServiceProxyFactory factory = new userServiceProxyFactory(us);
userService userServiceProxy = factory.getUserServiceProxy();//返回代理后的对象
//未使用jdk动态代理
us.save();
System.out.println("--------------------------");
//使用动态代理对象
userServiceProxy.save();
}
}

2)CGLIB代理

public class UserServiceProxyFactory2 {
//代理对象
/*private UserService us; public UserServiceProxyFactory2(UserService us){
super();
this.us=us;
}*/
//返回代理对象
public UserService getUserServiceProxy(){
Enhancer en = new Enhancer(); //帮我们生成代理对象
en.setSuperclass(UserServiceImpl.class);
en.setCallback(new MethodInterceptor() {
@Override
//参数1,目标对象 参数2,目标对象的方法 参数3,方法中参数 参数4 代理方法
public Object intercept(Object proxyObj, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
System.out.println("开启事务");
//目标方法调用
//Ojbect invoke = method.invoke(us, args)
Object invokeSuper = methodProxy.invokeSuper(proxyObj, args);
System.out.println("提交事务"); return invokeSuper;
}
});
UserService us = (UserService) en.create(); //创建代理对象
return us;
}
}

测试代码

public class Mytest {

    @Test
public void test2(){
UserServiceProxyFactory2 factory = new UserServiceProxyFactory2();
UserService userServiceProxy = factory.getUserServiceProxy();
UserServiceProxy.save();
} }

04_Spring AOP两种代理方法的更多相关文章

  1. 死磕Spring之AOP篇 - Spring AOP两种代理对象的拦截处理

    该系列文章是本人在学习 Spring 的过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring 源码分析 GitHub 地址 进行阅读. Spring 版本:5.1 ...

  2. spring AOP的两种代理

    本篇记录下spring AOP的两种代理,为下一篇AOP实现做下铺垫. 1.JDK动态代理  2.cglib代理 1.如果目标对象实现了接口,默认情况下会采用JDK的动态代理实现AOP2.如果目标对象 ...

  3. JAVA高级架构师基础功:Spring中AOP的两种代理方式:动态代理和CGLIB详解

    在spring框架中使用了两种代理方式: 1.JDK自带的动态代理. 2.Spring框架自己提供的CGLIB的方式. 这两种也是Spring框架核心AOP的基础. 在详细讲解上述提到的动态代理和CG ...

  4. Spring两种代理区别

    Spring的两种代理JDK和CGLIB的区别浅谈: Java动态代理是利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用invokeHandler类来处理: 而cglib动态代理是利用a ...

  5. Spring的两种代理方式:JDK动态代理和CGLIB动态代理

    代理模式 代理模式的英文叫做Proxy或Surrogate,中文都可译为”代理“,所谓代理,就是一个人或者一个机构代表另一个人或者另一个机构采取行动.在一些情况下,一个客户不想或者不能够直接引用一个对 ...

  6. Spring-Aop的两种代理方式

    Spring-Aop两种代理方式: 1.JDK动态代理:用于目标类实现了接口: 2.Cglib动态代理:用于目标类没有实现接口: spring会依据目标类是否实现接口来选择使用哪种代理方式(目标类:相 ...

  7. angular2系列教程(十)两种启动方法、两个路由服务、引用类型和单例模式的妙用

    今天我们要讲的是ng2的路由系统. 例子

  8. git两种合并方法 比较merge和rebase

    18:01 2015/11/18git两种合并方法 比较merge和rebase其实很简单,就是合并后每个commit提交的id记录的顺序而已注意:重要的是如果公司用了grrit,grrit不允许用m ...

  9. 两种Ajax方法

    两种Ajax方法 Ajax是一种用于快速创建动态网页的技术,他通过在后台与服务器进行少量的数据交换,可以实现网页的异步更新,不需要像传统网页那样重新加载页面也可以做到对网页的某部分作出更新,现在这项技 ...

随机推荐

  1. 使用Photoshop+960 Grid System模板进行网页设计

    前几天彬Go和大家一起讨论了960 Grid System这个CSS网格系统框架的基本原理和使用方法.今天,暴风彬彬将教大家使用Photoshop结合960 Grid System模板来设计一个真正符 ...

  2. Apache2.2+tomcat7 负载均衡配置

    思路及步骤:第一步配置tomcat,第二步配置apache 服务器,第三步添加项目到tomcat中并测试 第一步配置tomcat 1,打开 第一个tomcat,conf文件夹下的server.xml ...

  3. 客户端IAP二次验证

    1.首先苹果IAP把每次购买抽象成了一个事务(SKPaymentTransaction), - (void)productsRequest:(SKProductsRequest *)request d ...

  4. 【笔记篇】斜率优化dp(一) HNOI2008玩具装箱

    斜率优化dp 本来想直接肝这玩意的结果还是被忽悠着做了两道数论 现在整天浑浑噩噩无心学习甚至都不是太想颓废是不是药丸的表现 各位要知道我就是故意要打删除线并不是因为排版错乱 反正就是一个del标签嘛并 ...

  5. 【学术篇】SDOI2010 古代猪文

    这里可能包含传送门 又双叒叕数论大杂烩... 定理什么我都不会证 题目很长很啰嗦 但是题意很显然... 化完式子之后就是这么个东东:\(G^{\sum_{k|n}C_k^{\frac{n}{k}}}\ ...

  6. bcolz

    raise Exception("this is an ex") bcolz总结: 0.需要用bcolz的columns需要为ndarray的列,不能直接拿list去赋值,因为我发 ...

  7. yii2使用vendor文件夹下的的css文件

    yii2 使用 vendor 下在css样式, 可以新建一个Asset,定义 public $sourcePath="@vendor/..",如:public $sourcePat ...

  8. Image 释放

    你是用 Image.FromFile取的图片吧,这个方法会锁定图片文件. 有几种方法解决:一:System.Drawing.Image img = System.Drawing.Image.FromF ...

  9. 廖雪峰Java16函数式编程-2Stream-5filter

    1.filter简介 Stream.filter()是一个转换方法,把一个Stream转换为另一个Stream. 所谓filter操作,就是对一个Stream的所有元素进行测试,不满足条件的元素就被过 ...

  10. thinkphp 输入变量

    在Web开发过程中,我们经常需要获取系统变量或者用户提交的数据,这些变量数据错综复杂,而且一不小心就容易引起安全隐患,但是如果利用好ThinkPHP提供的变量获取功能,就可以轻松的获取和驾驭变量了. ...