编程语言
首页 > 编程语言> > 10.spring源码

10.spring源码

作者:互联网

1.spring-aop底层就是动态代理,例如有两个切面类(A_Aspect和B_Aspect)同时切目标方法

    A_Aspect{
        try{
            @Before(前置通知)
            mthod.invoke(obj,args)或是环绕通知的pjp.procced(args){------------------->此时并没有真正的执行目标方法,而是执行B_Aspect的切面方法
                B_Aspect{
                    try{
                         @Before(前置通知)
                        method.invoke(obj,args)或环绕通知的pjp.procced(args)---------------->此时是真正的执行目标方法
                        @afterreturning(返回通知)
                    }catch{
                        @afterthrowing(异常通知)
                    }finally{
                        @after(后置通知)
                    }
                }
             //B_Aspect切面方法执行完毕
             @afterthrowing(异常通知)  
        }catch{
            @afterthrowing(异常通知)
        }finally{
            @after(后置通知)
        }
    }



1.当我们创建spring容器时
    ApplicationContext ioc=new ClassPathXmlApplicationContext("ioc.xml");
2.会调用ClassPathXmlApplicationContext的三个参数构造器

public ClassPathXmlApplicationContext(String configLocation) throws BeansException {
    this(new String[]{configLocation}, true, (ApplicationContext)null);
}

对应的三个参数构造器代码如下:此时第二个参数refresh是固定为true
    public ClassPathXmlApplicationContext(String[] configLocations, boolean refresh, ApplicationContext parent) throws BeansException {
        super(parent);
        this.setConfigLocations(configLocations);
        if (refresh) {
            //调用this.refresh();后,所有的单实例bean创建完成
            this.refresh();-------------------------------------->调用this.refresh();后,所有的单实例bean创建完成
        }
    }
    
对应的refresh()方法的内容如下:
    public void refresh() throws BeansException, IllegalStateException {
    synchronized(this.startupShutdownMonitor) {----------------------->同步锁。保证多线程情况下ioc容器只被创建一次!
        //准备容器刷新:跳过此句后会打印以下内容:发现其刷新spring容器
        //八月 17, 2020 10:14:04 下午 org.springframework.context.support.AbstractApplicationContext prepareRefresh
        //信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@612fc6eb: startup date [Mon Aug 17 22:14:04 CST 2020]; root of context hierarchy
        this.prepareRefresh();
        //spring解析xml配置文件,将要创建的所有bean的配置信息保存起来(此后ioc.xml配置文件没有用了,但是此时还没有创建组件,只是将)
        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();
            //创建所有的单实例bean
            this.finishBeanFactoryInitialization(beanFactory);
            this.finishRefresh();
        } catch (BeansException var5) {
            this.destroyBeans();
            this.cancelRefresh(var5);
            throw var5;
        }

    }
}

对应的finishBeanFactoryInitialization(beanFactory);方法详情
protected void finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory) {
    if (beanFactory.containsBean("conversionService") && beanFactory.isTypeMatch("conversionService", ConversionService.class)) {
        beanFactory.setConversionService((ConversionService)beanFactory.getBean("conversionService", ConversionService.class));
    }

    beanFactory.setTempClassLoader((ClassLoader)null);
    beanFactory.freezeConfiguration();
    //初始化所有的单实例bean
    beanFactory.preInstantiateSingletons();
}



对应的beanFactory.preInstantiateSingletons();方法详情在DefaultListableBeanFactory类中
public void preInstantiateSingletons() throws BeansException {
    if (this.logger.isInfoEnabled()) {
        this.logger.info("Pre-instantiating singletons in " + this);
    }

    synchronized(this.beanDefinitionMap) {
        List<String> beanNames = new ArrayList(this.beanDefinitionNames);
        Iterator var4 = beanNames.iterator();

        while(true) {
            while(true) {
                String beanName;
                RootBeanDefinition bd;
                do {
                    do {
                        do {
                            if (!var4.hasNext()) {
                                return;
                            }

                            beanName = (String)var4.next();
                            bd = this.getMergedLocalBeanDefinition(beanName);
                        } while(bd.isAbstract());----------------------------------->bean是抽象类
                    } while(!bd.isSingleton());-------------------------------------->bena不是单实例
                } while(bd.isLazyInit());-------------------------------------------->bena是懒加载

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

                    if (isEagerInit) {
                        this.getBean(beanName);
                    }
                } else {
                    this.getBean(beanName);
                }
            }
        }
    }
}

this.getBean(beanName);方法具体详情
public Object getBean(String name) throws BeansException {
    return this.doGetBean(name, (Class)null, (Object[])null, false);
}


调用的dogetbean的详情为:
    未完待续...

 

标签:10,beanFactory,spring,BeansException,beanName,refresh,bean,源码,public
来源: https://www.cnblogs.com/wmd-l/p/16246980.html