弄清楚 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代理不需要 实现接口