springAOP代理实现

继续上一篇

追踪了一下代码,找到了springAOP启动时注册的代理类

AnnotationAwareAspectJAutoProxyCreator 是处理切面xml配置spirngaop或者注解创建代理类的容器。

其父类AbstractAutoProxyCreator中根据配置的通知类型执行

postProcessBeforeInstantiation postProcessAfterInitialization 方法

 

然后调用wrapIfNecessary方法将需要切面的方法存入map advisedBeans

 

 

/**
* Wrap the given bean if necessary, i.e. if it is eligible for being proxied.
* @param bean the raw bean instance
* @param beanName the name of the bean
* @param cacheKey the cache key for metadata access
* @return a proxy wrapping the bean, or the raw bean instance as-is
*/
protected Object wrapIfNecessary(Object bean, String beanName, Object cacheKey) {
if (beanName != null && this.targetSourcedBeans.containsKey(beanName)) {
returnbean;
}
if (Boolean.FALSE.equals(this.advisedBeans.get(cacheKey))) {
returnbean;
}
if (isInfrastructureClass(bean.getClass()) || shouldSkip(bean.getClass(), beanName)) {
this.advisedBeans.put(cacheKey, Boolean.FALSE);
returnbean;
}
 
// Create proxy if we have advice.
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());
returnproxy;
}
 
this.advisedBeans.put(cacheKey, Boolean.FALSE);
returnbean;
 
}
 

 

 

 

其中

Object proxy = createProxy(bean.getClass(), beanNamespecificInterceptorsnew SingletonTargetSource(bean));

通过代理的方式将所要切面处理的对象代理出来

代理的方式分为JDK原声的代理,以及cglib

JDK:所代理的对象实现了接口

cglib:所代理的对象没有接口实现

 

至此,springaop代理对象已成功,

当调用到切点所在的方法时,反射代理对象的方法,

再根据通知的类型来执行代理对象的前后操作

调用JdkDynamicAopProxy类中的

public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

。。。

方法

 

 

 

猜你喜欢

转载自ttkx1988.iteye.com/blog/2326525