一、循环依赖注入问题
Singleton类型的做用域,能够在早期对象缓存集合中或者查询是否存在正在建立中的bean来解决循环依赖注入问题。
private final Map<String,Object> earlySingletonObjects = new HashMap<String,Object>(16);
二、IOC容器的工做模式,经过工厂模式根据beanName经过反射动态生成对象。
1)IOC容器主要完成对象的建立和依赖的管理注入等。
2)依赖注入是控制反转的基础。
3)利用反射原理将对象建立的权利交给了Spring容器,Spring在运行的时候根据配置文件来动态建立对象和维护对象之间的关系,实现了松耦合。
三、依赖注入的实现方式
:构造器、Setter方法注入、接口注入(经常使用,@Autowired,@Resource)
由Spring容器将对象注入到使用它的地方,被注入的对象只提供对应的方法接收就行,由容器来决定对象之间的依赖关系。
四、@Autowired原理
1)每一个Bean实例化以后,调用AutowiredAnnotationBeanPostProcessor的下图方法,找到有@Autowired注解的信息。
检查beanName在injectionMetadataCache的Map中是否有对应的元数据,若不存在则从新经过反射绑定元数据LinkedList。Synchronized线程同步方式。静态的方法或类,字段不支持@Autowired。
2)
AutowiredAnnotationBeanPostProcessor的postProcessPropertyValues()方法就是从Spring IOC容器从找到合适的Bean,注入属性。找到合适的Bean,注入@Autowired标识方法的参数,而后执行此方法。
3)第二步中metadata.inject(bean,beanName,pvs);即以下图:
解析@Autowired注解生成的元数据类有AutowiredFieldElement,AutowiredMethodElement;这两个类继承InjectionMetadata,InjectedElement,各自实现了inject方法。这两个类是AutowiredAnnotationBeanPostProcessor的内部静态私有类。
检查方法或属性是不是公开的,若不是,则强制转为可访问的,避免与JVM发生没必要要的冲突。
ReflectionUtils.makeAccessible(field);
ReflectionUtils.makeAccessible(method);
四、接下来就须要Spring IOC容器根据DependencyDescriptor依赖描述去寻找容器中合适的Bean。
五、@Autowired注解能够在Map,Array,Collection中使用。