DefaultSingletonBeanRegistry 的registerDependentBean()方法对属性注入

本文对autowiring源码分析,阐述其实现过程,包括调用getBean()初始化和注入依赖Bean、设置属性引用、存储名称到IOC容器集合。指出Spring IOC容器的autowiring自动依赖注入可简化配置,但存在不足,如依赖关系难看清、配置不当有后果,使用需综合考虑。
摘要由CSDN通过智能技术生成
//为指定的Bean注入依赖的Bean
public void registerDependentBean(String beanName, String dependentBeanName) {
	// A quick check for an existing entry upfront, avoiding synchronization...
	//处理Bean名称,将别名转换为规范的Bean名称
	String canonicalName = canonicalName(beanName);
	Set<String> dependentBeans = this.dependentBeanMap.get(canonicalName);
	if (dependentBeans != null && dependentBeans.contains(dependentBeanName)) {
		return;
	}

	// No entry yet -> fully synchronized manipulation of the dependentBeans Set
	//多线程同步,保证容器内数据的一致性
	//先从容器中:bean名称-->全部依赖Bean名称集合找查找给定名称Bean的依赖Bean
	synchronized (this.dependentBeanMap) {
		//获取给定名称Bean的所有依赖Bean名称
		dependentBeans = this.dependentBeanMap.get(canonicalName);
		if (dependentBeans == null) {
			//为Bean设置依赖Bean信息
			dependentBeans = new LinkedHashSet<>(8);
			this.dependentBeanMap.put(canonicalName, dependentBeans);
		}
		//向容器中:bean名称-->全部依赖Bean名称集合添加Bean的依赖信息
		//即,将Bean所依赖的Bean添加到容器的集合中
		dependentBeans.add(dependentBeanName);
	}
	//从容器中:bean名称-->指定名称Bean的依赖Bean集合找查找给定名称Bean的依赖Bean
	synchronized (this.dependenciesForBeanMap) {
		Set<String> dependenciesForBean = this.dependenciesForBeanMap.get(dependentBeanName);
		if (dependenciesForBean == null) {
			dependenciesForBean = new LinkedHashSet<>(8);
			this.dependenciesForBeanMap.put(dependentBeanName, dependenciesForBean);
		}
		//向容器中:bean名称-->指定Bean的依赖Bean名称集合添加Bean的依赖信息
		//即,将Bean所依赖的Bean添加到容器的集合中
		dependenciesForBean.add(canonicalName);
	}
}

通过对autowiring 的源码分析,我们可以看出,autowiring 的实现过程:

a、对Bean 的属性代调用getBean()方法,完成依赖Bean 的初始化和依赖注入。

b、将依赖Bean 的属性引用设置到被依赖的Bean 属性上。

c、将依赖Bean 的名称和被依赖Bean 的名称存储在IOC 容器的集合中。

Spring IOC 容器的autowiring 属性自动依赖注入是一个很方便的特性,可以简化开发时的配置,但是凡是都有两面性,自动属性依赖注入也有不足,首先,Bean 的依赖关系在配置文件中无法很清楚地看出来,对于维护造成一定困难。其次,由于自动依赖注入是Spring 容器自动执行的,容器是不会智能判断的,如果配置不当,将会带来无法预料的后果,所以自动依赖注入特性在使用时还是综合考虑。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值