AOP_2.使用cglib中的Proxy技术实现
2010-06-09 15:43
429 查看
在上篇的基础上创建CglibProxyFactory
在AOPTest类中添加方法
AOP中的概念
1. Aspect(切面)
指横切性关注点的抽象即为切面,它与类相似,只是两者的关注点不一样,类是对物体特征的抽象,而切面横切性关注点的抽象.
例子中:业务bean方法 就是切面,当然切面也可以是字段,或者其它,意思也就是从那里下手
2. joinpoint(连接点)
所谓连接点是指那些被拦截到的点。在spring中,这些点指的是方法,因为spring只支持方法类型的连接点,实际上joinpoint还可以是field或类构造器)
例子中:被拦截的点是一个连接点,那么例子中的连接点是业务bean方法,每个拦截到的都是一个连接点
3. Pointcut(切入点)
所谓切入点是指我们要对那些joinpoint进行拦截的定义.
例子中:也可以说是一个描述吧,“拦截所有的业务bean 方法”就是切入点,只是个定义
4. Advice(通知)
所谓通知是指拦截到joinpoint之后所要做的事情就是通知.通知分为前置通知,后置通知,异常通知,最终通知,环绕通知
例子中:见CglibProxyFactory类中的注释位置
5. Target(目标对象)
代理的目标对象 例子中:PersonServiceBean就是目标对象
6. Weave(织入)
指将aspects应用到target对象并导致proxy对象创建的过程称为织入.
7. Introduction(引入)
在不修改类代码的前提下, Introduction可以在运行期为类动态地添加一些方法或Field.
总结:
以上两种实现AOP编程是Spring AOP的核心,Spring AOP创建代理对象的时候,会检查目标对象是否实现某个接口,如果实现了某个接品就会用JDK中的Proxy技术,反之则用cglib 中的Proxy技术。
package com.umikawa.aop; import java.lang.reflect.Method; import com.umikawa.User.User; import net.sf.cglib.proxy.Enhancer; import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy; public class CglibProxyFactory implements MethodInterceptor{ private Object targetObject; public Object createProxyInstance(Object targetObject) { this.targetObject = targetObject; Enhancer enhancer = new Enhancer(); // 该类用于生成代理对象 enhancer.setSuperclass(this.targetObject.getClass()); // 设置父类 enhancer.setCallback(this); // 设置本身为回调函数 return enhancer.create(); // 生成代替对象 } @Override public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable { // 环绕通知 Object result = null; if(User.USER_NAME!=null){// 模拟已经登录 // ... 方法前执行 - 前置通知 System.out.println("已成功的拦截到此方法!!登录用户为:"+User.USER_NAME); try { result = methodProxy.invoke(this.targetObject, args); // 调用目标对象的方法 // ... 方法后执行 - 后置通知 } catch (Exception e) { // ... 错误执行 - 例外通知 e.printStackTrace(); }finally { // ... 总是执行 - 最终通知 } }else{ System.out.println("对你不起、你没有权限!"); } return result; } }
在AOPTest类中添加方法
// 模拟用户登录调用方法- cglib @Test public void testCglibUserProxy() { // 模拟登录 User.setUSER_NAME("李强"); // 持有目标对象的一个代理 PersonService personService = (PersonService)new CglibProxyFactory().createProxyInstance(new PersonServiceBean()); // 更新人员 personService.updatePerson(); } // 模拟用户未登录调用方法操作 - cglib @Test public void testCglibNOUserProxy() { // 模拟非登录 User.setUSER_NAME(null); // 持有目标对象的一个代理 PersonService personService = (PersonService)new CglibProxyFactory().createProxyInstance(new PersonServiceBean()); // 更新人员 personService.updatePerson(); }
AOP中的概念
1. Aspect(切面)
指横切性关注点的抽象即为切面,它与类相似,只是两者的关注点不一样,类是对物体特征的抽象,而切面横切性关注点的抽象.
例子中:业务bean方法 就是切面,当然切面也可以是字段,或者其它,意思也就是从那里下手
2. joinpoint(连接点)
所谓连接点是指那些被拦截到的点。在spring中,这些点指的是方法,因为spring只支持方法类型的连接点,实际上joinpoint还可以是field或类构造器)
例子中:被拦截的点是一个连接点,那么例子中的连接点是业务bean方法,每个拦截到的都是一个连接点
3. Pointcut(切入点)
所谓切入点是指我们要对那些joinpoint进行拦截的定义.
例子中:也可以说是一个描述吧,“拦截所有的业务bean 方法”就是切入点,只是个定义
4. Advice(通知)
所谓通知是指拦截到joinpoint之后所要做的事情就是通知.通知分为前置通知,后置通知,异常通知,最终通知,环绕通知
例子中:见CglibProxyFactory类中的注释位置
5. Target(目标对象)
代理的目标对象 例子中:PersonServiceBean就是目标对象
6. Weave(织入)
指将aspects应用到target对象并导致proxy对象创建的过程称为织入.
7. Introduction(引入)
在不修改类代码的前提下, Introduction可以在运行期为类动态地添加一些方法或Field.
总结:
以上两种实现AOP编程是Spring AOP的核心,Spring AOP创建代理对象的时候,会检查目标对象是否实现某个接口,如果实现了某个接品就会用JDK中的Proxy技术,反之则用cglib 中的Proxy技术。
相关文章推荐
- (8) 使用JDK中的Proxy技术实现AOP功能 以及 CGLIB生成代理
- 使用JDK中的Proxy技术实现AOP功能[动态代理]
- 使用JDK中的proxy技术实现AOP功能
- 15_传智播客Spring2.5视频教程_使用JDK中的Proxy技术实现AOP功能
- 使用JDK中的Proxy技术实现AOP功能
- AOP_1.入门及使用JDK中的Proxy技术实现
- Spring(十)通过动态代理(JDK的Proxy)和cglib实现AOP技术
- ITCAST视频-Spring学习笔记(使用JDK中的Proxy技术实现AOP功能)
- 15_传智播客Spring2.5视频教程_使用JDK中的Proxy技术实现AOP功能 2
- 使用JDK中的Proxy技术实现AOP功能
- 使用JDK中的Proxy技术实现AOP功能
- 15_传智播客Spring2.5视频教程_使用JDK中的Proxy技术实现AOP功能 3
- 使用JDK中的Proxy技术实现AOP功能
- (转)使用JDK中的Proxy技术实现AOP功能
- (9) 使用JDK中的Proxy技术实现AOP功能 以及 CGLIB生成代理
- Spring源码阅读-使用ProxyFactoryBean实现AOP
- 利用JDK提供的Proxy类和cglib.jar实现Aop功能
- 使用CGLIB实现AOP功能
- 使用 CGLIB 实现 AOP
- JDK中的Proxy技术实现AOP功能