代理的创建(源码)
创建代理的方法是postProcessAfterInitialization:如果Bean被子类标识为代理,则使用配置的拦截器创建一个代理
源码参考:AOP切面底层原理【底层源码】-postProcessAfterInitialization源码部分
wrapIfNecessary方法主要用于判断是否需要创建代理,如果bean能够获取到advisor才需要创建代理
AbstractAutoProxyCreator
protected Object wrapIfNecessary(Object bean, String beanName, Object cacheKey) {
//如果Bean是通过TargetSource接口获取,则直接返回
if (StringUtils.hasLength(beanName) && this.targetSourcedBeans.contains(beanName)) {
return bean;
//如果Bean不是切面类,则直接返回
} else if (Boolean.FALSE.equals(this.advisedBeans.get(cacheKey))) {
return bean;
//如果是切面类,但是不是AOP的基础类,且不能跳过,则获取所有的advisor
} else if (!this.isInfrastructureClass(bean.getClass()) && !this.shouldSkip(bean.getClass(), beanName)) {
//如果没有获取到,则无需增强,无需代理
Object[] specificInterceptors = this.getAdvicesAndAdvisorsForBean(bean.getClass(), beanName, (TargetSource)null);
if (specificInterceptors != DO_NOT_PROXY) {
//需要增强,需要代理
this.advisedBeans.put(cacheKey, Boolean.TRUE);
//创建代理
Object proxy = this.createProxy(bean.getClass(), beanName, specificInterceptors, new SingletonTargetSource(bean));
this.proxyTypes.put(cacheKey, proxy.getClass());
return proxy;
} else {
this.advisedBeans
标签:Object,getClass,beanName,代理,bean,源码,AOP,底层
From: https://blog.csdn.net/qq_39052339/article/details/139749335