spring aop 源码分析
前置知识
spring ioc
容器
spring bean
的生命周期
spring
中常见类的作用
spring aop
的基本使用
cglib
动态代理知识
jdk
动态代理知识
源码分析
一切皆是 BeanPostProcessor
了解过spring框架的同学都知道, spring中很多功能都是通过实现BeanPostProcessor
接口,
在创建bean之后的初始化方法中, 有applyBeanPostProcessorsAfterInitialization
方法
1 2 3 4 5 6 7 8 9 10 11 12
| protected Object initializeBean(String beanName, Object bean, @Nullable RootBeanDefinition mbd) {
if (mbd == null || !mbd.isSynthetic()) { wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName); }
return wrappedBean; }
|
而AbstractAutoProxyCreator
实现了BeanPostProcessor
接口
AbstractAutoProxyCreator
在初始化bean完成之后, AbstractAutoProxyCreator
的postProcessAfterInitialization
方法就会判断是否需要对当前的bean进行封装代理
1 2 3 4 5 6 7 8 9 10 11
| @Override public Object postProcessAfterInitialization(@Nullable Object bean, String beanName) { if (bean != null) { Object cacheKey = getCacheKey(bean.getClass(), beanName); if (this.earlyProxyReferences.remove(cacheKey) != bean) { return wrapIfNecessary(bean, beanName, cacheKey); } } return bean; }
|
继续往里看 wrapIfNecessary
方法,这个方法将返回代理类(如果需要代理的话)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| protected Object wrapIfNecessary(Object bean, String beanName, Object cacheKey) { if (StringUtils.hasLength(beanName) && this.targetSourcedBeans.contains(beanName)) { return bean; } if (Boolean.FALSE.equals(this.advisedBeans.get(cacheKey))) { return bean; } if (isInfrastructureClass(bean.getClass()) || shouldSkip(bean.getClass(), beanName)){ this.advisedBeans.put(cacheKey, Boolean.FALSE); return bean; }
Object[] specificInterceptors = getAdvicesAndAdvisorsForBean(bean.getClass(), beanName, null); if (specificInterceptors != DO_NOT_PROXY) { this.advisedBeans.put(cacheKey, Boolean.TRUE); Object proxy = createProxy( bean.getClass(), beanName, specificInterceptors, new SingletonTargetSource(bean)); this.proxyTypes.put(cacheKey, proxy.getClass()); return proxy; }
this.advisedBeans.put(cacheKey, Boolean.FALSE); return bean; }
|
我们查看一下createProxy
, 该方法通过创建一个ProxyFactory
来进行代理对象的创建
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| protected Object createProxy(Class<?> beanClass, @Nullable String beanName, @Nullable Object[] specificInterceptors, TargetSource targetSource) {
if (this.beanFactory instanceof ConfigurableListableBeanFactory) { AutoProxyUtils.exposeTargetClass((ConfigurableListableBeanFactory) this.beanFactory, beanName, beanClass); } ProxyFactory proxyFactory = new ProxyFactory(); proxyFactory.copyFrom(this); if (!proxyFactory.isProxyTargetClass()) { if (shouldProxyTargetClass(beanClass, beanName)) { proxyFactory.setProxyTargetClass(true); } else { evaluateProxyInterfaces(beanClass, proxyFactory); } }
Advisor[] advisors = buildAdvisors(beanName, specificInterceptors); proxyFactory.addAdvisors(advisors); proxyFactory.setTargetSource(targetSource); customizeProxyFactory(proxyFactory);
proxyFactory.setFrozen(this.freezeProxy); if (advisorsPreFiltered()) { proxyFactory.setPreFiltered(true); }
return proxyFactory.getProxy(getProxyClassLoader()); }
|
getProxy方法主要是获取AopProxy
并生成代理对象, 返回的AopProxy
是CglibAopProxy
或者JdkDynamicAopProxy
, 即我们常知道的jdk动态代理和cglib动态代理
1 2 3 4 5
| public Object getProxy(@Nullable ClassLoader classLoader) { return createAopProxy() .getProxy(classLoader); }
|
ProxyCreatorSupport
AbstractAutoProxyCreator
继承自ProxyCreatorSupport
, ProxyCreatorSupport
有一个默认构造方法, 创建了一个默认的 DefaultAopProxyFactory
1 2 3 4 5 6
|
public ProxyCreatorSupport() { this.aopProxyFactory = new DefaultAopProxyFactory(); }
|
在其中的createAopProxy
该方法获取了一个AopProxyFactory
并使用该对象创建并返回一个AopProxy
,
其中的AopProxyFactory
就是构造方法默认创建的DefaultAopProxyFactory
, 使用该对象创建了AopProxy
1 2 3 4 5 6 7 8 9 10 11
| protected final synchronized AopProxy createAopProxy() { if (!this.active) { activate(); } return getAopProxyFactory().createAopProxy(this); }
public AopProxyFactory getAopProxyFactory() { return this.aopProxyFactory; }
|
DefaultAopProxyFactory
DefaultAopProxyFactory
是AopProxyFactory
的一个实现, 主要功能就是创建AopProxy
, 主要决定使用jdk
代理还是cglib
进行代理
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| public class DefaultAopProxyFactory implements AopProxyFactory, Serializable {
@Override public AopProxy createAopProxy(AdvisedSupport config) throws AopConfigException { if (config.isOptimize() || config.isProxyTargetClass() || hasNoUserSuppliedProxyInterfaces(config)) { Class<?> targetClass = config.getTargetClass(); if (targetClass == null) { throw new AopConfigException("TargetSource cannot determine target class: " + "Either an interface or a target is required for proxy creation."); } if (targetClass.isInterface() || Proxy.isProxyClass(targetClass)) { return new JdkDynamicAopProxy(config); } return new ObjenesisCglibAopProxy(config); } else { return new JdkDynamicAopProxy(config); } } }
|
AopProxy
AopProxy
:用来实际生成proxy
对象的接口,通过DefaultAopProxyFactory
类获取
通过下面的类图我们看到AopProxy
有两种实现
1 2 3 4 5 6
| public interface AopProxy { Object getProxy(); Object getProxy(@Nullable ClassLoader classLoader); }
|
package org.aopalliance.aop
spring aop的核心接口
简单使用aop
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| @Bean public ProxyFactoryBean userServiceProxyBean(UserServiceImpl userServiceImpl) throws ClassNotFoundException { ProxyFactoryBean proxyFactoryBean = new ProxyFactoryBean();
proxyFactoryBean.setProxyInterfaces(new Class[]{UserService.class}); proxyFactoryBean.setTarget(userServiceImpl); proxyFactoryBean.setInterceptorNames("oneInterceptor");
return proxyFactoryBean; } @Component @Slf4j public class OneInterceptor implements MethodBeforeAdvice { @Override public void before(Method method, Object[] args, Object target) throws Throwable { log.info("MethodBeforeAdvice before invoke"); } }
UserService userService = (UserService) context.getBean("userServiceProxyBean");
context.getBean("&userServiceProxyBean");
|
1 2 3 4 5 6 7 8 9 10
| @Bean public BeanNameAutoProxyCreator userServiceProxyBeanCreator() { BeanNameAutoProxyCreator creator = new BeanNameAutoProxyCreator(); creator.setBeanNames("userServiceImpl"); creator.setInterceptorNames("oneInterceptor");
return creator; }
UserService userService = context.getBean(UserService.class);
|
总结
- spring aop就是在bean进行初始化之后, 调用实现了
PostProcessor
接口的类中的postProcessAfterInitialization
, 在实现类中依据具体的代码实现代理逻辑
- spring会根据具体情况选择
jdk
代理或者cglib
代理
声明
如有错误请联系作者更正
参考
- Spring AOP各个组件概述与总结