关于Spring的AOP也是Spring的非常重要的一项技术。大致上可以这样说,面向切面编程,它的出现说明可以在不修改代码的情况下实现对功能的增强。而增强就是给一个方法增加一些功能。AOP主要思想就是把增强的代码可以单独写成一个方法。比如说想对某个方法增加一个检测权限的功能,就可以单独写成一个checkPrivilege方法。可以在需要被增强的方法执行之前,自动的让checkPriviliege方法执行,就像在这个方法前形成一个切面,在切面出安装一个checkPriviliege方法。最终在没有修改源代码的情况下实现功能增强了。这就是它的一个思想,其Spring中的AOP实现有两种方式。分别是JDK代理和Cglib代理。先说说JDK代理:它只能对实现接口的类产生代理。

接口:

public interface PostCard {
public void soup();
}

类实现以上接口:

@Service("postCard")
public class PostCardImpl implements PostCard{ public void soup() {
System.out.println("我是postcard...");
} }

创建代理类,该类必须要实现InvocationHandler接口,代码如下:

/*
* 动态代理实现
* */ public class JdkProxy implements InvocationHandler{ private PostCard postCard; //增强的目标 /*
* 构造方法
* */
public JdkProxy(PostCard postCard) {
super();
this.postCard = postCard;
} /*
* 利用JDK代理动态生成对象的方法
* newProxyInstance的三个参数
* loader:目标类的加载器
* interfaces:目标类所实现的接口
* handler:回调
* */
public PostCard create(){
PostCard proxy = (PostCard) Proxy.newProxyInstance(postCard.getClass().getClassLoader(), postCard.getClass().getInterfaces(), this);
return proxy;
} /*
* 执行目标对象的方法
* */
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("检测功能before"); // 调用目标方法
Object result = method.invoke(postCard, args); System.out.println("检测功能after"); return result;
}
}

测试:

    @Test
public void test() { // 实例化目标对象
PostCard cardImpl = new PostCardImpl(); // 实例化代理对象
JdkProxy proxy = new JdkProxy(cardImpl); // 生成代理对象
PostCard create = proxy.create(); // 调用代理对象方法
create.soup();
}

而cglib对象则是对没有实现接口类的增强,JDK代理无法做到这一点。cglib代理就是生成目标类的子类来增强。如下为案例,复用以上的类无须实现接口。然后创建cglib代理类,代码如下:

//代理类
public class CglibProxy implements MethodInterceptor{ /*
* 调用构造函数的时,将类对象创建出来
* */
private PostCard postCard; //增强的目标 public CglibProxy(PostCard postCard){
this.postCard=postCard;
} // 利用cglib生成代理对象 public PostCard create(){
// 创建cglib的核心对象
Enhancer enhancer = new Enhancer(); // 设置父类
enhancer.setSuperclass(postCard.getClass()); // 设置回调
enhancer.setCallback(this); // 创建代理对象
PostCard proxy = (PostCard) enhancer.create(); return proxy;
} /*
* 调用目标方法时,实质上就是调用该方法
* 参数1:代理对象
* 参数2:目标方法
* 参数3:目标方法的形参
* 参数4:代理方法
* */
public Object intercept(Object arg0, Method arg1, Object[] arg2, MethodProxy arg3) throws Throwable { // 添加检测权限的方法
System.out.println("检测权限cglib..."); // 调用目标父类方法
Object object = arg3.invokeSuper(arg0, arg2); return object;
}
}

测试代码如下:

    @Test
public void test1() {
// 目标
PostCard impl = new PostCardImpl(); // 实例化代理对象
CglibProxy cglibProxy = new CglibProxy(impl); // 生成代理对象
PostCard create = cglibProxy.create(); // 调用代理对象的方法
create.soup();
}

以上就是这2种代理的区别,SpringAOP编程就是利用的代理方法实现切面编程。

