image.png

5.1 启动原理

  1. public static void main(String[] args) {
  2. SpringApplication.run(xxx.class, args); //xxx.class:主配置类,(可以传多个)
  3. }

5.1.1 从 run 方法开始,先创建 SpringApplication,再调用 run 方法

  1. /**
  2. * ConfigurableApplicationContext(可配置的应用程序上下文)
  3. */
  4. public static ConfigurableApplicationContext run(Class<?> primarySource, String... args) {
  5. return run(new Class[]{primarySource}, args);
  6. }
  7. public static ConfigurableApplicationContext run(Class<?>[] primarySources, String[] args) {
  8. return (new SpringApplication(primarySources)).run(args);
  9. }

5.1.2 创建 SpringApplication

  1. new SpringApplication(primarySources) //primarySources:主配置类
  1. public SpringApplication(Class<?>... primarySources) {
  2. this((ResourceLoader) null, primarySources);//调用下面构造方法
  3. }
  4. public SpringApplication(ResourceLoader resourceLoader, Class<?>... primarySources) {
  5. this.sources = new LinkedHashSet();
  6. this.bannerMode = Mode.CONSOLE;
  7. this.logStartupInfo = true;
  8. this.addCommandLineProperties = true;
  9. this.addConversionService = true;
  10. this.headless = true;
  11. this.registerShutdownHook = true;
  12. this.additionalProfiles = new HashSet();
  13. this.isCustomEnvironment = false;
  14. this.lazyInitialization = false;
  15. this.resourceLoader = resourceLoader;
  16. Assert.notNull(primarySources, "PrimarySources must not be null");
  17. //保存主配置类
  18. this.primarySources = new LinkedHashSet(Arrays.asList(primarySources));
  19. //获取当前应用的类型,是不是web应用,见1
  20. this.webApplicationType = WebApplicationType.deduceFromClasspath();
  21. //从类路径下找到META‐INF/spring.factories配置的所有ApplicationContextInitializer;然后保存起来,见2
  22. this.setInitializers(this.getSpringFactoriesInstances(ApplicationContextInitializer.class));
  23. //从类路径下找到META‐INF/spring.ApplicationListener;然后保存起来,原理同上
  24. this.setListeners(this.getSpringFactoriesInstances(ApplicationListener.class));
  25. //从多个配置类中找到有main方法的主配置类,见下图(在调run方法的时候是可以传递多个配置类的)
  26. this.mainApplicationClass = this.deduceMainApplicationClass();
  27. //执行完毕,SpringApplication对象就创建出来了,返回到5.1.1处,调用SpringApplication对象的run方法,到5.1.3
  28. }
  1. 判断是不是 web 应用

    1. static WebApplicationType deduceFromClasspath() {
    2. if (ClassUtils.isPresent("org.springframework.web.reactive.DispatcherHandler", (ClassLoader)null) && !ClassUtils.isPresent("org.springframework.web.servlet.DispatcherServlet", (ClassLoader)null) && !ClassUtils.isPresent("org.glassfish.jersey.servlet.ServletContainer", (ClassLoader)null)) {
    3. return REACTIVE;
    4. } else {
    5. String[] var0 = SERVLET_INDICATOR_CLASSES;
    6. int var1 = var0.length;
    7. for(int var2 = 0; var2 < var1; ++var2) {
    8. String className = var0[var2];
    9. if (!ClassUtils.isPresent(className, (ClassLoader)null)) {
    10. return NONE;
    11. }
    12. }
    13. return SERVLET;
    14. }
    15. }
  2. getSpringFactoriesInstances(ApplicationContextInitializer.class)

    private <T> Collection<T> getSpringFactoriesInstances(Class<T> type) {
        //调用下面重载方法,type:ApplicationContextInitializer.class
        return this.getSpringFactoriesInstances(type, new Class[0]);
    }
    private <T> Collection<T> getSpringFactoriesInstances(Class<T> type, Class<?>[] parameterTypes, Object... args) {
        ClassLoader classLoader = this.getClassLoader();
        //获取key为ApplicationContextInitializer全类名的所有值,见下2.1
        Set<String> names = new LinkedHashSet(SpringFactoriesLoader.loadFactoryNames(type, classLoader));
        //根据拿到的类名集合,使用反射创建对象放到集合中返回 见 2.2
        List<T> instances = this.createSpringFactoriesInstances(type, parameterTypes, classLoader, args, names);
        AnnotationAwareOrderComparator.sort(instances);
        return instances; //返回到5.1.2 set
    }
    

    2.1 调用 SpringApplication 对象的 run 方法
    5. springboot 启动流程 - 图2
    2.2 createSpringFactoriesInstances

    private <T> List<T> createSpringFactoriesInstances(Class<T> type, Class<?>[] parameterTypes, ClassLoader classLoader, Object[] args, Set<String> names) {
    List<T> instances = new ArrayList(names.size());
    Iterator var7 = names.iterator();
    
    while(var7.hasNext()) {
        String name = (String)var7.next();
    
        try {
            Class<?> instanceClass = ClassUtils.forName(name, classLoader);
            Assert.isAssignable(type, instanceClass);
            Constructor<?> constructor = instanceClass.getDeclaredConstructor(parameterTypes);
            T instance = BeanUtils.instantiateClass(constructor, args);
            instances.add(instance);
        } catch (Throwable var12) {
            throw new IllegalArgumentException("Cannot instantiate " + type + " : " + name, var12);
        }
    }
    return instances;
    }
    

    5.1.3 调用 SpringApplication 对象的 run 方法

    image.png

  • 容器创建完成,返回 5.1.1 处,最后返回到启动类;

    public ConfigurableApplicationContext run(String... args) {
          StopWatch stopWatch = new StopWatch();
          stopWatch.start();
          //声明IOC容器
          ConfigurableApplicationContext context = null;
          Collection<SpringBootExceptionReporter> exceptionReporters = new ArrayList();
          this.configureHeadlessProperty();
          //从类路径下META‐INF/spring.factories获取SpringApplicationRunListeners,原理同2中获取ApplicationContextInitializer和ApplicationListener
          SpringApplicationRunListeners listeners = this.getRunListeners(args);
          //遍历上一步获取的所有SpringApplicationRunListener,调用其starting方法
          listeners.starting();
          Collection exceptionReporters;
          try {
              //封装命令行
              ApplicationArguments applicationArguments = new DefaultApplicationArguments(args);
              //准备环境,把上面获取到的listeners传过去,见3.1
              ConfigurableEnvironment environment = this.prepareEnvironment(listeners, applicationArguments);
              this.configureIgnoreBeanInfo(environment);
              //打印Banner,就是控制台那个Spring字符画
              Banner printedBanner = this.printBanner(environment);
              //根据当前环境利用反射创建IOC容器
              context = this.createApplicationContext();
          //从类路径下META‐INF/spring.factories获取SpringBootExceptionReporter,原理同2中获取ApplicationContextInitializer和ApplicationListener
              exceptionReporters = this.getSpringFactoriesInstances(SpringBootExceptionReporter.class, new Class[]{ConfigurableApplicationContext.class}, context);
              //准备IOC容器,见3.3
              this.prepareContext(context, environment, listeners, applicationArguments, printedBanner);
              //刷新IOC容器,可查看配置嵌入式Servlet容器原理 链接在3.4
              this.refreshContext(context);
              //这是一个空方法
              this.afterRefresh(context, applicationArguments);
              stopWatch.stop();
              if (this.logStartupInfo) {
                  (new StartupInfoLogger(this.mainApplicationClass)).logStarted(this.getApplicationLog(), stopWatch);
              }
              //调用所有SpringApplicationRunListener的started方法
              listeners.started(context);
              //见3.5 ,从ioc容器中获取所有的ApplicationRunner和CommandLineRunner进行回调ApplicationRunner先回调,CommandLineRunner再
              this.callRunners(context, applicationArguments);
          } catch (Throwable var10) {
              this.handleRunFailure(context, var10, exceptionReporters, listeners);
              throw new IllegalStateException(var10);
          }
          try {
              //调用所有SpringApplicationRunListener的running方法
              listeners.running(context);
              return context;
          } catch (Throwable var9) {
              this.handleRunFailure(context, var9, exceptionReporters, (SpringApplicationRunListeners)null);
              throw new IllegalStateException(var9);
          }
      }
    

    5.2 几个重要的事件回调机制

  • 配置在 META-INF/spring.factories

    • ApplicationContextInitializer
    • SpringApplicationRunListener
  • 存放在 ioc 容器中的组件

    • ApplicationRunner
    • CommandLineRunner

      5.2.1 案例

      5.2.1.1 代码编写

  • HelloApplicationContextInitializer ```java public class HelloApplicationContextInitializer implements ApplicationContextInitializer { @Override public void initialize(ConfigurableApplicationContext configurableApplicationContext) {

      System.out.println("HelloApplicationContextInitializer...initialize...");
    

    } }


- HelloSpringApplicationRunListener
```java
public class HelloSpringApplicationRunListener implements SpringApplicationRunListener {

