Spring aop 源代码分析
一、spring aop 实现最关键的类就是ProxyFactoryBean
org.springframework.aop.framework.ProxyFactoryBean
我们这个列子从这个类中的说起
执行分2步骤
1 、initializeAdvisorChain();
2、 if (isSingleton()) {
return getSingletonInstance();
}
下面对这2步骤进行详细描述
1、
private synchronized void initializeAdvisorChain() throws AopConfigException, BeansException {
方法中首先通过interceptirNamees[i]的值(也就是一些通知的名字)从bean工厂中得到相应的实列
然后转到 private void addAdvisorOnChainCreation(Object next, String name) {
方法中
这里转到namedBeanToAdvisor(Object next) 方法中描述下
/**
* Convert the following object sourced from calling getBean() on a name in the
* interceptorNames array to an Advisor or TargetSource.
*/
private Advisor namedBeanToAdvisor(Object next) {
try {
return this.advisorAdapterRegistry.wrap(next);
}
接着
addAdvisor((Advisor) advisor);
这句话的意思是 把这个转化过来的advisor添加到
private List advisors = new LinkedList();这个list中去
这样上面第一步操作完成
下面是第二步操作
2、 if (isSingleton()) {
return getSingletonInstance();
}
下面是getSingletonInstance()方法的截图
打绿色的就是比较关键点了
分2步来讲
里面的是createAopProxy()方法(其实是实列化一个JdkDynamicAopProxy)
一.对createAopProxy()方法进行解析
因为public class ProxyFactoryBean extends ProxyCreatorSupport
所以发现调用的是ProxyCreatorSupport类里面的
protected final synchronized AopProxy createAopProxy() {
if (!this.active) {
activate();
}
return getAopProxyFactory().createAopProxy(this);
}
接着调用的是DefaultAopProxyFactory的
返回一个JdkDynamicAopProxy的实列
JdkDynamicAopProxy类就是java 实现aop的具体地方
final class JdkDynamicAopProxy implements AopProxy, InvocationHandler, Serializable {
二、分析getProxy(createAopProxy())
protected Object getProxy(AopProxy aopProxy) {
return aopProxy.getProxy(this.beanClassLoader);
}
经过上面发现aopProxy.getProxy(this.beanClassLoader);这句话其实调用的是
JdkDynamicAopProxy类里面的
下面就是 如果调用invoke方法的时候 大概流程是这样的
从链中得到是什么通知,然后执行通知里面的方法:打个比方 是前通知
会执行org.springframework.aop.framework.adapter.MethodBeforeAdviceInterceptor类中的方法
public Object invoke(MethodInvocation mi) throws Throwable {
this.advice.before(mi.getMethod(), mi.getArguments(), mi.getThis() );……………①这里是应该执行前通知(是自己写的继承类)如下
return mi.proceed();………………………②这个就是执行业务方法也就是spring中所讲的切点
}
package aop3;
import java.lang.reflect.Method;
import org.springframework.aop.MethodBeforeAdvice;
public class SecurityAdvice implements MethodBeforeAdvice{
public void before(Method arg0, Object[] arg1, Object arg2) throws Throwable {
// TODO Auto-generated method stub
System.out.println("security()");
}
}
不太会上传图片 具体的在附件里面 如果我写的有什么问题 大家指出来 初学者 demo也是我在网上看的