springboot环境配置注⼊顺序
前⾔:
这⼀篇需要spring boot和设计模式的基础知识,从设计模式的⾓度先去谈spring boot,再介绍spring boot的启动流程以及环境注⼊的⼀些知识。学习过程中发现⽹上还是有很多坑的,这⾥尽量统⼀做下总结。
fig.1
⼀,spring boot简介
fig.2
spring boot中设计到的东西其实很繁杂,如果你学会了Java,并且可以⽤Java做⼀些简单的⼯程,知道Java的多线程机制,JVM,关键字等等,说明你对Java SE以及有了基础。⽽spring是Java EE的范畴,也就是说,使⽤Spring框架⼀般可以作为真正商业可⽤的应⽤程序开发,⽽且⼤多数公司确实也是⽤spring框架来实现Java的商业性应⽤开发。
⾄于Spring全家桶都有哪些需要你⾃⼰去了解,因为涉及到的东西真的很多,这⾥只讲这套spring boot开发框架中最基础的东西。
什么是Spring Boot?
spring Boot设计⽬的是⽤来简化新Spring应⽤的初始搭建以及开发过程。该框架集合之前的spring框架,使⽤了特定的⽅式来进⾏配置,从⽽使开发⼈员不再需要定义样板化的配置。也就是说,我可以只需要⾮常少的⼏个配置就可以迅速⽅便的搭建起来⼀套web项⽬或者是构建⼀个微服务。
我的意见是,和gRPC类似,spring Boot也是⼀个要学习怎么去⽤,不要学习如何去改的框架。⾸先spring boot运⾏涉及的概念很明确,不过理解也很繁琐。关于bean,IOC,DI,AOP,注解以及POJO⼀些spring boot框架开发的概念需要吃透并理解,才能在使⽤的时候更好理解⾃⼰的⼯程,然后去使⽤。
⼆,⼯⼚设计模式与spring boot
Spring使⽤⼯⼚模式可以通过 BeanFactory 或 ApplicationContext 创建 bean 对象。
BeanFactory :延迟注⼊(使⽤到某个 bean 的时候才会注⼊), 相⽐于ApplicationContext 来说会占⽤更少的内存,程序启动速度更快。ApplicationContext :容器启动的时候,不管你⽤没⽤到,⼀次性创建
所有 bean 。BeanFactory 仅提供了最基本的依赖注⼊⽀
持,ApplicationContext 扩展了 BeanFactory ,除了有BeanFactory的功能还有额外更多功能,所以⼀般开发⼈员使⽤ApplicationContext会更多。
什么是上下⽂?
"context是environment的snapshot."
每⼀段程序都有很多外部变量。只有像Add这种简单的函数才是没有外部变量的。⼀旦你的⼀段程序有了外部变量,这段程序就不完整,不能独⽴运⾏。你为了使他们运⾏,就要给所有的外部变量⼀个⼀个写⼀些值进去。这些值的集合就叫上下⽂。
Application Context的实现类
ApplicationContext的三个实现类:
ClassPathXmlApplication:把上下⽂⽂件当成类路径资源。
FileSystemXmlApplication:从⽂件系统中的 XML ⽂件载⼊上下⽂定义信息。
XmlWebApplicationContext:从Web系统中的XML⽂件载⼊上下⽂定义信息。
当以上实现类⼀般不会在你的⼯程中⽤到,spring启动的时候会根据实现注⼊我们所需要的配置来运⾏我们想要的⼯程。
三,观察者模式与spring boot
什么是观察者模式?
当⼀个对象(⽬标对象)的状态发⽣改变,所有的依赖对象(观察者对象)都将得到通知,进⾏⼴播通知。⽤来使⽤⾯向对象技术,将这种依赖关系弱化。
spring ioc注解观察者模式是⼀种对象⾏为型模式。它表⽰的是⼀种对象与对象之间具有依赖关系,当⼀个对象发⽣改变的时候,这个对象所依赖的对象也会做出反应。Spring 事件驱动模型就是观察者模式很经典的⼀个应⽤。Spring 事件驱动模型⾮常有⽤,在很多场景都可以解耦我们的代码。⽐如我们每次添加商品的时候都需要重新更新商品索引,这个时候就可以利⽤观察者模式来解决这个问题。
Spring事件驱动⾓⾊
事件⾓⾊
定义⼀个事件: 实现⼀个继承⾃ ApplicationEvent,并且写相应的构造函数;具体spring boot中定义的事件如图
fig.3
事件监听者⾓⾊
ApplicationListener 充当了事件监听者⾓⾊,它是⼀个接⼝,⾥⾯只定义了⼀个 onApplicationEvent()⽅法来处理ApplicationEvent
事件发布者⾓⾊
使⽤事件发布者发布消息: 可以通过 ApplicationEventPublisher 的 publishEvent() ⽅法发布消息
Spring事件流程总结
在run的情况下携带上下⽂运⾏,然后创建不同的listener去监听事件完成应⽤的初始化,
在run的时候spring创建并帮助应⽤程序启动,
1.获取创建listener (starting)
2.创建参数。配置environment(envPrepared)
3.创建applicationContext
4.初始化上下⽂(contextPrepared),加载配置(contextLoaded)
5.更新上下⽂(Started),启动程序(running)
四,spring boot env环境注⼊
Spring Boot可以外部化配置,以便可以在不同环境中使⽤相同的应⽤程序代码。你可以使⽤属性⽂件,YAML⽂件,环境变量和命令⾏参数来外部化配置,可以使⽤@Value批注将属性值直接注⼊到您的bean中,可以通过Spring的Environment抽象访问,也可以通过
@ConfigurationProperties绑定到结构化对象。
Spring Boot使⽤⼀个⾮常特殊的PropertySource顺序,该顺序旨在允许合理地覆盖值。按以下顺序考虑属性:
docs.spring.io/spring-boot/docs/2.1.0.RELEASE/reference/htmlsingle/#boot-features-command-line-runner
1.Devtools global settings properties on your home directory (~/.spring-boot-devtools.properties when devtools is
active).
2.@TestPropertySource annotations on your tests.
3.properties attribute on your tests. Available on @SpringBootTest and the test annotations for testing a particular
slice of your application.
4.Command line arguments.
5.Properties from SPRING_APPLICATION_JSON (inline JSON embedded in an environment variable or system
property).
6.ServletConfig init parameters.
7.ServletContext init parameters.
8.JNDI attributes from java:comp/env.
9.Java System properties (Properties()).
10.OS environment variables.
11.A RandomValuePropertySource that has properties only in random.*.
12.Profile-specific application properties outside of your packaged jar (application-{profile}.properties and YAML
variants).
13.Profile-specific application properties packaged inside your jar (application-{profile}.properties and YAML variants).
14.Application properties outside of your packaged jar (application.properties and YAML variants).
15.Application properties packaged inside your jar (application.properties and YAML variants).
16.@PropertySource annotations on your @Configuration classes.
17.Default properties (specified by setting SpringApplication.setDefaultProperties).
To provide a concrete example, suppose you develop a @Component that uses a name property, as shown in the following
@TestPropertySource⽤法:
@TestPropertySource注解⽤于springboot项⽬测试的env配置注⼊,通过可选元素可以覆盖掉test⾃⾝读到的配置⽂件
可选元素主要有两个:
string[] locations //指定配置的路径
string[] properties //指定配置的属性
properties的优先级⼤于locations
举例:
@TestPropertySource(properties = "guardian.ken.abled=true")
.properties//.yaml
@PropertySource
参考:
1. www.ibm/developerworks/cn/java/j-lo-spring-boot/index.html#listing4
2. www.throwable.club/2018/12/16/spring-boot-environment-configuration-spread/
3. docs.spring.io/spring-boot/docs/2.1.0.RELEASE/reference/htmlsingle/#boot-features-command-line-runner
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论