在:http://www.reibang.com/p/366c3aad046f
分析了整個IOC生成bean實例的流程宏怔,實際上拧烦,spring aop也是在IOC的基礎(chǔ)上去實現(xiàn)的。
在doCreateBean()方法的后半部分挠唆,也就是initializeBean方法中贿条,會通過BeanPostProcessor對Bean做加強:
protected Object initializeBean(final String beanName, final Object bean, @Nullable RootBeanDefinition mbd) {
if (System.getSecurityManager() != null) {
AccessController.doPrivileged((PrivilegedAction<Object>) () -> {
invokeAwareMethods(beanName, bean);
return null;
}, getAccessControlContext());
}
else {
// 調(diào)用aware方法 如 ApplicationConetxtAward之類的
invokeAwareMethods(beanName, bean);
}
Object wrappedBean = bean;
if (mbd == null || !mbd.isSynthetic()) {
// BeanPostProcessor前置處理
wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
}
try {
// 調(diào)用afterPropertySet等方法
invokeInitMethods(beanName, wrappedBean, mbd);
}
catch (Throwable ex) {
throw new BeanCreationException(
(mbd != null ? mbd.getResourceDescription() : null),
beanName, "Invocation of init method failed", ex);
}
if (mbd == null || !mbd.isSynthetic()) {
// BeanPostProcessor后置處理
wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
}
return wrappedBean;
}
@Override
public Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName)
throws BeansException {
Object result = existingBean;
for (BeanPostProcessor processor : getBeanPostProcessors()) {
// 這里會通過postProcessAfterInitialization 方法對bean做一定的處理
Object current = processor.postProcessAfterInitialization(result, beanName);
if (current == null) {
return result;
}
result = current;
}
return result;
}
這里會通過BeanPostProcessor雹仿,對bean做進一步的增強,而AOP的核心整以,就是一個BeanPostProcessor:
AbstractAutoProxyCreator 之 getEarlyBeanReference
在IOC中胧辽,為了解決單例模式下循環(huán)依賴的問題,spring會將實例化的bean提前暴露出來:
protected Object getEarlyBeanReference(String beanName, RootBeanDefinition mbd, Object bean) {
Object exposedObject = bean;
if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
for (BeanPostProcessor bp : getBeanPostProcessors()) {
if (bp instanceof SmartInstantiationAwareBeanPostProcessor) {
SmartInstantiationAwareBeanPostProcessor ibp = (SmartInstantiationAwareBeanPostProcessor) bp;
exposedObject = ibp.getEarlyBeanReference(exposedObject, beanName);
}
}
}
return exposedObject;
}
簡單來說就是通過SmartInstantiationAwareBeanPostProcessor.getEarlyBeanReference方法獲取增強后的bean公黑,而AbstractAutoProxyCreator同樣是SmartInstantiationAwareBeanPostProcessor的實現(xiàn)類邑商,其中實現(xiàn)了getEarlyBeanReference方法:
@Override
public Object getEarlyBeanReference(Object bean, String beanName) {
Object cacheKey = getCacheKey(bean.getClass(), beanName);
this.earlyProxyReferences.put(cacheKey, bean);
return wrapIfNecessary(bean, beanName, cacheKey);
}
這里面會將bean放入緩存中,然后通過wrapIfNecessary對bean進行AOP包裝凡蚜,并將包裝后的bean返回出去奠骄,wrapIfNecessary的邏輯我們后邊再說。
AbstractAutoProxyCreator 之 postProcessAfterInitialization
getEarlyBeanReference是為了解決提前暴露的問題番刊,而postProcessAfterInitialization則是AOP正常流程的入口:
@Override
public Object postProcessAfterInitialization(@Nullable Object bean, String beanName) {
if (bean != null) {
Object cacheKey = getCacheKey(bean.getClass(), beanName);
// 如果earlyProxyReferences中沒有bean 則 wrapIfNecessary
if (this.earlyProxyReferences.remove(cacheKey) != bean) {
return wrapIfNecessary(bean, beanName, cacheKey);
}
}
return bean;
}
可以看到,如果earlyProxyReferences中不含有改bean影锈, 則remove一定會返null 從而執(zhí)行wrapIfNecessary對bean進行包裝芹务。
AOP包裝流程
protected Object wrapIfNecessary(Object bean, String beanName, Object cacheKey) {
// 關(guān)于targetSourcedBeans 先不去管它 有興趣可以自己查下
if (StringUtils.hasLength(beanName) && this.targetSourcedBeans.contains(beanName)) {
return bean;
}
// 不需要創(chuàng)建 直接返回
if (Boolean.FALSE.equals(this.advisedBeans.get(cacheKey))) {
return bean;
}
// 這里shouldSkip也有加載所有advisor的作用
// 有興趣可以去AspectJAwareAdvisorAutoProxyCreator類看下實現(xiàn)
if (isInfrastructureClass(bean.getClass()) || shouldSkip(bean.getClass(), beanName)) {
this.advisedBeans.put(cacheKey, Boolean.FALSE);
return bean;
}
// 上面做了一些不需要創(chuàng)建代理的情況的判斷
// 返回匹配當前 bean 的所有的 advisor蝉绷、advice、interceptor
Object[] specificInterceptors = getAdvicesAndAdvisorsForBean(bean.getClass(), beanName, null);
if (specificInterceptors != DO_NOT_PROXY) {
this.advisedBeans.put(cacheKey, Boolean.TRUE);
// 創(chuàng)建代理
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 方法創(chuàng)建代理對象:
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);
}
// 創(chuàng)建ProxyFactory 實例
ProxyFactory proxyFactory = new ProxyFactory();
proxyFactory.copyFrom(this);
if (!proxyFactory.isProxyTargetClass()) {
if (shouldProxyTargetClass(beanClass, beanName)) {
proxyFactory.setProxyTargetClass(true);
}
else {
evaluateProxyInterfaces(beanClass, proxyFactory);
}
}
// 返回匹配了當前bean的Advisor
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());
}
這里主要就是創(chuàng)建ProxyFactory并且通過proxyFactory.getProxy生成代理對象枣抱;
public Object getProxy(@Nullable ClassLoader classLoader) {
return createAopProxy().getProxy(classLoader);
}
protected final synchronized AopProxy createAopProxy() {
if (!this.active) {
activate();
}
return getAopProxyFactory().createAopProxy(this);
}
@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.");
}
// 如果要代理的類本身就是接口熔吗,則使用 JDK 動態(tài)代理
if (targetClass.isInterface() || Proxy.isProxyClass(targetClass)) {
return new JdkDynamicAopProxy(config);
}
return new ObjenesisCglibAopProxy(config);
}
else {
// 如果有接口,會跑到這個分支
return new JdkDynamicAopProxy(config);
}
}
大體上就是 實現(xiàn)了接口佳晶,則使用JDK動態(tài)代理桅狠,否則使用cglib動態(tài)代理。
后面兩個具體實現(xiàn)代理就不去細說了轿秧,有興趣的可以了解下jdk動態(tài)代理跟cglib是如何實現(xiàn)的中跌。