4.AOP原理模拟
AOP Aspect-Oriented-Programming 面向切面编程
a)是对面向对象的思维方式的有力补充
好处:可以动态的添加和删除在切面上的逻辑而不影响原来的执行代码
a)Filter
b)Struts2 的 interceptor
Spring AOP的实现依赖于 Java的 Proxy 类
1.首先创建目标对象(需要被代理的对象)(即该对象的方法的执行前后有业务逻辑的添加)
UserService service = new UserServiceImpl();
2.创建一个 InvocationHandler,在这个InvocationHandler中,可以指明需要添加的业务逻辑
Interceptor interceptor = new Interceptor (); //public class Interceptor implements InvocationHandler
3.将目标对象放到 InvocationHandler中,由InvocationHandler 来执行整个业务(添加的业务 + 原来的业务)
interceptor.setTarget(service);
4.代理对象的创建,在创建时,会参考被代理对象实现的接口,代理对象也去实现这些接口
另外,每个代理里面帝实有 InvocationHandler 对象存在的
UserService userProxy = (UserService) Proxy.newProxyInstance(service.getClass().getClassLoader(), service.getClass().getInterfaces(), interceptor);
如上:userProxy 其实是一个实现了UserService接口的 Proxy对象,
//可能这也是为什么 Proxy.newProxyInstance 只能由 接口去接收的原因吧
注:!!一个类 如果在实现了接口的情况下,来为这个类创建一个代理对象时,实现代理时,用jdk 自带的 Proxy 和 InvocationHandler,来帮你产生代理
这个类如果没有实现接口,那么它会直接用操作二进制码的类库(cglib.jar)来帮你产生代理的代码
5.使用代理对象,调用add方法(因为userProxy 是实现了UserService接口的,所以是可以调用的)
userProxy.add();
//5.1 一旦代理对象调用 add方法,代理对象会 反射Method m = UserDAO.getClass.getMethod 拿到add方法对应的Method对象
//5.2 然后调用InvocationHandler 中的 invoke (Object proxy, Method method, Object[] args)
代理对象 add 方法的调用 实际上就是让 InvocationHandler 去处理了,代理对象负责拿到执行方法必要的条件
InvocationHandler 的实现类
public class Interceptor implements InvocationHandler { //被代理对象
private Object target; public Object getTarget() {
return target;
}
public void setTarget(Object target) {
this.target = target;
} public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("方法要执行了");
//调用被代理对象的方法,指明调用哪个被代理对象 ,用到了哪些参数
method.invoke(target, args);
return null;
} }
感觉像是在 被代理的对象上面 先包了一层 InvocationHandler,然后在InvocationHandler上再包了一层 Proxy
然后调用的时候,先去调用Proxy 的 add方法,调用的时候可以拿到执行add方法所必须的条件参数
然后内部再去调用 InvocationHandler 的invoke方法,在InvocationHandler 的invoke方法里面,
有新添加的业务逻辑和 本来要执行方法,通过这个invoke方法的执行,来完成动态的添加和删除在切面上的逻辑,
而不影响原来的执行代码
为什么要分 Proxy 和 InvocationHandler
因为InvocationHandler 获取不到 执行原本的方法 所需要的参数,必须要通过Proxy 给它
Proxy 又不能完成业务逻辑的增加和删除,所以 各司其职
最新文章
- Android-Menu [使用C# And Java实现]
- SQL Server常用的性能诊断语句
- sysbench测试工具
- auto refresh iframe
- C#中out和ref之间的区别
- 【ILSpy反编译】C# 写的程序反编译查看是不是也太容易了点吧,太恐怖了。。。
- SCSF智能客户端学习笔记(一)
- easymock入门贴
- 为什么V8引擎这么快?(转载)
- MySql中启用InnoDB数据引擎的方法
- Java基础(二十三)GUI图形界面编程(Java基础完)
- JavaScript 浮点数运算 精度问题
- 监听enter事件
- windows Git安装
- nao安装中文包教程
- Jmeter元件运行顺序
- MySQL事务的介绍+事务的特性+事务的开启
- SSH框架下ajax调用action并生成JSON再传递到客户端【以get和post方式提交】
- jenkins 持续集成iOS开发
- 【转】npm install、npm install --save与npm install --save-dev区别