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

网站的花费商城网站建设案例

网站的花费,商城网站建设案例,精神文明网站建设内容,上海 网站工作室由于SpringBoot和Spring、SpringMVC重合度较高#xff0c;更多详细内容请参考https://blog.csdn.net/weixin_73195042/article/details/144632385 本文着重于SpringBoot的启动流程 文章目录 概念启动流程底层分析构造SpringApplication对象run(String... args)方法SpringBoo…由于SpringBoot和Spring、SpringMVC重合度较高更多详细内容请参考https://blog.csdn.net/weixin_73195042/article/details/144632385 本文着重于SpringBoot的启动流程 文章目录 概念启动流程底层分析构造SpringApplication对象run(String... args)方法SpringBoot完整的配置优先级 常用条件注解 概念 Spring Boot是一个基于Spring的套件它帮我们预组装了Spring的一系列组件以便以尽可能少的代码和配置来开发基于Spring的Java应用程序。 SpringBoot内置了多种Servlet容器如Tomcat、Jetty和Undertow开发者可以根据需要选择合适的Servlet容器。内嵌Servlet容器使得开发者无需额外配置和部署应用服务器大大简化了应用程序的部署过程。 Spring Boot有四大神器分别是auto-configuration、starters、cli、actuator 执行器Actuator的定义 执行器是一个制造业术语指的是用于移动或控制东西的一个机械装置一个很小的改变就能让执行器产生大量的运动。 An actuator is a manufacturing term that refers to a mechanical device for moving or controlling something. Actuators can generate a large amount of motion from a small change. 端点(Endpoints) 执行器端点endpoints可用于监控应用及与应用进行交互Spring Boot包含很多内置的端点你也可以添加自己的。例如health端点提供了应用的基本健康信息。 每个端点都可以启用或禁用。这控制着端点是否被创建并且它的bean是否存在于应用程序上下文中。要远程访问端点还必须通过JMX或HTTP进行暴露,大部分应用选择HTTP端点的ID映射到一个带/actuator前缀的URL。 启动流程底层分析 构造SpringApplication对象 1、推测web应用类型 如果项目依赖中存在org.springframework.web.reactive.DispatcherHandler并且不存在org.springframework.web.servlet.DispatcherServlet那么应用类型为WebApplicationType.REACTIVE如果项目依赖中不存在org.springframework.web.reactive.DispatcherHandler**也不存在org.springframework.web.servlet.DispatcherServlet那么应用类型为**WebApplicationType.NONE否则应用类型为WebApplicationType.SERVLET 2、获取BootstrapRegistryInitializer对象 从META-INF/spring.factories中读取key为BootstrapRegistryInitializer类型的扩展点并实例化出对应扩展点对象BootstrapRegistryInitializer的作用是可以初始化BootstrapRegistry上面的DefaultBootstrapContext对象就是一个BootstrapRegistry可以用来注册一些对象这些对象可以用在从SpringBoot启动到Spring容器初始化完成的过程中我的理解没有Spring容器之前就利用BootstrapRegistry来共享一些对象有了Spring容器之后就利用Spring容器来共享一些对象 3、获取ApplicationContextInitializer对象 从META-INF/spring.factories中读取key为ApplicationContextInitializer类型的扩展点并实例化出对应扩展点对象顾名思义ApplicationContextInitializer是用来初始化Spring容器ApplicationContext对象的比如可以利用ApplicationContextInitializer来向Spring容器中添加ApplicationListener 4、获取ApplicationListener对象 从META-INF/spring.factories中读取key为ApplicationListener类型的扩展点并实例化出对应扩展点对象ApplicationListener是Spring中的监听器并不是SpringBoot中的新概念不多解释了 5、推测出Main类main()方法所在的类 没什么具体的作用逻辑是根据当前线程的调用栈来判断main()方法在哪个类哪个类就是Main类 run(String… args)方法 创建DefaultBootstrapContext对象利用BootstrapRegistryInitializer初始化DefaultBootstrapContext对象获取SpringApplicationRunListeners 这三个步骤没什么特殊的 5、触发SpringApplicationRunListener的starting() 默认情况下SpringBoot提供了一个EventPublishingRunListener它实现了SpringApplicationRunListener接口默认情况下会利用EventPublishingRunListener发布一个ApplicationContextInitializedEvent事件程序员可以通过定义ApplicationListener来消费这个事件 6、创建Environment对象 Environment对象表示环境变量该对象内部主要包含了: 当前操作系统的环境变量JVM的一些配置信息-D方式所配置的JVM环境变量 7、触发SpringApplicationRunListener的environmentPrepared() 默认情况下会利用EventPublishingRunListener发布一个ApplicationEnvironmentPreparedEvent事件程序员可以通过定义ApplicationListener来消费这个事件比如默认情况下会有一个EnvironmentPostProcessorApplicationListener来消费这个事件而这个ApplicationListener接收到这个事件之后就会解析application.properties、application.yml文件并添加到Environment对象中去。 8、打印Banner 没什么特殊的打印spring。 9、创建Spring容器对象ApplicationContext 会利用ApplicationContextFactory.DEFAULT根据应用类型创建对应的Spring容器。 ApplicationContextFactory.DEFAULT为 ApplicationContextFactory DEFAULT (webApplicationType) - {try {switch (webApplicationType) {case SERVLET:return new AnnotationConfigServletWebServerApplicationContext();case REACTIVE:return new AnnotationConfigReactiveWebServerApplicationContext();default:return new AnnotationConfigApplicationContext();}}catch (Exception ex) {throw new IllegalStateException(Unable create a default ApplicationContext instance, you may need a custom ApplicationContextFactory, ex);} };所以 应用类型为SERVLET则对应AnnotationConfigServletWebServerApplicationContext应用类型为REACTIVE则对应AnnotationConfigReactiveWebServerApplicationContext应用类型为普通类型则对应AnnotationConfigApplicationContext 10、利用ApplicationContextInitializer初始化Spring容器对象 默认情况下SpringBoot提供了多个ApplicationContextInitializer其中比较重要的有ConditionEvaluationReportLoggingListener别看到它的名字叫XXXListener但是它确实是实现了ApplicationContextInitializer接口的。 在它的initialize()方法中会 将Spring容器赋值给它的applicationContext属性并且往Spring容器中添加一个ConditionEvaluationReportListenerConditionEvaluationReportLoggingListener的内部类它是一个ApplicationListener并生成一个ConditionEvaluationReport对象赋值给它的report属性 ConditionEvaluationReportListener会负责接收ContextRefreshedEvent事件也就是Spring容器一旦启动完毕就会触发ContextRefreshedEventConditionEvaluationReportListener就会打印自动配置类的条件评估报告。 11、触发SpringApplicationRunListener的contextPrepared() 默认情况下会利用EventPublishingRunListener发布一个ApplicationContextInitializedEvent事件默认情况下暂时没有ApplicationListener消费了这个事件 12、调用DefaultBootstrapContext对象的close() 没什么特殊的忽略 13、将启动类作为配置类注册到Spring容器中load()方法 将SpringApplication.run(MyApplication.class);中传入进来的类比如MyApplication.class作为Spring容器的配置类 14、 触发SpringApplicationRunListener的contextLoaded() 默认情况下会利用EventPublishingRunListener发布一个ApplicationPreparedEvent事件 15、刷新Spring容器 调用Spring容器的refresh()方法结合第9、13步相当于执行了这样一个流程 AnnotationConfigApplicationContext applicationContext new AnnotationConfigApplicationContext();applicationContext .register(MyApplication.class)applicationContext .refresh() 16、触发SpringApplicationRunListener的started() 发布ApplicationStartedEvent事件和AvailabilityChangeEvent事件AvailabilityChangeEvent事件表示状态变更状态变更后的状态为LivenessState.CORRECT LivenessState枚举有两个值 CORRECT表示当前应用正常运行中BROKEN表示当前应用还在运行但是内部出现问题暂时还没发现哪里用到了 17、调用ApplicationRunner和CommandLineRunner 获取Spring容器中的ApplicationRunner类型的Bean获取Spring容器中的CommandLineRunner类型的Bean执行它们的run() 18、触发SpringApplicationRunListener的ready() 发布ApplicationReadyEvent事件和AvailabilityChangeEvent事件AvailabilityChangeEvent事件表示状态变更状态变更后的状态为ReadinessState.ACCEPTING_TRAFFIC ReadinessState枚举有两个值 ACCEPTING_TRAFFIC表示当前应用准备接收请求REFUSING_TRAFFIC表示当前应用拒绝接收请求比如Tomcat关闭时就会发布AvailabilityChangeEvent事件并且状态为REFUSING_TRAFFIC 19、上述过程抛异常了就触发SpringApplicationRunListener的failed() 发布ApplicationFailedEvent事件 SpringBoot完整的配置优先级 https://docs.spring.io/spring-boot/docs/current/reference/html/features.html#features.external-config 优先级由高到低 Default properties (specified by setting SpringApplication.setDefaultProperties).PropertySource annotations on your Configuration classes. Please note that such property sources are not added to the Environment until the application context is being refreshed. This is too late to configure certain properties such as logging.* and spring.main.* which are read before refresh begins.Config data (such as application.properties files).A RandomValuePropertySource that has properties only in random.*.OS environment variables.Java System properties (System.getProperties()).JNDI attributes from java:comp/env. 不管它ServletContext init parameters.ServletConfig init parameters.Properties from SPRING_APPLICATION_JSON (inline JSON embedded in an environment variable or system property).Command line arguments.properties attribute on your tests. Available on SpringBootTest and the test annotations for testing a particular slice of your application.TestPropertySource annotations on your tests.Devtools global settings properties in the $HOME/.config/spring-boot directory when devtools is active. 常用条件注解 SpringBoot中的常用条件注解有 ConditionalOnBean是否存在某个某类或某个名字的BeanConditionalOnMissingBean是否缺失某个某类或某个名字的BeanConditionalOnSingleCandidate是否符合指定类型的Bean只有一个ConditionalOnClass是否存在某个类ConditionalOnMissingClass是否缺失某个类ConditionalOnExpression指定的表达式返回的是true还是falseConditionalOnJava判断Java版本ConditionalOnWebApplication当前应用是不是一个Web应用ConditionalOnNotWebApplication当前应用不是一个Web应用ConditionalOnPropertyEnvironment中是否存在某个属性 当然我们也可以利用Conditional来自定义条件注解。 条件注解是可以写在类上和方法上的如果某个条件注解写在了自动配置类上那该自动配置类会不会生效就要看当前条件能不能符合或者条件注解写在某个Bean修饰的方法上那这个Bean生不生效就看当前条件符不符合。 具体原理是 Spring在解析某个自动配置类时会先检查该自动配置类上是否有条件注解如果有则进一步判断该条件注解所指定的条件当前能不能满足如果满足了则继续解析该配置类如果不满足则不进行解析了也就是配置类所定义的Bean都得不到解析也就是相当于没有这些Bean了。同理Spring在解析某个Bean的方法时也会先判断方法上是否有条件注解然后进行解析如果不满足条件则该Bean不会生效 我们可以发现SpringBoot的自动配置实际上就是SpringBoot的源码中预先写好了一些配置类预先定义好了一些Bean我们在用SpringBoot时这些配置类就已经在我们项目的依赖中了而这些自动配置类或自动配置Bean到底生不生效就看具体所指定的条件了。 SpringBoot更多细致内容可以参考雷老师的笔记https://www.yuque.com/leifengyang/springboot3/shuoz4lfeihxno04
http://www.hkea.cn/news/14318583/

