原理
- 不管是静态代理还是jdk动态代理,代理的条件之一就是要求目标类和代理类实现同一业务接口;所以,对于无接口类的代理,我们就不能再用之前的代理方式;
- CGLIB动态代理的生成原理是生成目标类的子类,而子类是增强过的,即子类就是目标类的代理类。所以,使用CGLIB动态代理,要求目标类必须能够被继承,即不能是final的类
实现
- 导入CDLIB的jar包:cglib-full.jar
- 定义目标类,不用实现任何接口
public class AccountService {
public void transfer(){
System.out.println("转账!");
}
}
- 创建代理类的工厂,该类需实现MethodInterceptor接口
- 声明目标类的成员变量,并创建接受该参数的构造器
- 定义代理生成方法,用于创建代理对象,即目标类的子类
- 定义回调接口方法,在这里对目标类进行增强
public class AccountServiceCglibProxyFactory implements MethodInterceptor {
private AccountService targer;
public AccountServiceCglibProxyFactory(AccountService targer) {
this.targer = targer;
}
public AccountServiceCglibProxyFactory() {
}
public AccountService createProxy(){
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(AccountService.class);
enhancer.setCallback(this);
return (AccountService) enhancer.create();
}
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
if("transfer".equals(method.getName())){
Object result = method.invoke(targer, objects);
return result;
}
return method.invoke(targer, objects);
}
}
- 定义客户类
public class Client {
public static void main(String[] args) {
AccountService target = new AccountService();
AccountService proxy = new AccountServiceCglibProxyFactory(target).createProxy();
proxy.transfer();
}
}