Spring学习_02_AOP原理-动态代理
来源:互联网 发布:linux连不上tomcat 编辑:程序博客网 时间:2024/06/06 20:45
Spring AOP核心机制就是JDK中的动态代理。如何实现动态代理有两种方式:
1:代理对象和被代理对象实现同样接口,这样,代理对象就可以代理被代理的对象来完成所有事宜(调用方法)。要求被代理的对象一定要实现相应的接口。
2:被代理的对象可以不实现接口,也可以直接以被代理对象的二进制码的方式来直接为其生成代理对象,hibernate、spring中就是这样完成的。
这里所讲的是JDK中动态代理的实现。分为如下几步:
第一步:准备接口,被代理对象。代码如下:
接口:
public interface UserDAO {public void save(User user);}
被代理对象(接口的实现类):
public class UserDAOImpl implements UserDAO {public void save(User user) {System.out.println("user saved!");}}第二步:准备代理对象用来帮助被代理对象处理事宜的handler:
public class MyInVocationHandler implements InvocationHandler {private Object target;public MyInVocationHandler(Object target) {super();this.target = target;}@Overridepublic Object invoke(Object obj, Method m, Object[] args)throws Throwable {System.out.println(m.getName()+" is invoked");m.invoke(target, args);return null;}}第三步:编写测试:
@Testpublic void testAdd2() throws Exception{User u = new User();u.setUsername("zhangsan");u.setPassword("zhangsan");UserDAO udao = new UserDAOImpl();MyInVocationHandler handler = new MyInVocationHandler(udao);UserDAO UDAO = (UserDAO) Proxy.newProxyInstance(udao.getClass().getClassLoader(), udao.getClass().getInterfaces(), handler);UDAO.save(u);}这里要注意的是:Proxy.newProxyInstance()方法返回的并不是UserDaoImpl的对象,而是一个Proxy类的对象,这是他们实现了同样的接口。同时由于代理对象中包含了一个被代理的对象,所以代理对象和被代理对象要使用同一个类加载器来加载类到内存。
最后一步:验证测试输出:
save is invokeduser saved!从上面的输出可以看到,我们的代理对象在调用被代理对象的方法之前加入了自己的逻辑。这在很多地方都有应用,比如记录日志,权限的控制。
关于动态代理中,InvocationHandler的invoke方法中的第一个参数表示的是生成的代理对象,如果m.invoke(target.args)不小心写错成了m.invoke(obj,args)。这个时候就会出现死循环。这很好理解。
0 0
- Spring学习_02_AOP原理-动态代理
- spring 动态代理 原理
- spring aop原理(动态代理)
- Spring学习之动态代理
- 学习Spring之动态代理
- Spring 4 学习笔记4:Java动态代理(Spring AOP原理)
- Spring 的 动态代理:AOP原理
- Spring AOP 的实现原理----动态代理
- Spring AOP之动态代理原理解析
- Spring AOP 原理分析 2 动态代理
- Spring AOP之动态代理原理解析
- 菜鸟学习Spring——60s让你学会动态代理原理(动态代理是怎么生成的)
- [Spring学习笔记 4 ] AOP 概念原理以及java动态代理
- 菜鸟学习Spring——60s让你学会动态代理原理
- aop原理学习——动态代理
- java中代理,静态代理,动态代理以及spring aop代理方式,实现原理统一汇总
- 【spring框架】动态代理的学习(转)
- Spring AOP 学习之cJlib动态代理
- VM安装Centos7 报错无法执行64位操作
- [LeetCode]Fraction to Recurring Decimal
- Http Status 304响应状态的资源更新机制
- 面试笔谈
- c++Primer,一,快速入门
- Spring学习_02_AOP原理-动态代理
- 面向对象的一个例程
- java web基础之servlet
- SetWindowPos 函数的含义及用法
- 欢迎使用CSDN-markdown编辑器
- 集合框架总结(二)
- Ubuntu 下安装 Slickedit
- JAVA和SQL Server之间的小摩擦
- 从JDK 1.7开始,java程序员不能够调用JDK系统包中以sun开头的类