    HelloSpringApplicationRunListener(SpringApplication application, String[] args){
    }

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

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

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

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

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

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

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

    @Component
    public class HelloApplicationRunner implements ApplicationRunner {
      @Override
      public void run(ApplicationArguments args) throws Exception {
          System.out.println("HelloApplicationRunner...run..." + args);
      }
    }
    
  • HelloCommandLineRunner

    @Component
    public class HelloCommandLineRunner implements CommandLineRunner {
      @Override
      public void run(String... args) throws Exception {
          System.out.println("HelloCommandLineRunner...run..." + Arrays.asList(args));
      }
    }
    

    5.2.1.2 配置文件

  • 在类路径 rsources 下创建 META-INF/spring.factories ```java org.springframework.context.ApplicationContextInitializer=\

      com.cyt.springboot.listener.HelloApplicationContextInitializer
    

org.springframework.boot.SpringApplicationRunListener=\ com.cyt.springboot.listener.HelloSpringApplicationRunListener

<a name="V9hNg"></a>
#### 5.2.1.3 运行结果
```java
"C:\Program Files\Java\jdk1.8.0_131\bin\java.exe" "-javaagent:D:\IDEA\IntelliJ IDEA Community Edition 2019.3\lib\idea_rt.jar=59043:D:\IDEA\IntelliJ IDEA Community Edition 2019.3\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_131\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\rt.jar;D:\IDEA\JavaCode\testSpringBoot\spring-boot-06-jpa\target\classes;C:\Users\陈玉婷\.m2\repository\org\springframework\boot\spring-boot-starter-data-jdbc\2.2.5.RELEASE\spring-boot-starter-data-jdbc-2.2.5.RELEASE.jar;C:\Users\陈玉婷\.m2\repository\org\springframework\boot\spring-boot-starter-jdbc\2.2.5.RELEASE\spring-boot-starter-jdbc-2.2.5.RELEASE.jar;C:\Users\陈玉婷\.m2\repository\com\zaxxer\HikariCP\3.4.2\HikariCP-3.4.2.jar;C:\Users\陈玉婷\.m2\repository\org\springframework\spring-jdbc\5.2.4.RELEASE\spring-jdbc-5.2.4.RELEASE.jar;C:\Users\陈玉婷\.m2\repository\org\springframework\data\spring-data-jdbc\1.1.5.RELEASE\spring-data-jdbc-1.1.5.RELEASE.jar;C:\Users\陈玉婷\.m2\repository\org\springframework\data\spring-data-relational\1.1.5.RELEASE\spring-data-relational-1.1.5.RELEASE.jar;C:\Users\陈玉婷\.m2\repository\org\springframework\data\spring-data-commons\2.2.5.RELEASE\spring-data-commons-2.2.5.RELEASE.jar;C:\Users\陈玉婷\.m2\repository\org\springframework\spring-tx\5.2.4.RELEASE\spring-tx-5.2.4.RELEASE.jar;C:\Users\陈玉婷\.m2\repository\org\springframework\spring-context\5.2.4.RELEASE\spring-context-5.2.4.RELEASE.jar;C:\Users\陈玉婷\.m2\repository\org\springframework\spring-beans\5.2.4.RELEASE\spring-beans-5.2.4.RELEASE.jar;C:\Users\陈玉婷\.m2\repository\org\slf4j\slf4j-api\1.7.30\slf4j-api-1.7.30.jar;C:\Users\陈玉婷\.m2\repository\org\springframework\boot\spring-boot-starter-data-jpa\2.2.5.RELEASE\spring-boot-starter-data-jpa-2.2.5.RELEASE.jar;C:\Users\陈玉婷\.m2\repository\org\springframework\boot\spring-boot-starter-aop\2.2.5.RELEASE\spring-boot-starter-aop-2.2.5.RELEASE.jar;C:\Users\陈玉婷\.m2\repository\org\springframework\spring-aop\5.2.4.RELEASE\spring-aop-5.2.4.RELEASE.jar;C:\Users\陈玉婷\.m2\repository\org\aspectj\aspectjweaver\1.9.5\aspectjweaver-1.9.5.jar;C:\Users\陈玉婷\.m2\repository\jakarta\activation\jakarta.activation-api\1.2.2\jakarta.activation-api-1.2.2.jar;C:\Users\陈玉婷\.m2\repository\jakarta\persistence\jakarta.persistence-api\2.2.3\jakarta.persistence-api-2.2.3.jar;C:\Users\陈玉婷\.m2\repository\jakarta\transaction\jakarta.transaction-api\1.3.3\jakarta.transaction-api-1.3.3.jar;C:\Users\陈玉婷\.m2\repository\org\hibernate\hibernate-core\5.4.12.Final\hibernate-core-5.4.12.Final.jar;C:\Users\陈玉婷\.m2\repository\org\jboss\logging\jboss-logging\3.4.1.Final\jboss-logging-3.4.1.Final.jar;C:\Users\陈玉婷\.m2\repository\org\javassist\javassist\3.24.0-GA\javassist-3.24.0-GA.jar;C:\Users\陈玉婷\.m2\repository\net\bytebuddy\byte-buddy\1.10.8\byte-buddy-1.10.8.jar;C:\Users\陈玉婷\.m2\repository\antlr\antlr\2.7.7\antlr-2.7.7.jar;C:\Users\陈玉婷\.m2\repository\org\jboss\jandex\2.1.1.Final\jandex-2.1.1.Final.jar;C:\Users\陈玉婷\.m2\repository\com\fasterxml\classmate\1.5.1\classmate-1.5.1.jar;C:\Users\陈玉婷\.m2\repository\org\dom4j\dom4j\2.1.1\dom4j-2.1.1.jar;C:\Users\陈玉婷\.m2\repository\org\hibernate\common\hibernate-commons-annotations\5.1.0.Final\hibernate-commons-annotations-5.1.0.Final.jar;C:\Users\陈玉婷\.m2\repository\org\glassfish\jaxb\jaxb-runtime\2.3.2\jaxb-runtime-2.3.2.jar;C:\Users\陈玉婷\.m2\repository\org\glassfish\jaxb\txw2\2.3.2\txw2-2.3.2.jar;C:\Users\陈玉婷\.m2\repository\com\sun\istack\istack-commons-runtime\3.0.8\istack-commons-runtime-3.0.8.jar;C:\Users\陈玉婷\.m2\repository\org\jvnet\staxex\stax-ex\1.8.1\stax-ex-1.8.1.jar;C:\Users\陈玉婷\.m2\repository\com\sun\xml\fastinfoset\FastInfoset\1.2.16\FastInfoset-1.2.16.jar;C:\Users\陈玉婷\.m2\repository\org\springframework\data\spring-data-jpa\2.2.5.RELEASE\spring-data-jpa-2.2.5.RELEASE.jar;C:\Users\陈玉婷\.m2\repository\org\springframework\spring-orm\5.2.4.RELEASE\spring-orm-5.2.4.RELEASE.jar;C:\Users\陈玉婷\.m2\repository\org\springframework\spring-aspects\5.2.4.RELEASE\spring-aspects-5.2.4.RELEASE.jar;C:\Users\陈玉婷\.m2\repository\org\springframework\boot\spring-boot-starter-web\2.2.5.RELEASE\spring-boot-starter-web-2.2.5.RELEASE.jar;C:\Users\陈玉婷\.m2\repository\org\springframework\boot\spring-boot-starter\2.2.5.RELEASE\spring-boot-starter-2.2.5.RELEASE.jar;C:\Users\陈玉婷\.m2\repository\org\springframework\boot\spring-boot\2.2.5.RELEASE\spring-boot-2.2.5.RELEASE.jar;C:\Users\陈玉婷\.m2\repository\org\springframework\boot\spring-boot-autoconfigure\2.2.5.RELEASE\spring-boot-autoconfigure-2.2.5.RELEASE.jar;C:\Users\陈玉婷\.m2\repository\org\springframework\boot\spring-boot-starter-logging\2.2.5.RELEASE\spring-boot-starter-logging-2.2.5.RELEASE.jar;C:\Users\陈玉婷\.m2\repository\ch\qos\logback\logback-classic\1.2.3\logback-classic-1.2.3.jar;C:\Users\陈玉婷\.m2\repository\ch\qos\logback\logback-core\1.2.3\logback-core-1.2.3.jar;C:\Users\陈玉婷\.m2\repository\org\apache\logging\log4j\log4j-to-slf4j\2.12.1\log4j-to-slf4j-2.12.1.jar;C:\Users\陈玉婷\.m2\repository\org\apache\logging\log4j\log4j-api\2.12.1\log4j-api-2.12.1.jar;C:\Users\陈玉婷\.m2\repository\org\slf4j\jul-to-slf4j\1.7.30\jul-to-slf4j-1.7.30.jar;C:\Users\陈玉婷\.m2\repository\jakarta\annotation\jakarta.annotation-api\1.3.5\jakarta.annotation-api-1.3.5.jar;C:\Users\陈玉婷\.m2\repository\org\yaml\snakeyaml\1.25\snakeyaml-1.25.jar;C:\Users\陈玉婷\.m2\repository\org\springframework\boot\spring-boot-starter-json\2.2.5.RELEASE\spring-boot-starter-json-2.2.5.RELEASE.jar;C:\Users\陈玉婷\.m2\repository\com\fasterxml\jackson\core\jackson-databind\2.10.2\jackson-databind-2.10.2.jar;C:\Users\陈玉婷\.m2\repository\com\fasterxml\jackson\core\jackson-annotations\2.10.2\jackson-annotations-2.10.2.jar;C:\Users\陈玉婷\.m2\repository\com\fasterxml\jackson\core\jackson-core\2.10.2\jackson-core-2.10.2.jar;C:\Users\陈玉婷\.m2\repository\com\fasterxml\jackson\datatype\jackson-datatype-jdk8\2.10.2\jackson-datatype-jdk8-2.10.2.jar;C:\Users\陈玉婷\.m2\repository\com\fasterxml\jackson\datatype\jackson-datatype-jsr310\2.10.2\jackson-datatype-jsr310-2.10.2.jar;C:\Users\陈玉婷\.m2\repository\com\fasterxml\jackson\module\jackson-module-parameter-names\2.10.2\jackson-module-parameter-names-2.10.2.jar;C:\Users\陈玉婷\.m2\repository\org\springframework\boot\spring-boot-starter-tomcat\2.2.5.RELEASE\spring-boot-starter-tomcat-2.2.5.RELEASE.jar;C:\Users\陈玉婷\.m2\repository\org\apache\tomcat\embed\tomcat-embed-core\9.0.31\tomcat-embed-core-9.0.31.jar;C:\Users\陈玉婷\.m2\repository\org\apache\tomcat\embed\tomcat-embed-el\9.0.31\tomcat-embed-el-9.0.31.jar;C:\Users\陈玉婷\.m2\repository\org\apache\tomcat\embed\tomcat-embed-websocket\9.0.31\tomcat-embed-websocket-9.0.31.jar;C:\Users\陈玉婷\.m2\repository\org\springframework\boot\spring-boot-starter-validation\2.2.5.RELEASE\spring-boot-starter-validation-2.2.5.RELEASE.jar;C:\Users\陈玉婷\.m2\repository\jakarta\validation\jakarta.validation-api\2.0.2\jakarta.validation-api-2.0.2.jar;C:\Users\陈玉婷\.m2\repository\org\hibernate\validator\hibernate-validator\6.0.18.Final\hibernate-validator-6.0.18.Final.jar;C:\Users\陈玉婷\.m2\repository\org\springframework\spring-web\5.2.4.RELEASE\spring-web-5.2.4.RELEASE.jar;C:\Users\陈玉婷\.m2\repository\org\springframework\spring-webmvc\5.2.4.RELEASE\spring-webmvc-5.2.4.RELEASE.jar;C:\Users\陈玉婷\.m2\repository\org\springframework\spring-expression\5.2.4.RELEASE\spring-expression-5.2.4.RELEASE.jar;C:\Users\陈玉婷\.m2\repository\mysql\mysql-connector-java\8.0.19\mysql-connector-java-8.0.19.jar;C:\Users\陈玉婷\.m2\repository\jakarta\xml\bind\jakarta.xml.bind-api\2.3.2\jakarta.xml.bind-api-2.3.2.jar;C:\Users\陈玉婷\.m2\repository\org\springframework\spring-core\5.2.4.RELEASE\spring-core-5.2.4.RELEASE.jar;C:\Users\陈玉婷\.m2\repository\org\springframework\spring-jcl\5.2.4.RELEASE\spring-jcl-5.2.4.RELEASE.jar" com.cyt.springboot.SpringBoot06JpaApplication
HelloSpringApplicationRunListener...starting...
HelloSpringApplicationRunListener...environmentPrepared...

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

HelloApplicationContextInitializer...initialize...
HelloSpringApplicationRunListener...contextPrepared...
2020-03-28 10:10:58.715  INFO 6900 --- [           main] c.c.s.SpringBoot06JpaApplication         : Starting SpringBoot06JpaApplication on DESKTOP-0IIT1JL with PID 6900 (D:\IDEA\JavaCode\testSpringBoot\spring-boot-06-jpa\target\classes started by yuting in D:\IDEA\JavaCode\testSpringBoot\spring-boot-06-jpa)
2020-03-28 10:10:58.722  INFO 6900 --- [           main] c.c.s.SpringBoot06JpaApplication         : No active profile set, falling back to default profiles: default
HelloSpringApplicationRunListener...contextLoaded...
2020-03-28 10:11:01.145  INFO 6900 --- [           main] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode!
2020-03-28 10:11:01.147  INFO 6900 --- [           main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JDBC repositories in DEFAULT mode.
2020-03-28 10:11:01.248  INFO 6900 --- [           main] .RepositoryConfigurationExtensionSupport : Spring Data JDBC - Could not safely identify store assignment for repository candidate interface com.cyt.springboot.repository.EmployeeRepository. If you want this repository to be a JDBC repository, consider annotating your entities with one of these annotations: org.springframework.data.relational.core.mapping.Table.
2020-03-28 10:11:01.249  INFO 6900 --- [           main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 87ms. Found 0 JDBC repository interfaces.
2020-03-28 10:11:01.273  INFO 6900 --- [           main] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode!
2020-03-28 10:11:01.274  INFO 6900 --- [           main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode.
2020-03-28 10:11:01.333  INFO 6900 --- [           main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 50ms. Found 1 JPA repository interfaces.
2020-03-28 10:11:03.712  INFO 6900 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8080 (http)
2020-03-28 10:11:03.733  INFO 6900 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2020-03-28 10:11:03.735  INFO 6900 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.31]
2020-03-28 10:11:04.047  INFO 6900 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2020-03-28 10:11:04.047  INFO 6900 --- [           main] o.s.web.context.ContextLoader            : Root WebApplicationContext: initialization completed in 5157 ms
2020-03-28 10:11:04.656  INFO 6900 --- [           main] o.hibernate.jpa.internal.util.LogHelper  : HHH000204: Processing PersistenceUnitInfo [name: default]
2020-03-28 10:11:04.961  INFO 6900 --- [           main] org.hibernate.Version                    : HHH000412: Hibernate ORM core version 5.4.12.Final
2020-03-28 10:11:05.153  INFO 6900 --- [           main] o.hibernate.annotations.common.Version   : HCANN000001: Hibernate Commons Annotations {5.1.0.Final}
2020-03-28 10:11:05.339  INFO 6900 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Starting...
2020-03-28 10:11:05.871  INFO 6900 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Start completed.
2020-03-28 10:11:05.900  INFO 6900 --- [           main] org.hibernate.dialect.Dialect            : HHH000400: Using dialect: org.hibernate.dialect.MySQL57Dialect
2020-03-28 10:11:07.722  INFO 6900 --- [           main] o.h.e.t.j.p.i.JtaPlatformInitiator       : HHH000490: Using JtaPlatform implementation: [org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform]
2020-03-28 10:11:07.731  INFO 6900 --- [           main] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default'
2020-03-28 10:11:08.278  WARN 6900 --- [           main] JpaBaseConfiguration$JpaWebConfiguration : spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning
2020-03-28 10:11:08.496  INFO 6900 --- [           main] o.s.s.concurrent.ThreadPoolTaskExecutor  : Initializing ExecutorService 'applicationTaskExecutor'
2020-03-28 10:11:09.044  INFO 6900 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''
2020-03-28 10:11:09.047  INFO 6900 --- [           main] c.c.s.SpringBoot06JpaApplication         : Started SpringBoot06JpaApplication in 11.787 seconds (JVM running for 13.912)
HelloSpringApplicationRunListener...started...
HelloApplicationRunner...run...org.springframework.boot.DefaultApplicationArguments@5e98032e
HelloCommandLineRunner...run...[]
HelloSpringApplicationRunListener...running...