Spring IOC 容器源码阅读笔记

参考的文章Spring IOC容器源代码解析,作者带着看了一遍源码,边看边讲,非常nice。正文我对于Spring IOC(控制反转)的理解,是将对象的管理(控制)权从以前的程序员手中“反转”到了Spring IOC容器手中。Spring IOC容器的定义接口(最基本的IOC容器):BeanFactory,这个借口为具体的IOC容器的实现做了最基本的功能规定。public interfac
摘要由CSDN通过智能技术生成

参考的文章

正文

  • 我对于Spring IOC(控制反转)的理解,是将对象的管理(控制)权从以前的程序员手中“反转”到了Spring IOC容器手中。
  • Spring IOC容器的定义接口(最基本的IOC容器):BeanFactory,这个借口为具体的IOC容器的实现做了最基本的功能规定。
public interface BeanFactory {
   
    String FACTORY_BEAN_PREFIX = "&";

    Object getBean(String var1) throws BeansException;

    <T> T getBean(String var1, Class<T> var2) throws BeansException;

    <T> T getBean(Class<T> var1) throws BeansException;

    Object getBean(String var1, Object... var2) throws BeansException;

    <T> T getBean(Class<T> var1, Object... var2) throws BeansException;

    boolean containsBean(String var1);

    boolean isSingleton(String var1) throws NoSuchBeanDefinitionException;

    boolean isPrototype(String var1) throws NoSuchBeanDefinitionException;

    boolean isTypeMatch(String var1, ResolvableType var2) throws NoSuchBeanDefinitionException;

    boolean isTypeMatch(String var1, Class<?> var2) throws NoSuchBeanDefinitionException;

    Class<?> getType(String var1) throws NoSuchBeanDefinitionException;

    String[] getAliases(String var1);
}
  • 围绕着BeanFactory,pring对于IOC容器有许多种实现(XmlBeanFactory,XmlWebApplicationContext.java,ClassPathXmlApplicationContext.java FileSystemXmlApplicationContext.java)。
  • 我是以ClassPathXmlApplicationContext.java为例去看的源码。
ClassPathXmlApplicationContext构造器代码
public ClassPathXmlApplicationContext(String[] configLocations, boolean refresh, ApplicationContext parent) throws BeansException {
        super(parent);
        this.setConfigLocations(configLocations);
        if(refresh) {
            this.refresh();
        }

    }
  • 主要是调用了refresh()方法。bean的初始化逻辑是在这里完成的。
refresh()方法(refresh方法是在AbstractApplicationContext里的)
public void refresh() throws BeansException, IllegalStateException {
        Object var1 = this.startupShutdownMonitor;
        synchronized(this.startupShutdownMonitor) {
            this.prepareRefresh();
            ConfigurableListableBeanFactory beanFactory = this.obtainFreshBeanFactory();
            this.prepareBeanFactory(beanFactory);

            try {
                this.postProcessBeanFactory(beanFactory);
                this.invokeBeanFactoryPostProcessors(beanFactory);
                this.registerBeanPostProcessors(beanFactory);
                this.initMessageSource();
                this.initApplicationEventMulticaster();
                this.onRefresh();
                this.registerListeners();
                this.finishBeanFactoryInitialization(beanFactory);
                this.finishRefresh();
            } catch (BeansException var9) {
                if(this.logger.isWarnEnabled()) {
                    this.logger.warn("Exception encountered during context initialization - cancelling refresh attempt: " + var9);
                }
                this.destroyBeans();
                this.cancelRefresh(var9);
                throw var9;
            } finally {
                this.resetCommonCaches();
            }

        }
    }
  • 这里重要的是ConfigurableListableBeanFactory beanFactory = this.obtainFreshBeanFactory();,获取一个新的beanFactory
obtainFreshBeanFactory()
protected ConfigurableListableBeanFactory obtainFreshBeanFactory() {
        this.refreshBeanFactory();
        ConfigurableListableBeanFactory beanFactory = this.getBeanFactory();
        if(this.logger.isDebugEnabled()) {
            this.logger.debug("Bean factory for " + this.getDisplayName() + ": " + beanFactory);
        }

        return beanFactory;
    }
  • this.refreshBeanFactory();刷新beanFactory,如果已经建立了那么应该销毁重建。该方法是一个abstract方法,通过调试发现调用的是AbstractRefreshableApplicationContext中实现的refreshBeanFactory方法
refreshBeanFact
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值