spring AOP 面向切面编程 Aspect Oriented Programming(适用于权限检查,日志记录,性能分析,事务管理,异常管理) 。
AOP实现原理是通过动态代理实现的。
JDK提供的动态代理(两个必要重要的类为Proxy、InvocationHandler),如果需要为某个类产生代理,这个类必须是实现某个接口的,否则使用JDK是无法为此类创建代理的。(Hibernate也可以实现动态代理,但是它却不需要此类实现接口,它是直接去修改二进制代码,使用的当然是cglib)。关于JDK动态代理可以参看博文“
Spring AOP的底层实现技术---JDK动态代理
”。
代理类里包含被代理类所实现接口里的所有方法,当调用代类里面的方法的时候,它会调用invocationHandler那个实现类去实现。
如代码:
1. ForumService target = new ForumServiceImpl();//①目标业务类
2. //② 将目标业务类和横切代码编织到一起
3. PerformaceHandler handler = new PerformaceHandler(target);
//③为编织了目标业务类逻辑和性能监视横切逻辑的handler创建代理类
4. ForumService proxy = (ForumService) Proxy.newProxyInstance(
5. target.getClass().getClassLoader(),
6. target.getClass().getInterfaces(),
7. handler);
8. //④ 操作代理实例
proxy.removeForum(10); 此处就是调用代理类里的方法,这个时候代理类就会交给handler去实现,调用invoke方法。
handler里的关键代码如下:
1. public Object invoke(Object proxy, Method method, Object[] args)
2. throws Throwable {
3. PerformanceMonitor.begin(target.getClass().getName()+"."+ method.getName());
4. Object bj = method.invoke(target, args);//②通过反射方法调用目标业务类的业务方法
5. PerformanceMonitor.end();
6. return obj;
7. }
还有cglib也可以实现动态代理,它是通过操作二进制文件实现的。
2012--08-27 spring 21集完。。。待续