Spring 源码剖析 三、主要逻辑代码赏析之根据bean的定义来生成bean

本文深入探讨Spring框架中,如何根据bean的定义生成bean。从finishBeanFactoryInitialization()方法开始,详细讲解DefaultListableBeanFactory如何遍历beanName,通过getBean()方法调用doGetBean()实现bean的创建。重点关注createBeanInstance()和autowireConstructor()过程,阐述了依赖注入的逻辑,以及无参构造函数与带参构造函数生成bean的不同路径。
摘要由CSDN通过智能技术生成

  上一节中将了如何通过xml文件中读取到bean的定义,链接为 Spring 二、主要逻辑代码赏析之获取bean的定义 ,这一节中,我们将会讲述读取出xml文件后,如何根据bean的定义来最终生成bean。

  首先还是来看一下

ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); 

  初始的时候的refresh() 方法:

  	@Override
	public void refresh() throws BeansException, IllegalStateException {
		synchronized (this.startupShutdownMonitor) {

			// Prepare this context for refreshing.
			prepareRefresh();
			. . .
			// 此为获取一个 DefaultListableBeanFactory 的 beanFactory,并且会生成 XmlBeanDefinitionReader ,从xml文件中读出beanDefinition并放置到 beanFactory中
			ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();


			// Prepare the bean factory for use in this context.
			prepareBeanFactory(beanFactory);
			try {
				. . .

				//  DefaultListableBeanFactory 会在此方法中根据 BeanDefinition 去加载bean的定义。
				finishBeanFactoryInitialization(beanFactory);

				finishRefresh();
			}

			catch (BeansException ex) {
				. . .
				// Propagate exception to caller.
				throw ex;
			}

			finally {

				. . .
			}
		}
	}

可以看到 ,是在 finishBeanFactoryInitialization(beanFactory) 方法中将beanDefinition生成bean的。
下面我们看一下 DefultListableBeanFactory来获取bean的方法:

	@Override
	public void preInstantiateSingletons() throws BeansException {

		// 得到所有的bean定义的name列表
		List<String> beanNames = new ArrayList<String>(this.beanDefinitionNames);

		// 遍历bean定义name的列表,得到对应的bean定义
		for (String beanName : beanNames) {

			this.logger.debug("beanName 为" + beanName);

			// 得到bean的定义
			RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName);
			if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) {

				// 如果是工厂类的bean
				if (isFactoryBean(beanName)) {

					final FactoryBean<?> factory = (FactoryBean<?>) getBean(FACTORY_BEAN_PREFIX + beanName);
					boolean isEagerInit;
					if (System.getSecurityManager() != null && factory instanceof SmartFactoryBean) {
						isEagerInit = AccessController.doPrivileged(new PrivilegedAction<Boolean>() {
							@Override
							public Boolean run() {
								return ((SmartFactoryBean<?>) factory).isEagerInit();
							}
						}, getAccessControlContext());
					}
					else {
						isEagerInit = (factory instanceof SmartFactoryBean &&
								((SmartFactoryBean<?>) factory).isEagerInit());
					}

					if (isEagerInit) {


						getBean(beanName);

					}
				}
				
				//
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值