Spring核心技术AOP实现原理的更多相关文章

  1. 深入浅析Spring的AOP实现原理

    转载来源:https://www.jb51.net/article/81788.htm AOP(Aspect-OrientedProgramming,面向切面编程),可以说是OOP(Object-Or ...

  2. Spring IOC AOP的原理 如果让你自己设计IOC,AOP如何处理(百度)

    百度的面试官问,如果让你自己设计一个IOC,和AOP,如何设计, 我把IOC的过程答出来了,但是明显不对, (1) IOC 利用了反射,自己有个id,classtype,hashmap,所有的功能都在 ...

  3. 【Spring】AOP实现原理(一):AOP基础知识

    AOP相关概念 在学习AOP实现原理之前,先了解下AOP相关基础知识. AOP面向切面编程,它可以通过预编译方式或者基于动态代理对我们编写的代码进行拦截(也叫增强处理),在方法执行前后可以做一些操作, ...

  4. 新秀学习SSH(十四)——Spring集装箱AOP其原理——动态代理

    之前写了一篇文章IOC该博客--<Spring容器IOC解析及简单实现>,今天再来聊聊AOP.大家都知道Spring的两大特性是IOC和AOP. IOC负责将对象动态的注入到容器,从而达到 ...

  5. 理解Spring:AOP的原理及手动实现

    引入 到目前为止,我们已经完成了简易的IOC和DI的功能,虽然相比如Spring来说肯定是非常简陋的,但是毕竟我们是为了理解原理的,也没必要一定要做一个和Spring一样的东西.到了现在并不能让我们松 ...

  6. 【Spring】AOP实现原理(三):创建代理

    AbstractAutoProxyCreator 在AbstractAutoProxyCreator的wrapIfNecessary方法中,调用getAdvicesAndAdvisorsForBean ...

  7. 【Spring】AOP实现原理(二):Advisor获取

    @EnableAspectJAutoProxy @EnableAspectJAutoProxy注解可以用来开启AOP,那么就从@EnableAspectJAutoProxy入手学习一下Spring A ...

  8. Spring之AOP实现原理

  9. Spring核心技术AOP案例

    在SpringAOP开发之前,首先要了解一下这几个概念.Target:目标,通俗的说对哪个类做增强,那个类就是目标.JoinPoint:连接点,在实际开发中可以被增强的点.PointCut:切入点,在 ...

随机推荐

  1. FOJ 1402(dp推规律)

    推规律吧 /** 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ...

  2. iOS 开发之--打测试包的时候报错的解决方法

    在打测试包的时候,一直出现一个报错,解决方法如下: 方法一: 描述文件所在目录是:~/Library/MobileDevice/Provisioning\ Profiles/,可以直接前往文件夹,把所 ...

  3. 170220、maven国内镜像 阿里云

    maven确实是一个好东西,但是在国内下载官方仓库的jar却是个大问题,速度不敢恭维,现在oschina的国内maven镜像服务已关闭,无奈之下只能另寻门路. 今天突然发现了阿里云maven国内镜像, ...

  4. 160812、apache milagro分布式安全认证系统

    java32位.64位及js的代码:http://pan.baidu.com/s/1cqnwuE 一.云链接为中心的软件及需要互联网规模物联网设备 二.利用双线性密码学分发加密操作和分裂的加密参数 三 ...

  5. 淘宝订单数据转CSV

    <html> <body> <div id="result"> </div> <div> <textarea st ...

  6. Python高级教程-高阶函数

    Higher-order function(高阶函数) 变量可以指向函数 以Python内置的求绝对值的函数abs()为例,调用该函数用以下代码: >>> abs(-10) 10 但 ...

  7. C++和JAVA实例化对象的区别

    JAVA: A a = new A(); 为A对象创建了一个实例,但在内存中开辟了两块空间:一块空间在堆区,存放new A()这个对象:另一块空间在堆栈,也就是栈,存放a,a的值为new A()这个对 ...

  8. Oracle 11g数据库详解

    常见异常: ORA-14025:不能为实体化视图或实体化视图日志指定PARTITION ORA-14026:PARTITION和CLUSTER子句互相排斥 ORA-14027:仅可以指定一个PARTI ...

  9. Github的markdwon如何使用表情符(Emoji)?表情包大全

    如输入 :smile: 会输出  

  10. tensorflow 的rnn的示例 ptb_word_lm.py 的完整代码

    其训练数据源在我的空间里,名字为:tensorflow的ptb-word-lm示例的训练数据源.tgz 讲解参见另一篇文章:  http://www.cnblogs.com/welhzh/p/6739 ...