原理
- 不管是静态代理还是jdk动态代理,代理的条件之一就是要求目标类和代理类实现同一业务接口;所以,对于无接口类的代理,我们就不能再用之前的代理方式;
- CGLIB动态代理的生成原理是 生成目标类的子类,而子类是增强过的,即子类就是目标类的代理类 。所以,使用CGLIB动态代理,要求目标类必须能够被继承,即不能是final的类
实现
导入CDLIB的jar包:cglib-full.jar
定义目标类,不用实现任何接口
1
2
3
4
5
6
7
8
9
10
11public class AccountService {
//目标方法
public void transfer(){
System.out.println("转账!");
}
}
创建代理类的工厂,该类需实现MethodInterceptor接口
- 声明目标类的成员变量,并创建接受该参数的构造器
- 定义代理生成方法,用于创建代理对象,即目标类的子类
- 定义回调接口方法,在这里对目标类进行增强
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40public class AccountServiceCglibProxyFactory implements MethodInterceptor {
//1. 声明目标类的成员变量,并创建接受该参数的构造器
private AccountService targer;
public AccountServiceCglibProxyFactory(AccountService targer) {
this.targer = targer;
}
public AccountServiceCglibProxyFactory() {
}
//2. 定义代理生成方法,用于创建代理对象,即目标类的子类
public AccountService createProxy(){
//创建增强器
Enhancer enhancer = new Enhancer();
//初始化增强器,将目标类指定为父类
enhancer.setSuperclass(AccountService.class);
//初始化增强器,设置回调方法,因为MethodInterceptor接口继承自Callback,因此可以使用this
enhancer.setCallback(this);
//使用增强器创建代理对象
return (AccountService) enhancer.create();
}
//3. 定义回调接口方法,在这里对目标类进行增强;
//本类中调用了Enhance类的setCallback(this)方法,并将回调对象this作为实参传递给了Enhancer类;
//Enhancer类在后续的执行过程中,会调用本类的intercept方法;
//这个intercept()方法就是回调方法
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
//若为transfer方法,则进行增强
if("transfer".equals(method.getName())){
//直接调用目标对象的业务方法执行
Object result = method.invoke(targer, objects);
return result;
}
return method.invoke(targer, objects);
}
}定义客户类
1
2
3
4
5
6
7
8
9
10public class Client {
public static void main(String[] args) {
//创建目标对象
AccountService target = new AccountService();
//创建代理对象
AccountService proxy = new AccountServiceCglibProxyFactory(target).createProxy();
//执行增强后的业务方法
proxy.transfer();
}
}