Spring 学习笔记(六)AOP 之思想概念和作用、JDK代理与Cglib子类代理
2018-12-14 15:01
405 查看
- 概念
AOP为Aspect Oriented Programming的缩写,意味:面向切面编程。 与IOC一样,是一种思想。
- 作用
对业务逻辑进行分离,降低耦合度,提高程序的重用性,提高开发效率。
- JDK动态代理(接口代理)
弱点:JDK动态代理是基于接口的, 必须有接口。
模拟:
1. 新建接口类
[code]package org.spring.exampleAOP; public interface People { void Shoot(); }
2. 新建实现类
[code]package org.spring.exampleAOP; public class Sadamu implements People { public Sadamu() { } @Override public void Shoot() { System.out.println("萨达姆开枪了"); } }
3. 新建代理类
[code]package org.spring.exampleAOP; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class JdkProxyUtils { public static Object getProxy(final Object obj) { return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { //代理要做的事 System.out.println("记录日志 Befor:" + obj.toString() + " Method: " + method.getName()); method.invoke(obj, args); //执行原对象方法 System.out.println("记录日志 After:" + obj.toString() + " Method: " + method.getName()); return proxy; } }); } }
4. 测试
[code]package org.spring.exampleAOP; public class Test { public static void main(String[] args) { //jdk的动态代理是基于接口 People people = new Sadamu(); People ppeople = (People) JdkProxyUtils.getProxy(people); //传入值必须是接口 ppeople.Shoot(); } }
测试结果:
[code]记录日志 Befor:org.spring.exampleAOP.Sadamu@3764951d Method: Shoot 萨达姆开枪了 记录日志 After:org.spring.exampleAOP.Sadamu@3764951d Method: Shoot Process finished with exit code 0
- Cglib代理(子类代理) 个人感觉是比JDK接口代理方便
1. 需要的jar包 asm.jar和cglib-2.1.3.jar
2. 新建子类代理类
[code]package org.spring.exampleAOP; import org.springframework.cglib.proxy.Enhancer; import org.springframework.cglib.proxy.InvocationHandler; import java.lang.reflect.Method; public class CglibProxyUtils { public static Object getProxy(Object obj){ return Enhancer.create(obj.getClass(), new InvocationHandler() { @Override public Object invoke(Object o, Method method, Object[] args) throws Throwable { System.out.println("记录日志 Befor:" + obj.toString() + " Method: " + method.getName()); method.invoke(obj, args); System.out.println("记录日志 After:" + obj.toString() + " Method: " + method.getName()); return obj; } }); } }
3. 测试
[code]package org.spring.exampleAOP; public class Test { public static void main(String[] args) { //Cglib子类代理 Kazhafei kazhafei = new Kazhafei(); People pkazhafei = (People) CglibProxyUtils.getProxy(kazhafei); //传入的对象有没有接口都无所谓 pkazhafei.Shoot(); } }
相关文章推荐
- spring 学习基础笔记 包括spring 的代理 JDK CGLIB 事物 AOP 以及各种注入
- ITCAST视频-Spring学习笔记(使用CGLIB实现AOP功能与AOP概念解释)
- Spring学习总结(二)——静态代理、JDK与CGLIB动态代理、AOP+IoC
- SpringAOP学习笔记(4)CGLIB动态代理
- Spring学习总结(二)——静态代理、JDK与CGLIB动态代理、AOP+IoC
- Spring学习总结(二)——静态代理、JDK与CGLIB动态代理、AOP+IoC
- spring学习笔记(7)AOP前夕[2]CGLib动态代理实例解析
- Spring学习总结——静态代理、JDK与CGLIB动态代理、AOP+IoC
- spring aop学习8:spring对jdk和cglib动态代理的选择
- Spring AOP 代理机制 JDK&CGLIB
- spring对AOP的支持 JDK动态代理和CGLIB的区别
- spring学习笔记(9)AOP基本概念
- jdk动态代理与cglib代理、spring aop代理实现原理
- 【Java反射学习笔记系列之jdk动态代理】静态代理和动态代理的区别以及动态代理的作用和实现
- AOP学习心得&jdk动态代理与cglib比较
- [Spring学习笔记 4 ] AOP 概念原理以及java动态代理
- SpringAop中的jdk动态代理技术和cglib动态代理技术
- 【Spring AOP】【AspectJ】【CGLIB】【JDK动态代理】【JDK静态代理】区别
- spring(AOP)静态代理、JDK动态代理、cglib实现代理
- Spring 代理对象,cglib,jdk的问题思考,AOP 配置注解拦截 的一些问题.为什么不要注解在接口,以及抽象方法.