之前得文章主要介绍得spring以及springmvc,其实整个文章主要介绍的是spring 创建bean 以及各个对bean实例创建过程中的各个部分扩展,以及spring mvc 如何处理http请求,然后并使用 handler对于 各个请求的匹配到controller 上 ;这篇文章 继续 对spring boot 进行深入研究,从 spring boot 搭建开始 到如何使用 ,以及 stater机制 怎么会有约定大于配置的说法 ,极大的简化我们的开发。
首先 对于一般的业务系统的开发 ,无非关心的是几个 点, 搭建框架 的效率,代码的规整以及 是否易于管理扩展,以及 系统扩展性,日志系统的管理 查看,以及 安装部署项目以及 jar包 配置文件 的管理情况。 这些在spring boot没有出来前,怎么样搭建一个项目 ,而这个项目 要 达到上面所有的效率, 对于一般的开发工程师 是比较困难 的 因为需要对于 一般的程序开发人员,我们并不想了解 框架底层,那是很耗费时间和学习精力的。所以 出现了SpringBoot框架 ,这个框架利用约定大于配置的思想,对于我们开发是非常大的提升解决对于框架的提升和理解,也是SpringBoot为什么这么火的原因。
Spring Boot
官网对于springboot的介绍:
Spring Boot 可以轻松创建可以“直接运行”的独立的、生产级的基于 Spring 的应用程序。 我们对 Spring 平台和第三方库持固执己见的看法,因此您可以轻松上手。大多数 Spring Boot 应用程序需要最少的 Spring 配置。 如果您正在寻找有关特定版本的信息,或有关如何从早期版本升级的说明,请查看我们 wiki 上的项目发布说明部分。
在idea中有springBoot插件 可以快速创建 项目
也可以直接在官网上直接创建 项目
Spring Initializr
快速跑起来 直接使用 RestConllector 就可以快速的将框架起来
构建的依赖 添加 maven-plugin
构建可执行Jar
@SpringBootApplication
public class DeviceManagerApplication extends SpringBootServletInitializer {
public static void main(String[] args) {
SpringApplication.run(DeviceManagerApplication.class, args);
}
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(DeviceManagerApplication.class);
}
}
如果不绑定 servlet是不知道配置的数据库信息 等等。
可以看一下 这个类中的 创建 context方法进行绑定其他数据
这里面的 父类 parent 依赖给我们加了很多 以及 现在的 赋值
继续往上面看 包括 mq redis 等等 依赖包都给我们 db 等等 扩展包 都在这里面给我们引入了
@SpringBootApplication 这个注解 主要就两个注解重要 @SpringBootConfiguration 和 @EnableAutoConfiguration 注解
SpringBootConfiguration 注解
对于EnableAutoConfiguration 注解 则 进去 查看 AutoConfigurationImportSelector 导入 类 ,并
将 beanfactory引入进来 扫描AutoConfigurationEntry autoConfigurationEntry = getAutoConfigurationEntry(annotationMetadata); 判断 是什么类型 是servlet 或者 webflus 的类型的
右键启动时,启动起来 会加载 SpringBootApplication 里面的所有的东西。 包括 配置文件。
因为java 各自有各自一套日志打印工具,所有是很麻烦的。这里用 桥接的方式,将 日志进行输出。
我们在使用 logback 或者 log4j 打印日志时,就可以输出
# 日志配置
# 指定日志文件
logging.file.name=my.log
# 指定日志目录
logging.file.path=/app/log
# 调整日志级别
logging.level.root=info
logging.level.org.springframework.web=debug
logging.level.org.hibernate=error
/logs/app.log
/logs/app.%d.%i.log
30
1MB
%d %p (%file:%line\)- %m%n
UTF-8
现在越来越多的时间 写单元测试了。其实写单元测试是太慢了,所以才不愿意写单元测试,但是springboot提供的工具是越来越强大的。
org.springframework.boot
spring-boot-starter-test
test
org.junit.vintage
junit-vintage-engine
org.springframework.boot
spring-boot-starter-actuator
# 启用端点,默认不启用,还可以单独的指定见 shutdown的示例
management.endpoints.enabled-by-default=true
# 启用shutdown端点
management.endpoint.shutdown.enabled=true
# *表示在http上暴露所有端点,指定端点名表示暴露指定的端点
management.endpoints.web.exposure.include=*
# 默认值为never,显示所有组件的详细健康信息
management.endpoint.health.show-components=always
management.endpoint.health.show-details=always
# 禁用HTTP暴露端点
# management.server.port=-1
Production-ready Features (spring.io)
这些都可以用监控去查看 所有的信息。
这里重要的是 在 auto-config中 spring.factories 中需要配置 对应的configuration
自己引入下来的 包括下面 对应依赖 的 autoconfigure 和 stater文件
这里面最重要的就是 autoconfigure
然后 默认 文件的路径 resuource下面的 spring.factories
这里面 mybatis 配置的 地方 有 扩展 以及 拦截等等。 初始化 typehandler 类型适配器 等等,在初始化参数时就创建好。
在mybatis中重要的一个就是sqlsession
通过@org.springframework.context.annotation.Configuration 和 @Bean 注解 来 注入SqlSessionFactory
进行转换为 这里面将spring的 ibatis转换成 mybatis需要的bean。
在 整个类上 有的注解@ConditionalOnClass({ SqlSessionFactory.class, SqlSessionFactoryBean.class })含义是 只有这两个类存在时,才会加载,相当于做了个校验, 判断 当不存在时就会抛出异常
以及
这里面 的注解 引入 datasource 类, 并且引入 MybatisProperties 配置,对应的属性文件配置这些。
@AutoConfigureAfter(DataSourceAutoConfiguration.class) 这里面 表示就是 有顺序的概念, 只有前面的加载成功,才能加载后期的。
自动配置-―条件依赖注解
对于datasource 这些配置前缀 和属性 就是来自@EnableConfigurationProperties 这个的
配置datasource需要数据库连接参数,mybatis也有自己的配置参数 然后所有的properties都是在 @EnableConfigurationProperties 中进行绑定的。
写一个starter 就是为了简化使用。
其实也自己做的话就一个jar包就可以,不用拆分成 两个 用 pom来引入 然后在写autoconfigure
org.springframework.boot
spring-boot-starter
2.3.5.RELEASE
org.springframework.boot
spring-boot-autoconfigure
2.3.5.RELEASE
org.springframework.boot
spring-boot-configuration-processor
2.0.6.RELEASE
@ConfigurationProperties(prefix = "boy")
public class BoyProperties {
/**
* 姓名
*/
private String name;
/**
* 年龄
*/
private int age;
/**
* 长度
*/
private int length;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public int getLength() {
return length;
}
public void setLength(int length) {
this.length = length;
}
}
@Configuration
//@ConditionalOnBean()
//@ConditionalOnMissingClass()
@EnableConfigurationProperties(BoyProperties.class)
public class BoyAutoConfiguration implements InitializingBean {
@Bean
public BoyService buildBoyService(@Autowired BoyProperties bp) {
BoyService service = new BoyService();
service.setName(bp.getName());
service.setAge(bp.getAge());
service.setLength(bp.getLength());
return service;
}
@Override
public void afterPropertiesSet() throws Exception {
// todo init
}
}
在pom中 你只需要做想要的jar包依赖就行。
# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=springboot.c.BoyAutoConfiguration
在pom中添加发布插件就行
这些注解 都可以在 jar包中可以看到。
SpringBoot参数配置规则
Spring Boot 允许您将配置外部化,以便您可以在不同的环境中使用相同的应用程序代码。您可以使用各种外部配置源,包括 Java 属性文件、YAML 文件、环境变量和命令行参数。 属性值可以通过使用 @Value 注释直接注入到你的 bean 中,通过 Spring 的 Environment 抽象访问,或者通过 @ConfigurationProperties 绑定到结构化对象。 Spring Boot 使用一个非常特殊的 PropertySource 顺序,该顺序旨在允许明智地覆盖值。属性按以下顺序考虑(较低项目的值覆盖较早的项目)
参数配置文件的约定放置位置(优先级从高到低)为:
其实这样做得好处还是在 jar包外面 找 配置文件, 其实就是为了扩展 修改配置文件。
方便线上维护和修改等等。
ConfigFileApplicationListener 类 中 是设置 spring boot 得配置文件路径
这里面帮我们看到了设置的参数。
从最后一个往前匹配的路径 并且 application 是默认配置文件名字
在自动配置名字 位置 以及 额外添加 目录,这些都可以 在这里面看到
设置 这些参数的优先级 以及怎么指定 是最近到最远 进去检查的。
$ java -jar myproject.jar --spring.config.name=girl
$ java -jar myproject.jar --spring.config.location=classpath: /default.properties,classpath:/override.properties
这里怎么查看的, 都是可以配置的。
@PropertySource 等容器加载完毕 在去加载 配置文件 这个 会将之间加载的属性给覆盖掉
并且在 配置文件中
my.secret=${random.value}
my.number=${random.int}
my.bignumber=${random.long}
my.uuid=${random. uuid}
my.number.less.than.ten=${random.int(10)}
my.number.in.range=${random.int[1024,65536]}
org.springframework.boot.env.EnvironmentPostProcessor=com.example.YourEnvironmentPostProcessor
对于资源的加载
YAML最最基础语法_vincent_hbl的博客-CSDN博客_yaml语法
@ConfigurationProperties属性名灵活绑定
类中属性名一般会采用驼峰方式,配置参数名可以用如下方式:
如果名字本身包含-_等特殊字符怎么办?用[]包裹:
bean属性参数值绑定合法性校验@Validated
直接使用notnull 等等。
Profiles详解
profile是 什么
这样可以局部的去改变其参数
application-{profile}.properties或application-{profile}.yml
spring.profiles.active=dev,hsqldb
- -spring.profiles.active=dev,hsqldb
SpringApplication.setAdditionalProfiles(...)
Auto-configuration Classes (spring.io)