SpringBoot--1

目录


概念


1、SpringBoot


2、微服务


SpringBoot 环境搭建(IDEA)


1、用 IDEA 的向导生成 SpringBoot 项目


2、自己新建 Maven 工程


3、打包部署


4、Maven 文件的理解


5、@SpringBootApplication 的理解


SpringBoot 配置


1、配置文件简介:


2、YAML?语法


3、配置文件中属性的注入


4、几个常见的注解


5、配置文件中的占位符


6、按环境激活配置文件 profile


7、配置文件加载位置


8、SpringBoot 自动配置原理



概念
1、SpringBoot

SpringBoot是简化了Spring的各项配置,能够实现Spring的快速开发的一个开箱即用的框架;是对 Spring 的整个技术栈的整合;是 J2EE 一站式开发的解决方案。


2、微服务

(1)微服务是一种架构风格(服务微化)


(2)对于微服务而言,一个应用应该是一组小型服务,服务之间通过 HTTP 来互通。


(3)每一个功能都应该是一个可独立替换独立升级的软件单元。


?


SpringBoot 环境搭建(IDEA)
1、用 IDEA 的向导生成 SpringBoot 项目

(1)生成过程:new project ==> Spring Initialize(如果没有这个选项,可能是由于 IDEA 版本问题,只有旗舰版才有,社区版没有) ==>根据向导修改相关信息即可。


(2)生成的项目会自带入口程序,我们只需要实现业务逻辑即可。


(3)项目会有一个 resource 目录,主要包含以下几个部分:


? ? ? ? static:存放静态资源, js css images。


? ? ? ? templates:存放模板页面,SpringBoot 默认 jar 包嵌入式 tomcat,不支持 jsp 页面,但是支持模板引擎(freemarker、thymeleaf 等)


? ? ? ? application.properties:SpringBoot 应用的配置文件, 可以在其中修改一些默认的配置,如:端口号等。


2、自己新建 Maven 工程

(1)引入依赖?spring-boot-starter-web 和父项目 spring-boot-starter-parent。



org.springframework.boot
spring-boot-starter-parent
2.1.4.RELEASE




org.springframework.boot
spring-boot-starter-web


(2)利用 @SpringBootApplication 标注入口类,可以通过?scanBasePackages 属性来配置扫描目录,如果不配置默认扫描当前目录(@SpringBootApplication 标识的类所在的目录)及其子目录。然后调用 SpringApplication.run 来启动 SpringBoot。


@SpringBootApplication()
public class SpringbootHelloworldApplication {

public static void main(String[] args) {
SpringApplication.run(SpringbootHelloworldApplication.class, args);
}
}

(3)编写 @Controller ,然后运行服务,就可以在浏览器访问了。


注:也可以用 @RestController 来代替 @Controller , @RestController 包含 @Controller 和 @ResponseBody。


3、打包部署

(1)在 build 中加入 plugin:spring-boot-maven-plugin





org.springframework.boot
spring-boot-maven-plugin



(2)运行 Maven ==> Lifecycle ==>package 进行打包



(3)这样就会在 targe 目录下生成一个 jar 包,就可以直接用 java -jar 来部署了。


4、Maven 文件的理解

(1)Maven 中的父项目?spring-boot-starter-parent ,在该项目中又引用了一个父项目?spring-boot-dependencies 。在这个项目中管理了 Spring 所有依赖的版本号,也称之为 SpringBoot 的版本仲裁中心。 这就使得在我们的 Maven 中可以不指定版本。


(2)spring-boot-starter:SpringBoot 的场景启动器(例如:spring-boot-starter-web、spring-boot-starter-aop 等等)。


? ? ? ?SpringBoot 提供了很多个场景启动器,其功能是导入对应场景正常运行时所依赖的所有组件,在开发时只需要引入想要的场景启动器,SpringBoot 就会自动引入相关的所有依赖。


5、@SpringBootApplication 的理解

@SpringBootApplication: 用于标识 SpringBoot 程序的入口类


@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = {
@Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
@Filter(type = FilterType.CUSTOM,
classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {

(1) @SpringBootConfiguration :用于标识 SpringBoot 的配置类(配置类? 就相当于? 配置文件)


@Configuration
public @interface SpringBootConfiguration {

? ? ? ?@Configuration : 用于标识 Spring 的配置类,它也是一个用 @Component 标识的组件。


@Component
public @interface Configuration {

(2)?EnableAutoConfiguration : 用于启动自动配置功能,这样我们就不用写各种配置文件了,SpringBoot 自动帮我们配置。


@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {

? ? ① @AutoConfigurationPackage : 自动配置包


@Inherited
@Import(AutoConfigurationPackages.Registrar.class)
public @interface AutoConfigurationPackage {

? ?利用 @Import 注解将 AutoConfigurationPackages.Registrar 添加到容器中。该类用于将 当前目录作为根目录添加到容器中。


? ?② 利用 @Import 注解将?AutoConfigurationImportSelector 添加到容器中,该类会添加非常多的自动配置类到容器中。这些自动配置类的作用就是,导入相关的组件,并将这些组件配置好。


?


SpringBoot 配置
1、配置文件简介:

? SpringBoot 默认有两个全局配置文件文件名是固定的。用于修改自动配置的一些属性


? ? ? ?application.properties


? ? ? ?application.yml


2、YAML?语法

(1)用 K:(空格)V 来表示一对键值对,空格必须有


(2)用空来缩进来表示层级关系,左对齐的一列数据都属于同一层级


(3)值的表示:


? ? ? ① 字面量:直接写就行


注:其中字符串有三种表示,直接写,双引号(不会转义),单引号(会转义)


? ? ? ② 对象,直接用键值对表示对象或者 Map


? ? ? ③ 数组(包括 List 和 Set 等),用 -(空格)V 来表示数组中的一个元素


person:
lastName: robin
age: 18
birth: 1993/10/18
children:
- name: yiyi
age: 2
- name: xixi
age: 1
maps:
yiyi: yiyi
xixi: xixi

注:对象和数组的表示也可以写在一行内:


friend: {name: robin,age: 18,childrenName: [yiyi,xixi]}
3、配置文件中属性的注入

(1)利用 @ConfigurationProperties 来注入


在类中利用 @ConfigurationProperties 注解来标识在配置文件中配置的类,利用 prefix 属性来指明配置文件中配置类属性的模块


@Component
@ConfigurationProperties(prefix = "person")
public class Person {
private String lastName;
private Integer age;
private Date birth;
private List children;
private Map maps;

注:该类必须是容器中的组件,@ConfigurationProperties 注解才会起作用,因此需要加上 @Component 注解。


注:@ConfigurationProperties 的两种用法


? ? ? ① 在添加 @ConfigurationProperties 注解时,加上 @Component 注解,此时 SpringBoot 启动时就会从配置文件中匹配对应的属性并创建该类的 bean,这样会有个缺点:不管是否会用得上这个类,IOC 容器中都会有一个该类的 bean。


? ? ? ?②?添加 @ConfigurationProperties 注解时,不加 @Component 注解,此时 IOC 中就不会有该类的 bean,这就使得?@ConfigurationProperties 不生效。如果想让该注解生效则需要利用 @EnableConfigurationProperties 来启用,此时 SpringBoot 会生成一个该类的 bean,并匹配配置文件中的属性,然后添加到 IOC 容器中。


(2)利用 @Value 来注入


在属性上利用 @Value 来给属性注入值,该值可以是字面量,可以用 ${ } 来获取配置文件中的值,也可以用 #{ } 来使用 spEL。


public class Person {
@Value("${person.lastName}")
private String lastName;
@Value("#{12 * 2}")
private Integer age;
@Value("2017/03/28")

注:不支持复杂类型的导入,不支持 JSR303 校验


(3)两种方式使用上的选择


如果说,我们只是在某个业务逻辑中需要获取一下配置文件中的某项值,使用 @Value;
如果说,我们专门编写了一个 javaBean 来和配置文件进行映射,我们就直接使用 @ConfigurationProperties;


注:@ConfigurationProperties 和 @Value 默认都是从全局配置文件中查找属性的


4、几个常见的注解

(1)@PropertySource :加载指定的配置文件


通过 value 属性来指定配置文件(数组,可以指定多个),在类的上方加上这个注解,该类会自动扫描指定的配置文件。


@PropertySource(value = {"classpath:person.properties"})
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
private String lastName;
private Integer age;

注:① 只能指定?properties 文件,不能加载 yaml 文件


? ? ? ?② SpringBoot 会优先扫描全局配置文件,去匹配 bean,只有当全局配置文件中找不到匹配的配置,才会去指定的配置文件中查找。


(2)@ImportResource :加载指定的 Spring 配置文件


将这个注解添加到入口类上,并通过 locations 属性(数组,可以指定多个)来指定 Spring 的配置文件,这样 SpringBoot 就会扫描指定的配置文件并把 bean 添加到 IOC 容器中。


@ImportResource(locations = {"classpath:applicationContext.xml"})
@SpringBootApplication
public class SpringbootHelloworldApplication{
public static void main(String[] args) {

(3)@Configuration 和 @Bean :利用注解的方式添加 bean


① 利用 @Configuration 注解标识一个配置类,配置类相当于 Spring 的配置文件,在配置类中可通过 @Bean 来配置多个 Bean


② 利用 @Bean 来配置一个 bean,@Bean 是标注在方法上,将方法的返回值作为一个 bean 添加到 IOC 容器中,id 是方法名


@Configuration
public class MyConfiguration {
@Bean
public HelloService helloService() {
return new HelloService();
}

5、配置文件中的占位符

占位符: ${ } 可以用于获取前面已经配置的属性。可以用 : 指定默认值,此时若指定的属性没有配置过,则会使用默认值。


person:
lastName: robin
age: 18
birth: 1993/10/18
children:
- name: ${person.lastName12:jinglan}_yiyi

注:这个占位符既可以用于 yaml 文件中,也可以用于 properties 文件中。


6、按环境激活配置文件 profile

根据不同的环境(开发环境 dev、生产环境 prod 等)来选择不同的配置文件。


(1)properties 用多文件实现 profile


针对每个环境都创建一个 properties 文件,命名为 application-环境名.properties。如 application-dev.properties。


(2)yaml 用文档块方式实现 profile


利用 --- 将 yaml 文件分割为多个文档块,每个文档块都可以用 spring:profiles 来指明当前文档块的环境


(3)激活某个 profile


默认情况下 SpringBoot 使用 application 全局配置文件,如果需要使用某个环境对应的配置文件需要激活。


? ? ?① 在配置文件中激活?


? ? ? ? ?properties 文件:在 application 全局配置文件中配置 spring.profiles.active=环境名 即可激活对应的配置文件


? ? ? ? ?yaml 文件: 在 application 全局配置文件中配置 spring:profiles:active:环境名 即可激活对应的配置文件


server:
port: 8090
spring:
profiles:
active: dev
---
server:
port: 8003
spring:
profiles: dev

? ? ? ?② 利用命令行参数激活


? ? ? ? ? ?给定命令行参数(Program arguments)? --spring.profiles.active=环境名? ?即可激活对应的配置文件


? ? ? ?③ 利用虚拟机参数激活


? ? ? ? ? ?给定虚拟机参数(VM options) -Dspring.profiles.active=环境名 即可激活对应的配置文件


7、配置文件加载位置

(1)内部配置文件加载顺序


application 全局配置文件可以在不同的路径下同时存在,并且都会被 SpringBoot 按照“并集”的方式加载。如果有冲突按照优先级进行覆盖,高优先级覆盖低优先级。


优先级:命令行参数 spring.config.location 指定 > -file:/config/ > -file:/ > -classpath:/config/ > -classpath:/


注:命令行参数语法: --配置项1=值 --配置项2=值。 多个配置用空格隔开


(2)外部配置文件加载顺序,从上到下优先级依次降低


? ? ? ?① 命令行指定,可以在命令行直接配置属性? ? ?如:--server.port=8080


? ? ? ?② jar 包外的 application 配置文件


? ? ? ? ? ? ? ? 带 profile 的配置文件 优先于不带 profile 的配置文件


? ? ? ?③ jar 包内的 application 配置文件


? ? ? ? ? ? ? ??带 profile 的配置文件 优先于不带 profile 的配置文件


? ? ? ?④ @PropertySource 注解指定的配置文件


8、SpringBoot 自动配置原理

(1)SpringBoot 可以配置哪些属性:


? ? ? ? ??https://docs.spring.io/spring-boot/docs/2.1.4.RELEASE/reference/htmlsingle/? ?


? ? ? ? ? 该页面内?Appendices?==>?Common application properties?目录下就可以查看所有的可配置属性


(2)SpringBoot 在启动的时候会加载入口类,会通过 @EnableAutoConfiguration 注解开启自动配置功能。


(3)其中?@EnableAutoConfiguration 注解的作用是利用 AutoConfigurationImportSelector 类来加载各种自动配置类。


? ? ? ? ? ? ① 利用 getCandidateConfigurations 方法来获取候选的配置类的集合


List configurations = getCandidateConfigurations(annotationMetadata,attributes);

? ? ? ? ? ? ②?getCandidateConfigurations 方法中又利用了?SpringFactoriesLoader.loadFactoryNames?方法来扫描所有 jar 包类路径下的?META-INF/spring.factories 文件,并将扫描到的内容生成 Properties 对象(类似于Map),然后查找其中 EnableAutoConfiguration 所对应的值并返回。


? ? ? ? ? ? ③?spring.factories 文件中所配置的?EnableAutoConfiguration?都是 xxxAutoConfiguration 类,这些类是用来做自动配置的


(4)xxxAutoConfiguration 类的自动配置功能


以?HttpEncodingAutoConfiguration 为例来分析


@Configuration //表示这是一个配置类,相当于配置文件
@EnableConfigurationProperties(HttpProperties.class) //启用指定类的ConfigurationProperties功能
//启用之后就会从配置文件中去匹配指定类的属性,同时生成该类的bean,然后加入到IOC容器中(见第3小节)
@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET)
@ConditionalOnClass(CharacterEncodingFilter.class)
@ConditionalOnProperty(prefix = "spring.http.encoding", value = "enabled",
matchIfMissing = true)
public class HttpEncodingAutoConfiguration {
private final HttpProperties.Encoding properties;

//当类中没有无参构造器,只有一个有参构造器时,Spring在创建bean时,会调用这个有参构造器,其入参会从IOC容器中去获取
public HttpEncodingAutoConfiguration(HttpProperties properties) {
this.properties = properties.getEncoding();
}

@Bean
@ConditionalOnMissingBean
public CharacterEncodingFilter characterEncodingFilter() {
CharacterEncodingFilter filter = new OrderedCharacterEncodingFilter();
filter.setEncoding(this.properties.getCharset().name());
//bean中的属性是从properties中获取的,而properties是从容器中注入的HttpProperties
filter.setForceRequestEncoding(this.properties.shouldForce(Type.REQUEST));
filter.setForceResponseEncoding(this.properties.shouldForce(Type.RESPONSE));
return filter;
}

@Conditionalxxx 注解表示一种条件,如果条件满足,那么这个配置类才能生效,如果不满足则不生效。


? ? ? ? ① @ConditionalOnWebApplication :判断当前程序是否是一个 web 程序。


? ? ? ? ② @ConditionalOnClass :判断当前项目是否有指定的类


? ? ? ? ③ @ConditionalOnProperty :判断配置文件中是否配置了指定的属性? ? ? ? ? 如:spring.http.encoding.enabled


? ? ? ? ④ 属性 mathIfMissing = true 表示即使不存在也会返回 true


xxxProperties 的 bean 会注入到配置类中,配置类从注入的?properties 中获取相应的属性,并自动配置相关的 bean。


注:看到这里的 properties 在注入时并没有加上 @Autowired 注解,但是仍能成功注入,是因为当类中没有无参构造器,只有一个有参构造器时,Spring在创建bean时,会调用这个有参构造器,其入参会从IOC容器中去获取。


(5)xxxAutoConfiguration 对应的自动装配的属性都在?xxxProperties 类中封装着,我们配置文件中能够配置哪些属性就可以参考这个属性类。


@ConfigurationProperties(prefix = "spring.http")
public class HttpProperties {

(6)每个自动配置类都有其生效的条件,只有在满足条件时才能生效。在程序中查看已经生效的自动配置类,只需要在配置文件中添加 debug=true 的配置,这样就可以开启 debug 模式,在此模式下,控制台就会打印出自动配置报告。


总结:


配置类会给容器中添加各种组件,这些组件的属性都是从 xxxProperties 类中获取的,而这些类的属性又是与配置文件绑定的

相关文档

  • 芹菜炒香干做法步骤
  • 民政局法治工作考核方案
  • 2017土地代理人考试《相关法律》模拟练习及答案
  • 笔记本安装ubuntu16.04双系统时对nvidia显卡不兼容导致卡住的解决办法
  • 2021春招涨薪跳槽技术必备:分布式宝典“限流+缓存+通讯”(三大技术专题)
  • 关于客运企业创新发展演讲稿
  • SpringMVC线程安全问题 小结
  • idea maven无法下载jar包的子依赖或者无法识别jar的问题
  • 初中军训400字日记
  • 给闺蜜的初中毕业留言
  • 春田花花同学会吉他弹唱教学视频
  • 初二作文我的家说明文600字范文
  • 华为、H3C、锐捷三家交换机配置命令详解
  • 行测资料分析解题关键词
  • 万缕千丝的成语解释
  • git回退到某个版本,以及从过去的版本返回到新的版本(三)
  • 婚礼答谢主持词
  • 一步步写STM32 OS【三】PendSV与堆栈操作
  • Python 从入门到精通
  • 有关音乐教学工作计划模板汇总八篇
  • Codechef TSUM2 Sum on Tree 点分治、李超线段树
  • 学习部部长的自荐信
  • 校园相声——对称刍议
  • 2021销售年终工作总结1000字
  • 怎么把RTF格式改成DOC格式
  • app功能测试细节要点
  • 生命的微尘阅读练习及答案
  • 留学美国读研究生要满足的雅思条件
  • 银行培训协议范本专业版
  • 有关品味美好生活的名言
  • 电脑版