在創(chuàng)建Bean的最后,會調(diào)用BeanPostProcessor方法胸囱;AOP本質(zhì)上就是一個BeanPostProcessor半开。那么在創(chuàng)建Bean的最后混滔,通過BeanPostProcessor方法生成代理類Bean,從而實(shí)現(xiàn)AOP功能征冷。
1. AOP原理:applyBeanPostProcessorsAfterInitialization
在使用AOP時(shí)择膝,要手動enable EnableAspectJAutoProxy, 由此也就引入了AnnotationAwareAspectJAutoProxyCreator 這個BeanPostProcessor, 于是在applyBeanPostProcessorsAfterInitialization 的函數(shù)中检激,會為bean創(chuàng)建AOP代理對象肴捉。
AnnotationAwareAspectJAutoProxyCreator
2. AOP對象生成(AbstractAutoProxyCreator)
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
if (bean != null) {
Object cacheKey = getCacheKey(bean.getClass(), beanName);
if (!this.earlyProxyReferences.contains(cacheKey)) {
return wrapIfNecessary(bean, beanName, cacheKey);
}
}
return bean;
}
4. 生成代理類 wrapIfNecessary
protected Object wrapIfNecessary(){
Object[] specificInterceptors = getAdvicesAndAdvisorsForBean(bean.getClass(), beanName, null);
if (specificInterceptors != DO_NOT_PROXY) {
this.advisedBeans.put(cacheKey, Boolean.TRUE);
//根據(jù)advice,生成代理bean
Object proxy = createProxy(
bean.getClass(), beanName, specificInterceptors, new SingletonTargetSource(bean));
this.proxyTypes.put(cacheKey, proxy.getClass());
return proxy;
}
//不能生成代理類叔收,返回初始bean
this.advisedBeans.put(cacheKey, Boolean.FALSE);
return bean;
}
5. createProxy: Spring使用CGLib的方式生成代理類
protected Object createProxy(){
// 待補(bǔ)充
}