spring 源码个人浅浅分析(2)---MethodOverrides详解

MethodOverrides方法的覆盖源码分析

如下xml配置:

spring 源码个人浅浅分析(2)---MethodOverrides详解_第1张图片

 
		
	
	 
	
	
	
		
	
	

抽象类GetBeanTest代码:

package springSourseAnalyes;


public abstract class GetBeanTest {
	
	public void showMe(){
		getBean().showMe();
	}

	abstract User getBean();
	
	
}

User类和Teacher类代码:

package springSourseAnalyes;

public class User {

	void showMe(){
		System.out.println("i am user");
	}
}

package springSourseAnalyes;

public class Teacher extends User{
	@Override
	void showMe() {
		// TODO Auto-generated method stub
		System.out.println("i am Teacher");
	}

}

其实MethodOverrides的作用就是在spring配置中存在lookup-mehtod和rreplace-method的,而这两个配置在加载xml的时候就会统一存放在BeanDefinition中的methodOverrides属性里。

查看源码AbstractAutowireCapableBeanFactory的创建bean的方法create:

spring 源码个人浅浅分析(2)---MethodOverrides详解_第2张图片

这时候GetBeanTest类已经是class类,开始调用准备方法的覆盖,继续进入方法prepareMethosOverrides()。

查看源码AbstractBeanDefinition

spring 源码个人浅浅分析(2)---MethodOverrides详解_第3张图片

遍历MethodOverrides,对于一个方法的匹配来j讲,如果一个l类中存在若干个重载方法,那么,在函数调用以及增强的时候还需要根据参数类型进行匹配,来最终确认当前调用的到底是哪个函数,但是,spring将一部分匹配工作在这里完成了,如果当前类中的方法只有一个,那么就设置重载该方法没有被重载,这样在后续调用的时候便可以直接使用找到的方法,而不需要j进行方法的参数匹配了,而且还可以提前对方法存在性进行验证。

进入帮助类ClassUtils

spring 源码个人浅浅分析(2)---MethodOverrides详解_第4张图片

使用递归方式来遍历当前类的方法,是否与methodName匹配,如果匹配则count计数器自增,然后对当前类的接口进行遍历匹配操作,然后在对当前类的超类进行遍历匹配。返回计数器。

递归先后遍历:1、当前类方法遍历。2、当前类接口的方法遍历。3、当前类超类的方法遍历。

最终返回的是一个对当前类的代理类。通过CGLIB生成不同的代理类。

spring 源码个人浅浅分析(2)---MethodOverrides详解_第5张图片

其中owner 是BeanFactory 接口、beanDefinition为RootBeanDefinition类

当调用方法时,就会被拦截调用intercept方法,获取到该方法的替换者bean类,然后在通过owner.getBean来获取bean类,然后真正调用被替换的方法。

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(Spring,的问题,spring,源码分析)