JDK 代理

proxy:代理对象
method:代理对象执行的方法
args:方法的参数

  1. public class JdkProxyTest {
  2. public static void main(String[] args) {
  3. UserServiceInterface proxyInstance = (UserServiceInterface) Proxy.newProxyInstance(JdkProxyTest.class.getClassLoader(), UserService.class.getInterfaces(), new InvocationHandler() {
  4. @Override
  5. public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
  6. System.out.println("代理前的逻辑...");
  7. Object result = method.invoke(new UserService(), args);
  8. System.out.println("代理后的逻辑...");
  9. return result;
  10. }
  11. });
  12. proxyInstance.test();
  13. }
  14. }

Spring 代理

Advise:代理逻辑(通知)
PointCut:切点(针对什么样的方法)
Advistor:Advise + PointCut

  1. public class SpringProxyTest {
  2. public static void main(String[] args) {
  3. ProxyFactory proxyFactory = new ProxyFactory();
  4. // proxyFactory.setOptimize(true); // CGLIB 动态代理
  5. // proxyFactory.setProxyTargetClass(true); // CGLIB 动态代理
  6. // 目标对象
  7. proxyFactory.setTarget(new UserService()); // CGLIB 动态代理
  8. // proxyFactory.addInterface(UserServiceInterface.class); // 如果设置了接口,就会使用 JDK 动态代理
  9. // 代理逻辑
  10. proxyFactory.addAdvice(new MethodBeforeAdvice() {
  11. @Override
  12. public void before(Method method, Object[] args, Object target) throws Throwable {
  13. System.out.println(method.getName() + " 方法执行前的逻辑...");
  14. }
  15. });
  16. // 代理逻辑
  17. proxyFactory.addAdvice(new AfterReturningAdvice() {
  18. @Override
  19. public void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable {
  20. System.out.println(method.getName() + " 方法返回后的逻辑...");
  21. }
  22. });
  23. // 生成代理对象
  24. // UserServiceInterface proxy = (UserServiceInterface) proxyFactory.getProxy();
  25. UserService proxy = (UserService) proxyFactory.getProxy();
  26. proxy.test();
  27. }
  28. }

总结

如果 Spring 中的一个 bean

  • 如果没有实现任何接口,默认使用 CGLIB,否则使用 JDK 动态代理
  • 如果设置了 proxyTargetClass 为 true,则强制使用 CGLIB