前提:添加maven 依赖:
<!--cglib-->
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>2.2.2</version>
</dependency>
注:如果添加依赖之后,运行时候报错,需要添加cglib相关的依赖,即可。
1,新建MyMethodInterceptor.java
实现MethodInterceptor
接口。
package com.kuxingseng.lbw.cglib;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;
public class MyMethodInterceptor implements MethodInterceptor {
private String methodName;
public MyMethodInterceptor() {
}
public MyMethodInterceptor(String methodName) {
this.methodName = methodName;
}
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
Object object = new Object();
if (method.getName().equals(methodName)) { //可以根据自己条件实现切面
System.out.println(method.getName() + "---前置增强");
object = methodProxy.invokeSuper(o, objects);
System.out.println(method.getName() + "---后置增强");
}
return object;
}
}
2,新建CgConstUtils.java
工具类,方便之后代理不同的实体类,以及方法,通用方法抽出来。
package com.kuxingseng.lbw.cglib;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
public class CgConstUtils {
public static Object getProxyInstance(Class[] classes, MethodInterceptor method) {
Enhancer en = new Enhancer();
en.setSuperclass(classes[0]);
en.setCallback(method);
return en.create();
}
}
3,创建要被代理增强的类UserDao.java
。
package com.kuxingseng.lbw.cglib;
public class UserDao {
int insert() {
System.out.println("新增成功!");
return 0;
}
int delete() {
System.out.println("删除成功!");
return 0;
}
}
4,创建要被代理增强的类UserEnity.java
。
package com.kuxingseng.lbw.cglib;
public class UserEnity {
int update() {
System.out.println("更新成功!");
return 0;
}
}
5,开始验证:
public static void main(String[] args) {
UserDao userDao = (UserDao) CgConstUtils.getProxyInstance(new Class[]{UserDao.class}, new MyMethodInterceptor("delete"));//传入要增强的方法名
userDao.delete();
UserEnity enity = (UserEnity) CgConstUtils.getProxyInstance(new Class[]{UserEnity.class}, new MyMethodInterceptor("update"));
enity.update();
}
结果: