继前一篇博文。把bean放入到beanPool中更灵活的方式是通过给方法加@Bean注解,把方法返回值封装成一个bean,put到beanPool中。
思考
处理有Bean注解且含有参数的方法的关键:
方法所依赖的参数是否满足?
- 满足:反射机制执行这个方法,并且把把返回值放入beanPool
- 不满足:应该把不满足的方法封装成一个MethodDefinition存起来。
而且当有一个新的bean被put到beanPool时,可能这个bean就是方法唯一需要的bean,所以要检查这个不能满足的方法集是否有变化。
综上所述:
准备3种东西:
- 不能满足依赖关系的MethodDefinition列表:列表1;
- 满足了依赖关系的MethodDefinition列表:列表2。
- 参数类型为键,MethodDefinition形成的LIst为值的 Map;
(键是参数,是beanPool中没有的参数类型。值是由需要这个参数的MethodDefinition形成的list)
步骤
- 遇到一个带参方法,先检测其所有参数;
-
若参数满足要求,则处理下一个参数。
-
若参数不能得到满足,先到Map中查看这个参数类型再map中有没有对应键,有则在这个键对应的list中add这个MethodDefinition。没有则put一个新的键值对。(参数类型为键,MethodDefinition形成的list为值)
-
当对所有参数都进行了检测,若存在未满足的参数,
则,将MethodDefinition存储到列表1; -
当所有参数都满足要求,则,将其存储到列表2;
-
- 每处理完一个Bean,都要扫描Map,将依赖这个Bean的list中的每个MethodDefinition的
得不到的参数count–,并且清空这个bean对应的list容器。
若list中某个MethodDefinition的count为0了(count封装在MethodDefinition,表示这个方法目前还有count个参数还得不到),则,将其存储到列表2中。 - 在每次包扫描结束后,都要执行列表2中的所有方法。
public class MethodDependence {
private static final List<MethodDefinition> uninvokeMethodList
= new ArrayList<MethodDefinition>(); //列表1
private static final List<MethodDefinition> invokeableMethodList
= new LinkedList<MethodDefinition>(); //列表2
private static final Map<Class<?>, List