源码入口
此方法是创建Bean实例对象,并且添加通知
1: 举例子 我们可以applyBeanPostProcessorsAfterInitialization的方法
-
applyBeanPostProcessorsAfterInitialization中调用了postProcessAfterInitialization方法 调用bean中所有后置处理中 初始化方法为bean实例在初始化后执行自定义处理操作
-
postProcessAfterInitialization方法是在AbstractAutoProxyCreator这个类中此方法调用了wrapIfNecessary方法 此方法执行的主要目的是判断是否有需要代理的类 此方法中需要特别注意两个方法:
getAdvicesAndAdvisorsForBean 获取bean的advice扫描相关的类
createProxy 创建代理方法 此方法有两种代理模式 一种是jdk 另外一种是Cglib
-
getAdvicesAndAdvisorsForBean 方法AbstractAdvisorAutoProxyCreator类中 主要方法findEligibleAdvisors 这个方法主要是查找类的切入点 并且排序
-
调用getAdvicesAndAdvisorsForBean方法返回了一个数组之后 会去执行createProxy去创建代理
-
createProxy类中主要的方法是proxyFactory.getProxy() 代理工厂获取代理对象。
-
getProxy 进入了ProxyFactory 中 getProxy方法又调用了 CGLIB 和JDK两种代理模式
-
判断jdk动态代理的条件 是否为接口 或者为代理类然后进入new JdkDynamicAopProxy(config)类
-
基于jdk 的获取动态代理获取 getProxy 在JdkDynamicAopProxy类中获取代理类要实现的接口,除了除了Advised对象中配置的,还会加上SpringProxy, Advised(opaque=false) 检查获取的类上面有没有加上equals 和hascode 并且调用Proxy.newProxyInstance创建代理对 。 该类中会有方法去判断 此类中是否有equals 和hascode作用(findDefinedEqualsAndHashCodeMethods)
-
我们则需要关系的是invoke方法 中的getInterceptorsAndDynamicInterceptionAdvice 此方法是去拦截需要方法通知的类 如果没有拦截到 那么直接用反射。如果有直接invoke创建方法去执行
-
如果能拦截到的话那么就invocation.proceed 创建MethodInvocation 进入到 ReflectiveMethodInvocation 类中的 proceed方法 会进行判断如果 如果要动态匹配joinPoint 如果满足需求则去创建使用方法invoke 如果不满足则继续调用此方法 ,如果不是动态匹配则去执行。判断是否动态匹配之前会做判断会创建一个currentInterceptorIndex全局变量去判断 获取的拦截数组中 长度是否相等 如果不相等变量currentInterceptorIndex+1 。如果当前变量的数值等于 拦截数组的长度难么就去执行oinPoint