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

回到顶部