美文网首页
Springboot 学习02--把我们的代码片段安排到合适的地

Springboot 学习02--把我们的代码片段安排到合适的地

作者: 陆小飞 | 来源:发表于2019-10-30 21:54 被阅读0次

回顾

上一节我们看到了最初的使用Springboot和不用的时候有什么区别,怎么开始用,这一节我们看下后续的run中我们可以做什么,我们开发怎么去干扰。也就是怎么在里面合适的为止开始写我们自己的代码片段,这些片段通过Springboot提供的框架连接起来,最后形成一个可运行的完整的功能。

Springboot扩展

我们了解到SpringApplication.run()既开始一个Springboot的运行,开始的时候会检查我们META-INF/spring.factories的文件,如果有这个文件,则加载。这个文件可以配置一系列定制化的内容。比如在Spring运行的时候分好几个阶段,如SpringContext 初始化前,进入到初始化,结束前操作,和结束后的操作等等,由于这些操作都被封装在了Springboot内部,自成一体。但是很多时候用户需要定制在某些特殊的时候做一些操作,需要有用户的自定义代码运行在某一阶段,这个时候这个文件配置的作用就出现了。
java早期有SPI机制,提供给用户定制化的开发。(具体内容见:https://blog.csdn.net/lldouble/article/details/80690446

org.springframework.boot.SpringApplicationRunListener=cn.miludeer.init.EnvironmentInitializer

spring.factories的文件内容如上,key=value1,value2 的方式进行配置。启动的时候会取出所有的内容进行初始化处理。

尝试写点代码试试效果

实现cn.miludeer.init.EnvironmentInitializer

public class EnvironmentInitializer implements SpringApplicationRunListener {

    public EnvironmentInitializer(SpringApplication application, String[] args) {
    }

    @Override
    public void starting() {
        System.out.println("starting...");
    }

    @Override
    public void environmentPrepared(ConfigurableEnvironment environment) {
        System.out.println("environmentPrepared...");
    }

    @Override
    public void contextPrepared(ConfigurableApplicationContext context) {
        System.out.println("contextPrepared...");
    }

    @Override
    public void contextLoaded(ConfigurableApplicationContext context) {
        System.out.println("contextLoaded...");
    }

    @Override
    public void started(ConfigurableApplicationContext context) {
        System.out.println("started...");
    }

    @Override
    public void running(ConfigurableApplicationContext context) {
        System.out.println("running...");
    }

    @Override
    public void failed(ConfigurableApplicationContext context, Throwable exception) {
        System.out.println("failed...");
    }

运行结果:

main starting...
starting...
environmentPrepared...

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.0.4.RELEASE)

contextPrepared...
2019-10-30 20:59:11.863  INFO 5487 --- [           main] cn.miludeer.deer.ApplicationMain         : Starting ApplicationMain on MacBook-Pro-9.local with PID 5487 (/Users/mac/code/cnmiludeer/target/classes started by mac in /Users/mac/code/cnmiludeer)
2019-10-30 20:59:11.866  INFO 5487 --- [           main] cn.miludeer.deer.ApplicationMain         : No active profile set, falling back to default profiles: default
contextLoaded...
2019-10-30 20:59:11.879  INFO 5487 --- [           main] s.c.a.AnnotationConfigApplicationContext : Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@3d3fcdb0: startup date [Wed Oct 30 20:59:11 CST 2019]; root of context hierarchy
2019-10-30 20:59:12.003  INFO 5487 --- [           main] cn.miludeer.deer.ApplicationMain         : Started ApplicationMain in 0.997 seconds (JVM running for 1.562)
started...
running...
main started!!!
2019-10-30 20:59:12.006  INFO 5487 --- [       Thread-1] s.c.a.AnnotationConfigApplicationContext : Closing org.springframework.context.annotation.AnnotationConfigApplicationContext@3d3fcdb0: startup date [Wed Oct 30 20:59:11 CST 2019]; root of context hierarchy

Process finished with exit code 0

可以看到不同的阶段答应出来不同的内容,这就方面了我们在框架的各个部分插入不同的内容实现不同阶段的执行。(主要是在不同阶段的初始化工作等)

其他几个钩子

org.springframework.boot.SpringApplicationRunListener 初始化的各个阶段
org.springframework.boot.env.EnvironmentPostProcessor 获取环境参数(配置)
org.springframework.boot.autoconfigure.AutoConfigurationImportFilter 禁用某些自动化配置
org.springframework.context.ApplicationListener 注册本地事件

总结

Springboot可以将某个模型或某一类的抽象开发逻辑写完(骨架)。用户做开发可以在里面添加自己的逻辑(血肉)。我们要做的就是找对合适的地方,插上我们的代码就可以。

相关文章

  • Springboot 学习02--把我们的代码片段安排到合适的地

    回顾 上一节我们看到了最初的使用Springboot和不用的时候有什么区别,怎么开始用,这一节我们看下后续的run...

  • idea下SpringBoot搭建及部分习惯

    本文章仅作为个人笔记 SpringBoot官网(了解学习SpringBoot相关) SpringBoot在线代码生...

  • PHP冒泡排序

    原理:从下往上冒泡,把小的数排到上面 代码实现

  • 分布式锁

    SpringBoot 分布式锁 模拟秒杀代码片段 控制器 service dao 首先不是使用锁的情况 JMete...

  • VScode插件推荐(全面)

    工欲善其事必先利其器,我们来学习vscode插件吧~ 一、代码片段类插件 英文叫做 Snippets,就是把常见的...

  • 2.1 函数的作用与定义

    1、什么是函数 我们可以把函数看做为代码的逻辑单元,我们把能够完成特定功能的代码片段组织成逻辑单元,方便反复的调用...

  • PHP学习代码片段

    反射和动态调用

  • Xcode代码块

    代码片段 Xcode的代码片段(Code Snippets)创建自定义的代码片段,当你重用这些代码片段时,会给你带...

  • 整洁,小巧的代码--- 代码复用

    MVC 在MVC设计模式中,我们应该把代码放置在合适、正确的位置。 关于视图的代码,比如label,button等...

  • 在vscode中使用代码片段

    #为何使用? 快速地简单得输入重复的代码 #触发提示? #创建片段? #绑快捷键? #共享片段? #我的片段? m...

网友评论

      本文标题:Springboot 学习02--把我们的代码片段安排到合适的地

      本文链接:https://www.haomeiwen.com/subject/esyavctx.html