基于application和bootstrap的加载顺序及区别说明
作者:lei_dx
application和bootstrap的加载顺序及区别
bootstrap.yml(bootstrap.properties)先加载
application.yml(application.properties)后加载
bootstrap.yml 用于应用程序上下文的引导阶段。
bootstrap.yml 由父Spring ApplicationContext加载。
父ApplicationContext 被加载到使用 application.yml 的之前。
bootstrap.yml
是系统级别的一些参数配置,这些参数一般是不变的。
application.yml 一般用来定义单个应用级别的,如果搭配 spring-cloud-config 使用 application.yml 里面定义的文件可以实现动态替换。
使用Spring Cloud Config Server时,应在 bootstrap.yml 中指定:
spring.application.name spring.cloud.config.server.git.uri
注意:
一旦bootStrap.yml 被加载,则内容不会被覆盖,即便后期加载的application.yml的内容标签与bootstrap的标签一致,application 也不会覆盖bootstrap, 而application.yml 里面的内容可以动态替换。
bootstrap.yml与application.yml执行顺序(原因:类加载器的先后顺序)
结论:bootstrap.yml 先于 application.yml 加载
bootstrap.yml(bootstrap.properties)用来程序引导时执行,应用于更加早期配置信息读取,如可以使用来配置application.yml中使用到参数等
application.yml(application.properties) 应用程序特有配置信息,可以用来配置后续各个模块中需使用的公共参数等。
bootstrap.yml 先于 application.yml 加载
应用:当使用 Spring Cloud Config Server 的时候
bootstrap.yml 中
spring.application.name: test spring.cloud.config.name: testName spring.cloud.config.uri: http://config1.spring-demo.test.com:8888
原因:类加载器的先后顺序
负责加载class文件,class文件在文件开头有特定的文件标示,并且ClassLoader只负责class文件的加载,至于它是否可以运行,则由Execution Engine决定
虚拟机自带的加载器
1.启动类加载器(Bootstrap)C++
2.扩展类加载器(Extension)Java
3.应用程序类加载器(AppClassLoader)Java 也叫系统类加载器,加载当前应用的classpath的所有类
4.用户自定义加载器 Java.lang.ClassLoader的子类,用户可以定制类的加载方式
注意java中反射的三种方法
1.通过Object类的getClass方法来获取
java.lang.Object中定义有getClass方法:public final Class getClass()所有Java对象都具备这个方法,该方法用于返回调用该方法的对象的所属类关联的Class对
2.用.class的方式
使用类名加“.class”的方式即会返回与该类对应的Class对象。
3.使用Class.forName方法
Class有一个著名的static方法
forName:public static Class forName(String className) throws ClassNotFoundException
该方法可以根据字符串参数所指定的类名获取与该类关联的Class对象。
如果该类还没有被装入,该方法会将该类装入JVM。
该方法声明抛出ClassNotFoundException异常。
顾名思义,当该方法无法获取需要装入的类时(例如,在当前类路径中不存在这个类),就会抛出这个异常。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。