您好,登錄后才能下訂單哦!
本篇內容介紹了“springboot如何完善上下文加載器”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
源碼:
``` 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); } ```
老樣子進行逐個分析。但看這個方法并不復雜,整體上對上下文和工廠類進行配置的完善。
源碼:
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()); } }
完善與ApplicationContextInitializer接口相關的對象屬性。這些對象在this.initializers中,早在SpringApplication初始化的時候就已經加載。通過已經初始化好的上下文對相關類進行完善。調用接口的initialize方法。
源碼:
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如何完善上下文加載器”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。