唐僧喜欢小龙女

导航

弄清楚 cglib代理

1、先上图 

 

 

 总结: 被代理类 没有实现接口,生成一个 被代理类 的子类(代理类)出来,子类(代理类)调用 方法 就转换成 被代理类 方法的调用

2、pom.xml 加入cglib的依赖

 

<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>3.2.4</version>
</dependency>

3、被代理类 (不能用 final 修饰)
public class Teacher{

public void teach() {
System.out.println("老师正在授课 我是cglib代理不需要 实现接口");
}
}

4、代理类 工厂 

public class ProxyFactory implements MethodInterceptor{
//维护一个 被代理类 对象 用 Object 就可了因为不知道 被代理类是那样的。 通过 构造器 初始化 属性
private Object target;

// 利用构造器对 代理对象 进行初始化
public ProxyFactory(Object target) {
this.target = target;
}
//这里获取 target的 代理对象
public Object getProxyInstance(){
//1 创建一个工具类
Enhancer enhancer = new Enhancer();
//2 设置父类
enhancer.setSuperclass(target.getClass());
//3 设置回调函数
enhancer.setCallback(this);
//4 创建子类对象 即代理类
return enhancer.create();
}

//这个方法里实现对目标对象的使用
public Object intercept(Object o, Method method, Object[] orgs, MethodProxy methodProxy) throws Throwable {
//这里可以对 被代理类的方法进行一些逻辑的添加
System.out.println("cglib 代理开始 ···");
Object returnVal = method.invoke(target,orgs);
return returnVal;
}
}


5、客户端调用

public class Client {
public static void main(String[] args) {
Teacher teacher = new Teacher();
ProxyFactory factory = new ProxyFactory(teacher);
Teacher proxyInstance = (Teacher)factory.getProxyInstance(); //强转+多态
System.err.println(proxyInstance.getClass());
proxyInstance.teach();

}


6、结果

     cglib 代理开始 ···
     class com.proxy.cglibProxy.Teacher$$EnhancerByCGLIB$$9e3c88de
     老师正在授课 我是cglib代理不需要 实现接口

 
 
 



 

posted on 2019-11-27 14:57  与时具进&不忘初心  阅读(129)  评论(0编辑  收藏  举报