ホームページ >Java >&#&チュートリアル >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 の初期化の早い段階でロードされています。初期化されたコンテキストを通じて関連クラスを改善します。インターフェースの初期化メソッドを呼び出します。
ソースコード:
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()); }
主に、Bean として登録されるスタートアップ クラス xxApplication を含む、SpringApplication で初期化されたリソースを読み込みます。
以上がspringboot がコンテキスト ローダーを改善する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。