基础
- cglib代理:适合代理的类没有实现接口,通过继承实现,
Enhancer创建代理类 - jdk代理:适合代理的类实现了接口,通过
Proxy类和InvocationHandler接口实现
jdk动态代理
-
接口
public interface MemberService { public String say(); } -
要代理的对象
public class MemberServiceImpl implements MemberService{ @Override public String say() { return "你好"; } } -
代理实现
public class Main { public static void main(String[] args) { MemberServiceImpl bean = new MemberServiceImpl(); MemberService memberService = (MemberService)Proxy.newProxyInstance(MemberServiceImpl.class.getClassLoader(), MemberServiceImpl.class.getInterfaces(), new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("切面逻辑"); return method.invoke(bean, args); } }); System.out.println(memberService.say()); } }
cglib代理
-
被代理的对象
public class UserService { public void addUser(String username) { System.out.println("添加用户: " + username); } } -
创建方法拦截器
public class UserServiceInterceptor implements MethodInterceptor { /** * @param obj 代理对象(CGLIB 生成的子类实例) * @param method 目标方法(如 addUser) * @param args 方法参数 * @param proxy 方法代理 */ @Override public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable { System.out.println("方法调用前: " + method.getName()); Object result = proxy.invokeSuper(obj, args); // 调用原始方法 System.out.println("方法调用后: " + method.getName()); return result; } } -
通过
Enhancer获取代理对象public class Demo { public static void main(String[] args) { Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(UserService.class); // 设置回调(方法拦截器) enhancer.setCallback(new UserServiceInterceptor()); // 创建代理对象 UserService userService = (UserService) enhancer.create(); // 调用代理方法 userService.addUser("张三"); } }