AOP_2.使用cglib中的Proxy技术实现

在上篇的基础上创建CglibProxyFactory

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技术。 

你可能感兴趣的:(AOP_2.使用cglib中的Proxy技术实现)