91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

springboot如何完善上下文加載器

發布時間:2021-06-28 17:21:37 來源:億速云 閱讀:205 作者:chen 欄目:編程語言

本篇內容介紹了“springboot如何完善上下文加載器”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!


1. prepareContext

源碼:

```
 private void prepareContext(ConfigurableApplicationContext context, ConfigurableEnvironment environment, SpringApplicationRunListeners listeners, ApplicationArguments applicationArguments, Banner printedBanner) {
    //注入環境屬性
    context.setEnvironment(environment);
    //上下文后置處理
    this.postProcessApplicationContext(context);
    //完善初始化類的屬性
    this.applyInitializers(context);
    //發送監聽事件
    listeners.contextPrepared(context);
    //日志
    if (this.logStartupInfo) {
        this.logStartupInfo(context.getParent() == null);
        this.logStartupProfileInfo(context);
    }
    //注冊傳入的配置參數為bean,這里將傳入的參數封裝成applicationArguments,內部類似命令行
    ConfigurableListableBeanFactory beanFactory = context.getBeanFactory();
    beanFactory.registerSingleton("springApplicationArguments", applicationArguments);
    //banner打印
    if (printedBanner != null) {
        beanFactory.registerSingleton("springBootBanner", printedBanner);
    }
    //這里默認情況下bean定義不允許重復
    if (beanFactory instanceof DefaultListableBeanFactory) {
        ((DefaultListableBeanFactory)beanFactory).setAllowBeanDefinitionOverriding(this.allowBeanDefinitionOverriding);
    }
    //默認不開啟延遲加載
    if (this.lazyInitialization) {
        context.addBeanFactoryPostProcessor(new LazyInitializationBeanFactoryPostProcessor());
    }
    //獲取全部的資源
    //這里獲取了啟動類的資源和 當前SpringApplication中的source資源。
    //到目前來說實際上只有啟動類資源
    Set<Object> sources = this.getAllSources();
    Assert.notEmpty(sources, "Sources must not be empty");
    this.load(context, sources.toArray(new Object[0]));
    listeners.contextLoaded(context);
}
```

老樣子進行逐個分析。但看這個方法并不復雜,整體上對上下文和工廠類進行配置的完善。

1.1 postProcessApplicationContext 方法

源碼:

   protected void postProcessApplicationContext(ConfigurableApplicationContext context) {
        //  是否自定義bean名稱生成類
        if (this.beanNameGenerator != null) {
            context.getBeanFactory().registerSingleton("org.springframework.context.annotation.internalConfigurationBeanNameGenerator", this.beanNameGenerator);
        }
        //是否指定類加載器
        if (this.resourceLoader != null) {
            if (context instanceof GenericApplicationContext) {
                ((GenericApplicationContext)context).setResourceLoader(this.resourceLoader);
            }

            if (context instanceof DefaultResourceLoader) {
                ((DefaultResourceLoader)context).setClassLoader(this.resourceLoader.getClassLoader());
            }
        }
        
        //是否添加數據轉換器 
        //在初始化環境對象的時候也有用到,這里可以直接通過 context.getEnvironment().getConversionService()獲取到
        if (this.addConversionService) {
            context.getBeanFactory().setConversionService(ApplicationConversionService.getSharedInstance());
        }
    }

1.2 applyInitializers

完善與ApplicationContextInitializer接口相關的對象屬性。這些對象在this.initializers中,早在SpringApplication初始化的時候就已經加載。通過已經初始化好的上下文對相關類進行完善。調用接口的initialize方法。

1.3 load

源碼:

	protected void load(ApplicationContext context, Object[] sources) {
		if (logger.isDebugEnabled()) {
			logger.debug("Loading source " + StringUtils.arrayToCommaDelimitedString(sources));
		}
		//構建一個bean定義的加載器
		BeanDefinitionLoader loader = createBeanDefinitionLoader(getBeanDefinitionRegistry(context), sources);
		if (this.beanNameGenerator != null) {
			loader.setBeanNameGenerator(this.beanNameGenerator);
		}
		if (this.resourceLoader != null) {
			loader.setResourceLoader(this.resourceLoader);
		}
		if (this.environment != null) {
			loader.setEnvironment(this.environment);
		}
		//將資源加載成bean
		loader.load();
	}
	
	void load() {
		for (Object source : this.sources) {
			load(source);
		}
	}
    //按資源類型分別進行加載,
	private void load(Object source) {
		Assert.notNull(source, "Source must not be null");
		if (source instanceof Class<?>) {
			load((Class<?>) source);
			return;
		}
		if (source instanceof Resource) {
			load((Resource) source);
			return;
		}
		if (source instanceof Package) {
			load((Package) source);
			return;
		}
		if (source instanceof CharSequence) {
			load((CharSequence) source);
			return;
		}
		throw new IllegalArgumentException("Invalid source type " + source.getClass());
	}

主要加載了SpringApplication內初始化的資源,包括我們的啟動類xxApplication將會被注冊成bean。

小結

繼上下文創建完成后,又對其進行了一些屬性的初始化,并加載了一些配置資源。

“springboot如何完善上下文加載器”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

高唐县| 康马县| 留坝县| 皋兰县| 筠连县| 乌鲁木齐县| 黄浦区| 南和县| 淄博市| 北宁市| 三穗县| 夹江县| 建德市| 桃园市| 舒城县| 泸水县| 建始县| 唐海县| 罗山县| 鄯善县| 龙井市| 称多县| 大同县| 大田县| 宜黄县| 什邡市| 哈巴河县| 仁寿县| 宜兰县| 阿克陶县| 兴隆县| 沙河市| 涞水县| 都兰县| 宝鸡市| 平安县| 比如县| 黄冈市| 枞阳县| 铁岭市| 天峨县|