前言
cglib动态代理被代理类为非接口类
创建UserDao实现类
public class StudentDao {
public void save() {
System.out.println("学生保存数据成功");
}
public void find() {
System.out.println("学生获取数据成功");
}
}
自定义方法过滤器MyMethodIntercepter
public class MyMethodIntercepter implements MethodInterceptor {
/**
* target:cglib生成的代理对象
* method:被代理对象方法
* objects:方法入参
* methodProxy: 代理方法
*/
public Object intercept(Object target, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
String methodName = method.getName();
Object result = null;
System.out.println(methodName);
if("find".equals(methodName)) {
result = methodProxy.invokeSuper(target, objects);
} else {
System.out.println("开启事务");
result = methodProxy.invokeSuper(target, objects);
System.out.println("结束事务");
}
return result;
}
}
创建Cglib动态代理工厂CglibProxyFactory
public class CglibProxyFactory {
private Object target = null;
public CglibProxyFactory(Object target) {
this.target = target;
}
public Object getNewInstance() {
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(target.getClass());
enhancer.setCallback(new MyMethodIntercepter());
Object result = enhancer.create();
return result;
}
}
动态代理测试
/**
* CGLIB动态代理实现
*/
public class Action {
public static void main(String[] args) {
System.out.println("CGLIB动态代理");
StudentDao studentDao = new StudentDao();
StudentDao studentDaoProxy = (StudentDao)new MixProxyFactory(studentDao).getNewInstance();
studentDaoProxy.save();
studentDaoProxy.find();
}
}