SpringIOCDI
1、循环依赖注入问题
Singleton类型的作用域,可以在早期对象缓存集合中或者查询是否存在正在创建中的bean来解决循环依赖注入问题。
private final Map<String,Object> earlySingletonObjects = new HashMap<String,Object>(16);
2、IOC容器的工作模式,通过工厂模式根据beanName通过反射动态生成对象。
1)IOC容器主要完成对象的创建和依赖的管理注入等。
2)依赖注入是控制反转的基础。
3)利用反射原理将对象创建的权利交给了Spring容器,Spring在运行的时候根据配置文件来动态创建对象和维护对象之间的关系,实现了松耦合。
3、依赖注入的实现方式
:构造器、Setter方法注入、接口注入(常用,@Autowired,@Resource)
由Spring容器将对象注入到使用它的地方,被注入的对象只提供对应的方法接收就行,由容器来决定对象之间的依赖关系。
4、@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);
4、接下来就需要Spring IOC容器根据DependencyDescriptor依赖描述去寻找容器中合适的Bean。
5、@Autowired注解可以在Map,Array,Collection中使用。
以上是 SpringIOCDI 的全部内容, 来源链接: utcz.com/z/514794.html