代理模式与AOP实现引言代理模式是AOP面向切面编程的基础Spring AOP通过JDK动态代理和CGLIB两种方式实现代理。理解代理模式的原理对于深入掌握Spring的声明式事务、安全控制、缓存等功能至关重要。本文将详细介绍代理模式的实现原理以及Spring AOP的内部机制。一、静态代理1.1 代理接口public interface UserService { User createUser(User user); User getUser(Long id); void deleteUser(Long id); } // 目标对象 public class UserServiceImpl implements UserService { Override public User createUser(User user) { System.out.println(Creating user: user.getUsername()); return userRepository.save(user); } Override public User getUser(Long id) { return userRepository.findById(id); } Override public void deleteUser(Long id) { userRepository.deleteById(id); } } // 代理对象 public class UserServiceProxy implements UserService { private final UserService target; private final Logger logger LoggerFactory.getLogger(getClass()); public UserServiceProxy(UserService target) { this.target target; } Override public User createUser(User user) { logger.info(Before createUser); long start System.currentTimeMillis(); try { User result target.createUser(user); logger.info(After createUser, took {}ms, System.currentTimeMillis() - start); return result; } catch (Exception e) { logger.error(Error in createUser, e); throw e; } } Override public User getUser(Long id) { return target.getUser(id); } Override public void deleteUser(Long id) { target.deleteUser(id); } }二、JDK动态代理2.1 InvocationHandlerpublic class JdkProxyHandler implements InvocationHandler { private final Object target; private final ListMethodInterceptor interceptors; public JdkProxyHandler(Object target, ListMethodInterceptor interceptors) { this.target target; this.interceptors interceptors; } Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { MethodInvocation invocation new MethodInvocation( target, method, args); // 执行拦截器链 return new InterceptorChain(interceptors, invocation).proceed(); } } public class InterceptorChain { private final ListMethodInterceptor interceptors; private final MethodInvocation invocation; private int currentIndex 0; public InterceptorChain(ListMethodInterceptor interceptors, MethodInvocation invocation) { this.interceptors interceptors; this.invocation invocation; } public Object proceed() throws Throwable { if (currentIndex interceptors.size()) { return invocation.proceed(); } MethodInterceptor interceptor interceptors.get(currentIndex); return interceptor.invoke(this); } }2.2 代理工厂public class JdkProxyFactory { SuppressWarnings(unchecked) public static T T createProxy(T target, ClassT interfaceType, ListMethodInterceptor interceptors) { return (T) Proxy.newProxyInstance( interfaceType.getClassLoader(), new Class[]{interfaceType}, new JdkProxyHandler(target, interceptors) ); } }三、CGLIB动态代理3.1 MethodInterceptorpublic class CglibProxyInterceptor implements MethodInterceptor { private final Object target; private final ListMethodInterceptor interceptors; public CglibProxyInterceptor(Object target, ListMethodInterceptor interceptors) { this.target target; this.interceptors interceptors; } Override public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable { MethodInvocation invocation new CglibMethodInvocation( target, method, args, proxy); return new InterceptorChain(interceptors, invocation).proceed(); } } public class CglibMethodInvocation extends MethodInvocation { private final Object target; private final Method method; private final Object[] args; private final MethodProxy methodProxy; public CglibMethodInvocation(Object target, Method method, Object[] args, MethodProxy methodProxy) { this.target target; this.method method; this.args args; this.methodProxy methodProxy; } Override public Object proceed() throws Throwable { return methodProxy.invokeSuper(target, args); } }3.2 Enhancer配置public class CglibProxyFactory { SuppressWarnings(unchecked) public static T T createProxy(T target, Class? superclass, ListMethodInterceptor interceptors) { Enhancer enhancer new Enhancer(); enhancer.setSuperclass(superclass); enhancer.setCallback(new CglibProxyInterceptor(target, interceptors)); return (T) enhancer.create(); } }四、Spring AOP实现4.1 Advisor链public class ProxyFactory { private Object target; private ListAdvisor advisors new ArrayList(); public void addAdvisor(Advisor advisor) { advisors.add(advisor); } public Object getProxy() { // 选择代理方式 if (needsProxy()) { if (isInterface()) { return createJdkProxy(); } else { return createCglibProxy(); } } return target; } private Object createJdkProxy() { return JdkProxyFactory.createProxy( target, target.getClass().getInterfaces(), convertAdvisors(advisors)); } private Object createCglibProxy() { return CglibProxyFactory.createProxy( target, target.getClass(), convertAdvisors(advisors)); } }4.2 Pointcut匹配public class AspectJExpressionPointcut implements Pointcut { private final String expression; public AspectJExpressionPointcut(String expression) { this.expression expression; } Override public ClassFilter getClassFilter() { return clazz - matches(clazz); } Override public MethodMatcher getMethodMatcher() { return new MethodMatcher() { Override public boolean matches(Method method, Class? targetClass) { return AspectJExpressionPointcut.this.matches( targetClass, method); } Override public boolean isRuntime() { return false; } Override public boolean matches(Method method, Class? targetClass, Object... args) { return false; } }; } }五、通知类型实现5.1 前置通知public class MethodBeforeAdviceInterceptor implements MethodInterceptor { private final AspectJMethodBeforeAdvice advice; Override public Object invoke(MethodInvocation invocation) throws Throwable { advice.before(invocation.getMethod(), invocation.getArguments(), invocation.getThis()); return invocation.proceed(); } } public class LoggingBeforeAdvice extends AspectJMethodBeforeAdvice { public LoggingBeforeAdvice(Method aspectMethod, Object aspectInstance) { super(aspectMethod, aspectInstance); } Override public void before(Method method, Object[] args, Object target) throws Throwable { System.out.println(Before: method.getName()); } }5.2 后置通知public class AspectJAfterReturningAdvice implements MethodInterceptor { private final Method aspectMethod; private final Object aspectInstance; private String returningName; Override public Object invoke(MethodInvocation invocation) throws Throwable { Object result invocation.proceed(); aspectMethod.invoke(aspectInstance, result); return result; } }六、Spring中的代理创建6.1 ProxyFactoryBeanpublic class ProxyFactoryBean implements FactoryBeanObject { private Object target; private ListAdvisor advisors new ArrayList(); Override public Object getObject() { ProxyFactory factory new ProxyFactory(target); factory.addAdvisors(advisors); return factory.getProxy(); } Override public Class? getObjectType() { return target.getClass(); } }6.2 自动代理创建器public class BeanNameAutoProxyCreator extends ProxyCreatorSupport { private String[] beanNames; public void setBeanNames(String[] beanNames) { this.beanNames beanNames; } Override protected Object createProxy(Class? beanClass, String beanName) { ProxyFactory factory new ProxyFactory(beanClass); factory.setProxyTargetClass(true); factory.addAdvisors(advisors); return factory.getProxy(); } }七、最佳实践7.1 避免代理失效// 错误直接调用同类方法绕过代理 Service public class BadService { Transactional public void methodA() { // 不会触发代理 methodB(); } Transactional public void methodB() { // 业务逻辑 } } // 正确注入自身代理 Service public class GoodService { Autowired private GoodService self; Transactional public void methodA() { // 触发代理 self.methodB(); } Transactional public void methodB() { // 业务逻辑 } }7.2 代理方式选择Configuration public class AopConfig { Bean public DefaultPointcutAdvisor loggingAdvisor() { AspectJExpressionPointcut pointcut new AspectJExpressionPointcut(); pointcut.setExpression( execution(* com.example.service.*.*(..))); return new DefaultPointcutAdvisor( pointcut, new LoggingMethodInterceptor()); } }总结代理模式是Spring AOP的基础Spring同时支持JDK动态代理和CGLIB两种方式。JDK代理基于接口适用于实现了接口的类CGLIB基于继承适用于所有类。理解代理的创建过程和拦截机制有助于更好地使用Spring AOP和排查相关问题。
代理模式与AOP实现
发布时间:2026/5/20 7:30:16
代理模式与AOP实现引言代理模式是AOP面向切面编程的基础Spring AOP通过JDK动态代理和CGLIB两种方式实现代理。理解代理模式的原理对于深入掌握Spring的声明式事务、安全控制、缓存等功能至关重要。本文将详细介绍代理模式的实现原理以及Spring AOP的内部机制。一、静态代理1.1 代理接口public interface UserService { User createUser(User user); User getUser(Long id); void deleteUser(Long id); } // 目标对象 public class UserServiceImpl implements UserService { Override public User createUser(User user) { System.out.println(Creating user: user.getUsername()); return userRepository.save(user); } Override public User getUser(Long id) { return userRepository.findById(id); } Override public void deleteUser(Long id) { userRepository.deleteById(id); } } // 代理对象 public class UserServiceProxy implements UserService { private final UserService target; private final Logger logger LoggerFactory.getLogger(getClass()); public UserServiceProxy(UserService target) { this.target target; } Override public User createUser(User user) { logger.info(Before createUser); long start System.currentTimeMillis(); try { User result target.createUser(user); logger.info(After createUser, took {}ms, System.currentTimeMillis() - start); return result; } catch (Exception e) { logger.error(Error in createUser, e); throw e; } } Override public User getUser(Long id) { return target.getUser(id); } Override public void deleteUser(Long id) { target.deleteUser(id); } }二、JDK动态代理2.1 InvocationHandlerpublic class JdkProxyHandler implements InvocationHandler { private final Object target; private final ListMethodInterceptor interceptors; public JdkProxyHandler(Object target, ListMethodInterceptor interceptors) { this.target target; this.interceptors interceptors; } Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { MethodInvocation invocation new MethodInvocation( target, method, args); // 执行拦截器链 return new InterceptorChain(interceptors, invocation).proceed(); } } public class InterceptorChain { private final ListMethodInterceptor interceptors; private final MethodInvocation invocation; private int currentIndex 0; public InterceptorChain(ListMethodInterceptor interceptors, MethodInvocation invocation) { this.interceptors interceptors; this.invocation invocation; } public Object proceed() throws Throwable { if (currentIndex interceptors.size()) { return invocation.proceed(); } MethodInterceptor interceptor interceptors.get(currentIndex); return interceptor.invoke(this); } }2.2 代理工厂public class JdkProxyFactory { SuppressWarnings(unchecked) public static T T createProxy(T target, ClassT interfaceType, ListMethodInterceptor interceptors) { return (T) Proxy.newProxyInstance( interfaceType.getClassLoader(), new Class[]{interfaceType}, new JdkProxyHandler(target, interceptors) ); } }三、CGLIB动态代理3.1 MethodInterceptorpublic class CglibProxyInterceptor implements MethodInterceptor { private final Object target; private final ListMethodInterceptor interceptors; public CglibProxyInterceptor(Object target, ListMethodInterceptor interceptors) { this.target target; this.interceptors interceptors; } Override public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable { MethodInvocation invocation new CglibMethodInvocation( target, method, args, proxy); return new InterceptorChain(interceptors, invocation).proceed(); } } public class CglibMethodInvocation extends MethodInvocation { private final Object target; private final Method method; private final Object[] args; private final MethodProxy methodProxy; public CglibMethodInvocation(Object target, Method method, Object[] args, MethodProxy methodProxy) { this.target target; this.method method; this.args args; this.methodProxy methodProxy; } Override public Object proceed() throws Throwable { return methodProxy.invokeSuper(target, args); } }3.2 Enhancer配置public class CglibProxyFactory { SuppressWarnings(unchecked) public static T T createProxy(T target, Class? superclass, ListMethodInterceptor interceptors) { Enhancer enhancer new Enhancer(); enhancer.setSuperclass(superclass); enhancer.setCallback(new CglibProxyInterceptor(target, interceptors)); return (T) enhancer.create(); } }四、Spring AOP实现4.1 Advisor链public class ProxyFactory { private Object target; private ListAdvisor advisors new ArrayList(); public void addAdvisor(Advisor advisor) { advisors.add(advisor); } public Object getProxy() { // 选择代理方式 if (needsProxy()) { if (isInterface()) { return createJdkProxy(); } else { return createCglibProxy(); } } return target; } private Object createJdkProxy() { return JdkProxyFactory.createProxy( target, target.getClass().getInterfaces(), convertAdvisors(advisors)); } private Object createCglibProxy() { return CglibProxyFactory.createProxy( target, target.getClass(), convertAdvisors(advisors)); } }4.2 Pointcut匹配public class AspectJExpressionPointcut implements Pointcut { private final String expression; public AspectJExpressionPointcut(String expression) { this.expression expression; } Override public ClassFilter getClassFilter() { return clazz - matches(clazz); } Override public MethodMatcher getMethodMatcher() { return new MethodMatcher() { Override public boolean matches(Method method, Class? targetClass) { return AspectJExpressionPointcut.this.matches( targetClass, method); } Override public boolean isRuntime() { return false; } Override public boolean matches(Method method, Class? targetClass, Object... args) { return false; } }; } }五、通知类型实现5.1 前置通知public class MethodBeforeAdviceInterceptor implements MethodInterceptor { private final AspectJMethodBeforeAdvice advice; Override public Object invoke(MethodInvocation invocation) throws Throwable { advice.before(invocation.getMethod(), invocation.getArguments(), invocation.getThis()); return invocation.proceed(); } } public class LoggingBeforeAdvice extends AspectJMethodBeforeAdvice { public LoggingBeforeAdvice(Method aspectMethod, Object aspectInstance) { super(aspectMethod, aspectInstance); } Override public void before(Method method, Object[] args, Object target) throws Throwable { System.out.println(Before: method.getName()); } }5.2 后置通知public class AspectJAfterReturningAdvice implements MethodInterceptor { private final Method aspectMethod; private final Object aspectInstance; private String returningName; Override public Object invoke(MethodInvocation invocation) throws Throwable { Object result invocation.proceed(); aspectMethod.invoke(aspectInstance, result); return result; } }六、Spring中的代理创建6.1 ProxyFactoryBeanpublic class ProxyFactoryBean implements FactoryBeanObject { private Object target; private ListAdvisor advisors new ArrayList(); Override public Object getObject() { ProxyFactory factory new ProxyFactory(target); factory.addAdvisors(advisors); return factory.getProxy(); } Override public Class? getObjectType() { return target.getClass(); } }6.2 自动代理创建器public class BeanNameAutoProxyCreator extends ProxyCreatorSupport { private String[] beanNames; public void setBeanNames(String[] beanNames) { this.beanNames beanNames; } Override protected Object createProxy(Class? beanClass, String beanName) { ProxyFactory factory new ProxyFactory(beanClass); factory.setProxyTargetClass(true); factory.addAdvisors(advisors); return factory.getProxy(); } }七、最佳实践7.1 避免代理失效// 错误直接调用同类方法绕过代理 Service public class BadService { Transactional public void methodA() { // 不会触发代理 methodB(); } Transactional public void methodB() { // 业务逻辑 } } // 正确注入自身代理 Service public class GoodService { Autowired private GoodService self; Transactional public void methodA() { // 触发代理 self.methodB(); } Transactional public void methodB() { // 业务逻辑 } }7.2 代理方式选择Configuration public class AopConfig { Bean public DefaultPointcutAdvisor loggingAdvisor() { AspectJExpressionPointcut pointcut new AspectJExpressionPointcut(); pointcut.setExpression( execution(* com.example.service.*.*(..))); return new DefaultPointcutAdvisor( pointcut, new LoggingMethodInterceptor()); } }总结代理模式是Spring AOP的基础Spring同时支持JDK动态代理和CGLIB两种方式。JDK代理基于接口适用于实现了接口的类CGLIB基于继承适用于所有类。理解代理的创建过程和拦截机制有助于更好地使用Spring AOP和排查相关问题。