JDK的动态代理机制只能代理实现了接口的类,而不能实现接口的类就不能实现JDK的动态代理,cglib是针对类来实现代理的,他的原理是对指定的目标类生成一个子类,并覆盖其中方法实现增强,但因为采用的是继承,所以不能对final修饰的类进行代理。
public interface BookFacade {
public void addBook();
}
这个是没有实现接口的实现类
public class BookFacadeImpl1 {
public void addBook() {
System.out.println("增加图书的普通方法...");
}
}
使用cglib动态代理
public class BookFacadeCglib implements MethodInterceptor {
private Object target; //被代理对象
创建代理对象
public Object getInstance(Object target) {
this.target = target;
Enhancer enhancer = new Enhancer(); //增强类
enhancer.setSuperclass(this.target.getClass()); //作为传参目标类子类
// 回调方法
enhancer.setCallback(this);
// 创建代理对象
return enhancer.create();
@Override
// 回调方法
public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
System.out.println("事物开始");
proxy.invokeSuper(obj, args);
System.out.println("事物结束");
return null;
}
}
测试类
public static void main(String[] args) {
BookFacadeCglib cglib=new BookFacadeCglib();
BookFacadeImpl1 bookCglib=(BookFacadeImpl1)cglib.getInstance(new BookFacadeImpl1());
bookCglib.addBook();
}
}
cglib动态代理也可以代理实现了接口的类
假设有员工的实现类和接口
public class CglibProxy implements MethodInterceptor{
//被代理对象
@SuppressWarnings("unused")
private Object targetObject;
public Object CreateProxy(Object targetObject){
this.targetObject = targetObject;
Enhancer enhancer = new Enhancer();//增强类
enhancer.setSuperclass(targetObject.getClass());//作为传参目标类子类
enhancer.setCallback(this);//回调设置为this 当前类
return enhancer.create();
}
@Override
public Object intercept(Object arg0, Method arg1, Object[] arg2,
MethodProxy arg3) throws Throwable {
System.out.println("前置条件及其任务");
arg1.invoke(targetObject, arg2);
System.out.println("后置条件及其任务");
return null;
}
public static void main(String[] args) {
EmployeeInterface emp = new Employee();
CglibProxy cgProxy = new CglibProxy();
EmployeeInterface proxy = (EmployeeInterface) cgProxy.CreateProxy(emp);
proxy.eat();
}