当前位置: 首页 > news >正文

做网站的天空网兰州网站的优化

做网站的天空网,兰州网站的优化,微信社区官网,军事网报名入口简介 其实spring启动步骤中最早可以进行扩展的是实现ApplicationContextInitializer接口。来看看这个接口的注释。 package org.springframework.context;/*** Callback interface for initializing a Spring {link ConfigurableApplicationContext}* prior to being {linkpl…简介 其实spring启动步骤中最早可以进行扩展的是实现ApplicationContextInitializer接口。来看看这个接口的注释。 package org.springframework.context;/*** Callback interface for initializing a Spring {link ConfigurableApplicationContext}* prior to being {linkplain ConfigurableApplicationContext#refresh() refreshed}.** pTypically used within web applications that require some programmatic initialization* of the application context. For example, registering property sources or activating* profiles against the {linkplain ConfigurableApplicationContext#getEnvironment()* contexts environment}. See {code ContextLoader} and {code FrameworkServlet} support* for declaring a contextInitializerClasses context-param and init-param, respectively.** p{code ApplicationContextInitializer} processors are encouraged to detect* whether Springs {link org.springframework.core.Ordered Ordered} interface has been* implemented or if the {link org.springframework.core.annotation.Order Order}* annotation is present and to sort instances accordingly if so prior to invocation.** author Chris Beams* since 3.1* param C the application context type* see org.springframework.web.context.ContextLoader#customizeContext* see org.springframework.web.context.ContextLoader#CONTEXT_INITIALIZER_CLASSES_PARAM* see org.springframework.web.servlet.FrameworkServlet#setContextInitializerClasses* see org.springframework.web.servlet.FrameworkServlet#applyInitializers*/ FunctionalInterface public interface ApplicationContextInitializerC extends ConfigurableApplicationContext {/*** Initialize the given application context.* param applicationContext the application to configure*/void initialize(C applicationContext);}简要的说明一下有这么几点: 实现这个接口之后它的initialize方法会在容器ConfigurableApplicationContext刷新之前触发。它通常用于在容器初始化之前进行一些程序上的操作比如说注册一些环境变量或者读取一些配置文件。它可以使用Order指定优先级 实现方式 它有三种实现方式: 通过SPI机制实现在resources/META-INF/spring.factories中定义如下内容: org.springframework.context.ApplicationContextInitializercom.alone.spring.aop.demo.config.ContextInitializerTest /*** spring扩展点 ApplicationContextInitializer*/ Slf4j public class ContextInitializerTest implements ApplicationContextInitializer {Overridepublic void initialize(ConfigurableApplicationContext applicationContext) {log.info(ContextInitializerTest 开始加载);ConfigurableEnvironment environment applicationContext.getEnvironment();MapString, Object initMap new HashMap();initMap.put(20231116, This is init);MapPropertySource propertySource new MapPropertySource(ContextInitializerTest, initMap);environment.getPropertySources().addLast(propertySource);log.info(ContextInitializerTest 加载结束);} }在application.yml中定义如下内容: context:initializer:classes: com.alone.spring.aop.demo.config.YmlApplicationContextInitializerSlf4j public class YmlApplicationContextInitializer implements ApplicationContextInitializer {Overridepublic void initialize(ConfigurableApplicationContext applicationContext) {log.info(这是yml的ApplicationContextInitializer);ConfigurableEnvironment environment applicationContext.getEnvironment();MapString, Object initMap new HashMap();initMap.put(20231116, YmlApplicationContextInitializer);MapPropertySource propertySource new MapPropertySource(ContextInitializerTest, initMap);environment.getPropertySources().addLast(propertySource);log.info(YmlApplicationContextInitializer 加载结束);} }在启动类中进行注册: public static void main(String[] args) {SpringApplication springApplication new SpringApplication(SpringbootApplication.class);springApplication.addInitializers(new MainFlagApplicationContextInitializer());springApplication.run(); }Component Slf4j public class MainFlagApplicationContextInitializer implements ApplicationContextInitializer {Overridepublic void initialize(ConfigurableApplicationContext applicationContext) {log.info(这是main的ApplicationContextInitializer);ConfigurableEnvironment environment applicationContext.getEnvironment();MapString, Object initMap new HashMap();initMap.put(20231116, MainFlagApplicationContextInitializer);MapPropertySource propertySource new MapPropertySource(ContextInitializerTest, initMap);environment.getPropertySources().addLast(propertySource);log.info(MainFlagApplicationContextInitializer 加载结束);} }三者的加载顺序是: application.yml spring.factories 启动类 源码分析 从启动类的new SpringApplication(SpringbootApplication.class)开始分析: public SpringApplication(ResourceLoader resourceLoader, Class?... primarySources) {this.resourceLoader resourceLoader;Assert.notNull(primarySources, PrimarySources must not be null);this.primarySources new LinkedHashSet(Arrays.asList(primarySources));this.webApplicationType WebApplicationType.deduceFromClasspath();this.bootstrapRegistryInitializers new ArrayList(getSpringFactoriesInstances(BootstrapRegistryInitializer.class));setInitializers((Collection) getSpringFactoriesInstances(ApplicationContextInitializer.class));setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class));this.mainApplicationClass deduceMainApplicationClass(); }看到上面第8行源码266行中出现了ApplicationContextInitializer.class猜想它肯定是在读取相关的配置跟进去发现出现了下面这行。 这里是读取了spring.factories中的内容但看它的结果发现不止我们自定义的类一个说明springboot内置了一些ApplicationContextInitializer后续我们再看它们具体的作用这里先截图列出按下不表。 然后沿如下的调用栈可以找到initializer.initialize(context);这一行调用ApplicationContextInitializer的语句。 ● springApplication.run() ● run:306, SpringApplication (org.springframework.boot) ● prepareContext:383, SpringApplication (org.springframework.boot) ● applyInitializers:614, SpringApplication (org.springframework.boot) 框起来的方法会对所有的initializer进行排序排序后的结果见左边。 在执行到DelegatingApplicationContextInitializer时会去读取环境中的context.initializer.classes也就是application.yml中配置的内容执行。所以会先执行yml配置的initializer. 以上总结一下是这样的: 大致调用的流程图是: 系统内置初始化类 最后我们来看看上面提到的系统内置的初始化类都有些什么作用。 SharedMetadataReaderFactoryContextInitializer Override public void initialize(ConfigurableApplicationContext applicationContext) {BeanFactoryPostProcessor postProcessor new CachingMetadataReaderFactoryPostProcessor(applicationContext);applicationContext.addBeanFactoryPostProcessor(postProcessor); }初始化了一个CachingMetadataReaderFactoryPostProcessor至容器中 DelegatingApplicationContextInitializer Override public void initialize(ConfigurableApplicationContext context) {ConfigurableEnvironment environment context.getEnvironment();ListClass? initializerClasses getInitializerClasses(environment);if (!initializerClasses.isEmpty()) {applyInitializerClasses(context, initializerClasses);} }执行context.initializer.classes配置的initializer。 ContextIdApplicationContextInitializer Override public void initialize(ConfigurableApplicationContext applicationContext) {ContextId contextId getContextId(applicationContext);applicationContext.setId(contextId.getId());applicationContext.getBeanFactory().registerSingleton(ContextId.class.getName(), contextId); }private ContextId getContextId(ConfigurableApplicationContext applicationContext) {ApplicationContext parent applicationContext.getParent();if (parent ! null parent.containsBean(ContextId.class.getName())) {return parent.getBean(ContextId.class).createChildId();}return new ContextId(getApplicationId(applicationContext.getEnvironment())); }private String getApplicationId(ConfigurableEnvironment environment) {String name environment.getProperty(spring.application.name);return StringUtils.hasText(name) ? name : application; }设置容器的id值取自spring.application.name配置默认是application ConditionEvaluationReportLoggingListener Override public void initialize(ConfigurableApplicationContext applicationContext) {this.applicationContext applicationContext;applicationContext.addApplicationListener(new ConditionEvaluationReportListener());if (applicationContext instanceof GenericApplicationContext) {// Get the report early in case the context fails to loadthis.report ConditionEvaluationReport.get(this.applicationContext.getBeanFactory());} }注册了一个ConditionEvaluationReportListener RestartScopeInitializer Override public void initialize(ConfigurableApplicationContext applicationContext) {applicationContext.getBeanFactory().registerScope(restart, new RestartScope()); }自动重启相关。 ConfigurationWarningsApplicationContextInitializer Override public void initialize(ConfigurableApplicationContext context) {context.addBeanFactoryPostProcessor(new ConfigurationWarningsPostProcessor(getChecks())); }初始化一个ConfigurationWarningsPostProcessor用于记录公共的容器配置错误信息。 RSocketPortInfoApplicationContextInitializer Override public void initialize(ConfigurableApplicationContext applicationContext) {applicationContext.addApplicationListener(new Listener(applicationContext)); }增加了一个监听器用于监听RSockerServer的端口是否正常。 ServerPortInfoApplicationContextInitializer /*** {link ApplicationContextInitializer} that sets {link Environment} properties for the* ports that {link WebServer} servers are actually listening on. The property* {literal local.server.port} can be injected directly into tests using* {link Value Value} or obtained via the {link Environment}.* p* If the {link WebServerInitializedEvent} has a* {link WebServerApplicationContext#getServerNamespace() server namespace} , it will be* used to construct the property name. For example, the management actuator context* will have the property name {literal local.management.port}.* p* Properties are automatically propagated up to any parent context.** author Dave Syer* author Phillip Webb* since 2.0.0*/Override public void initialize(ConfigurableApplicationContext applicationContext) {applicationContext.addApplicationListener(this); }向容器中增加一个监听器用于检测WebServer的端口是否正常监听。 参考资料 SpringBoot系统初始化器使用及源码解析ApplicationContextInitializer跟我一起阅读SpringBoot源码九——初始化执行器Springboot扩展点之ApplicationContextInitializer
http://www.dnsts.com.cn/news/52741.html

相关文章:

  • 长沙市网站建设公司代理商杭州高端设计网站建设
  • 网站虚拟主机管理北京建网站公司哪家便宜
  • 网站前台首页无法显示开发公众号平台
  • 芜湖哪家公司做网站不错海南网站建设
  • 网站首页的导航栏手机网站开发还是调用
  • 联网站wap网站建设课程要写代码吗
  • 网站导航条模板18款禁用观看黄入口
  • 企业网站建设技巧网站图片引导页怎么做
  • 可信网站认证的区别高端室内设计
  • 招标网站有哪些免费建公司网站的攻略
  • 益阳网站建设企业视频制作软件免费版下载
  • 做酒店网站的公司男女做羞羞的事视频网站
  • 网站后台管理 源码表白网站是怎么做的
  • 网站首页怎么设计index百度指数
  • 如何自建网站 卖东西官网首页制作报价
  • 建设部网站 技术规范应用商店官方下载
  • 一个网站建设域名的构思上海市工程建设信息网
  • 深圳市建设交易网站如何设计一个简洁的logo
  • 许昌企业网站建设公司雷州网站建设公司
  • iis部署网站项目谷歌seo怎么提高网站权重
  • 宜昌网站制作公司亿腾北京哪个网站建设最好
  • 阜阳做网站的网络公司专业群建设网站
  • 小型的企业网站中国电子工程师网
  • 毕业设计做网站答辩凡科网站产品导航怎么做
  • 做网站上的在线支付怎么做中国机械工业网
  • 网站建设程序做哪些网络规划设计师资料
  • 深圳专业网站设计公司地址北京做网站好的
  • 产品展示网站源码短视频网站平台怎么做的
  • 做网站要有策划么网站做加qq群链接地址
  • 北京网站建设公司报价外贸软件