相关文章:

  • 惠来建设局网站坑梓网站建设信息
  • 网站流量查询 优帮云石佛营网站建设
  • 方太官方网站的建设情况潮州市工程建设网站
  • 北京建设公司网站建设暴雪战网客户端下载
  • 广州商城网站建设地址重庆企业网站建设报价
  • 网络设置网站做数学的网站
  • 班级网页网站建设百度seo站长
  • 网站404页面下载如何选择大良网站建设
  • 长沙雨花区建设局网站无锡所有网站设计制作
  • 利川市网站建设Wordpress加入天气
  • 蚌埠企业网站建设集美那里有教网站建设
  • 网站seo技术wordpress链接替换
  • 厦门市住房和建设局网站科技小制作视频
  • 国外自适应网站模版给网络公司起名字大全
  • 珠海网站建设王道下拉惠网站用户权限
  • 伊犁网站建设公司为什么wordpress后台写文章不一样
  • 深圳宝安网站建设工网站架设建设
  • 旅游网站开发目的和目标优书网小说
  • 长宁做网站公司拥有服务器后如何做网站
  • 沭阳网站建设方案建网站 发信息 做推广
  • 谷歌怎么做公司网站如何做vip影视网站
  • 杭州做网站哪个公司好天津网站定制
  • 外贸网站模板 外贸网站制作网上购物网站开发报价
  • 企业网站seo哪里好wordpress 数字不连续
  • 网站建设时间进度表ai效果图网站
  • 海口网站建设推广pre_get_posts wordpress
  • 用别人网站做app的危害免费建设网站
  • 基于php的网站开发设计本地网站更新不了 vps登陆可以
  • 网站建设seo优化推广展陈公司排名
  • 百度网站域名费一年多少钱上海市建设工程安全协会网站