模拟Spring IoC(三)Bean注解含参方法处理

在上一篇文章中《模拟Spring IoC(二)Bean注解》解释了Bean注解的应用场景,但是没有处理有参方法的Bean注解,这边文章将主要描述Bean注解含参方法的处理过程。

分析:

含参方法处理的关键是:方法所依赖的参数是否满足?
如果满足,则,该方法是可以执行并得到一个Bean的。
如果最终都无法满足,那么必然形成了循环依赖,无法获取参数,则将循环依赖告知用户。
核心是:检测依赖是否满足。

这里可以先考虑构造MethodDefinition
MethodDefinition封装了方法反射执行所需要的对象:
1、对象;
2、方法本身;
3、参数对象集合。
这里最难解决的问题是:参数所需要的对象可能是随机满足的,即当你想要执行该方法时,该方法所需要的某个参数此时可能并没有存储在beanPool中。

处理方法:
将所有不满足依赖关系的方法中的参数形成一个Map(比如dependenceMethodPool ),此Map的键是参数类型,而值是MethodDefinition所形成的List(即含有该参数类型的所有方法组成的列表),此map用于管理参数类型与需要该参数类型的方法的映射关系。再准备一个参数不满足(暂时无法执行)的方法列表(列表1),参数满足要求的(即可执行的)方法列表(列表2)。
在这里插入图片描述

过程
1、遇到一个带参方法,先检测其所有参数;
1.1、若参数满足要求,则,暂不处理(可以将count–),这里的count是“参数个数”
1.2、若参数不能得到满足,则,将这个参数类型作为键,这个MethodDefinition作为值,存储到Map中;
1.3、当对所有参数都进行了检测,若存在未满足的参数,则,将MethodDefinition存储到列表1;
1.4、当所有参数都满足要求,则,将其存储到列表2;
2、每处理完一个Bean,都扫描Map,将依赖这个Bean的MethodDefinition的count–;若count为0了,说明参数都满足了,则,将其存储到列表2中。

实现

MethodDefinition:

public class MethodDefinition {
   
	private Method method;//方法本身
	private Object object;//执行方法的对象
	private int paraCount;//方法的参数个数
	
	public MethodDefinition() {
   
	}

	Method getMethod() {
   
		return method;
	}

	void setMethod(Method method) {
   
		this.method = method;
	}

	Object getObject() {
   
		return object;
	}

	void setObject(Object object) {
   
		this.object = object;
	}
	
	void setParaCount(int paraCount) {
   
		this.paraCount = paraCount;
	}

	//参数个数增加
	void add() {
   
		++this.paraCount;
	}
	//参数个数减少
	int sub() {
   
		return --this.paraCount;
	}

这是处理带参方法的入口,该段程序属于dealBean方法:
在这里插入图片描述

/*
 * 
 * 获取beanPool中没有的参数
 * 1.获取方法的参数类型,对参数类型进行去重操作再装入paraPool
 * 2.产生一个ArrayList,在BeanPool中查找是否存在该参数类型,
 * 3.若存在,则从paraPool中删掉
 * */
private static Map<Class<?>,Integer> getMethodPara(Object object,Method method) {
   
	Map<Class<?>, Integer> paraPool = new HashMap<>();//存储BeanPool中没有的参数
	
	Class<?>[] parameterTypes = method.getParameterTypes();
	for(int index = 0;index <parameterTypes.length;index++) {
   
		//HashMap中不存在相同的key值,put方法会自动调用equals方法和hashCode
		//去重;去掉类型重复的参数类型
		paraPool.put(parameterTypes[index], 0);//暂时只需要键,即参数类型,至于缺失参数的方法目前不put
	}
	//Map和List不能边遍历边删除,先将其存储到klassList
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值