Spring IOC-DI

大城市里の小女人 提交于 2020-03-26 23:38:35

3 月,跳不动了?>>>

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中使用。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!