如果 PersonServiceImpl 类没有实现接口,那么我们该如何创建代理对象?
往工程中导入 com.springsource.net.sf.cglib-2.2.0.jar 包,通过该jar
包来创建代理对象。
1、创建 CGLibProxyFactory 类,代码如下:
package com.learn.aop;
import java.lang.reflect.Method;
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();
}
public Object intercept(Object proxy, Method method, Object[] args,
MethodProxy methodProxy) throws Throwable {
return methodProxy.invoke(this.targetObject, args);
}
}
2、ProxyTest 类中添加方法:
@Test
public void testCGLib() {
// 业务代理类
CGLibProxyFactory factory = new CGLibProxyFactory();
// 元对象(被代理对象)
PersonServiceImpl service = (PersonServiceImpl)factory.createProxyInstance(new PersonServiceImpl("hwl"));
service.save("hwl");
}
3、测试
4、AOP相关概念
Aspect(切面):指横切性关注点的抽象即为切面,它与类相似,只是两者的关注点不一样,类是对物体特征的抽象,而切面横切性关注点的抽象.
joinpoint(连接点):所谓连接点是指那些被拦截到的点。在spring中,这些点指的是方法,因为spring只支持方法类型的连接点,实际上joinpoint还可以是field或类构造器)
Pointcut(切入点):所谓切入点是指我们要对那些joinpoint进行拦截的定义.
Advice(通知):所谓通知是指拦截到joinpoint之后所要做的事情就是通知.通知分为前置通知,后置通知,异常通知,最终通知,环绕通知
Target(目标对象):代理的目标对象
Weave(织入):指将aspects应用到target对象并导致proxy对象创建的过程称为织入.
Introduction(引入):在不修改类代码的前提下, Introduction可以在运行期为类动态地添加一些方法或Field.
Spring学习十四:使用CGLIB实现AOP功能与AOP概念解释,布布扣,bubuko.com
Spring学习十四:使用CGLIB实现AOP功能与AOP概念解释