从 beanFactory 中查找匹配的 Bean 对象 resolveDependency
初始化入参获取器
匹配类型为 Optional,将 doResolveDependency 结果包装成 Optional<br>
如果是 ObjectFactory 或者 ObjectProvider,则生成一个 DependencyObjectProvider 对象,在 getBean 时调用<br>
如果依赖描述上右 @Lazy 注解,则生成一个代理对象返回,在调用代理对象的方法时调用 doResolveDependency<br>
不是以上情况则直接调用 doResolveDependency
处理 @Value 注解
获取注解指定的值
如果指定的值是 String 类型
处理占位符填充 ${}
处理 Spring 表达式 #{}
将 value 转换为 typeConverter 所对应的类型
如果依赖注入的类型是数组、集合等,找出所有匹配的 Bean 返回<br>
findAutowireCandidates( ) 根据类型找到所有 Bean 添加到 map,key 是 beanName,value 有可能是 bean 对象,有可能是 beanClass <br>
从 BeanFactory 中找出和 requiredType 匹配的 beanName
根据类型从 resolvableDependencies 中匹配 Bean
遍历匹配到的 BeanName ,不是自己注入自己并且通过检查则加入 候选
SimpleAutowireCandidateResolver#isAutowireCandidate() 检查 BeanDefinition 的 autowireCandidate 属性是不是为 true<br>
GenericTypeAwareAutowireCandidateResolver#isAutowireCandidate 检查 BeanDefinition 的 beanClass 属性和当前注入点的 type 是否匹配(包括泛型类型校验)
QualifierAnnotationAutowireCandidateResolver#isAutowireCandidate()检查 BeanDefiniton 的 qualifier 属性和注入点的 qualifer 属性是否匹配
遍历完之后候选为空,判断是否需要注入自己<br>
如果匹配到 0 个,判断是否必须注入,如果是则抛出异常
如果匹配到多个进行筛选 @Primary -->优先级最高 --》name
如果没实例化则进行实例化
缓存找到的对象 (缓存在注入点中,原型 Bean 第二次创建 Bean 时会触发缓存,缓存的是 BeanName 并不是 Bean 对象,防止注入点为原型而注入同一个对象)