目录
Spring-boot-maven-plugin 插件简化部署
Spring-boot-starter-parent 启动器
Spring Boot 概述与快速初始化
1、Spring Boot 用来简化 Spring 应用开发,约定大于配置,去繁从简,just run 就能创建一个独立的,产品级别的应用.
2、产生背景:J2EE 笨重的开发、繁多的配置、低下的开发效率、复杂的部署流程、第三方技术集成难度大。
3、解决方法:Spring Boot 为 J2EE 提供一站式解决方案;Spring Cloud 为分布式提供解决方案
4、Spring Boot 就是整个Spring 技术栈的一个大整合:
Spring Boot官网地址:Spring Boot
Spring Boot 在 GitHub 上的开源地址为:https://github.com/spring-projects/spring-boot
Spring Boot 官方所有开源示例:https://github.com/spring-projects/spring-boot/tree/master/spring-boot-samples
5、Spring Boot 优点:
1、快速创建独立运行的 Spring 项目以及与主流框架集成
2、使用嵌入式的 Servlet 容器,应用无需打成 WAR 包
3、starters 启动器自动依赖与版本控制
4、大量的自动配置,简化开发,也可修改默认值
5、无需配置 XML,无代码生成,开箱即用
6、生产环境的运行时应用监控
7、与云计算的天然集成
Spring Boot :用于快速开发微服务中的各个功能/小型服务
Spring Cloud :用于将各个功能/小型服务连接起来
Spring Cloud Data Flow :用于处理服务之间的数据
快速构建 Spring Boot 项目方式1:IDEA 中集成了 Spring 初始化器来进行快速构建项目 File -> New Project :
如果 https://start.spring.io/ 访问慢,则可以将 https 改成 http 试试。
快速构建 Spring Boot 项目方式2:访问 https://start.spring.io/ 官网进行构建 Spring Boot 项目然后下载,最后导入到 IDEA 中。
Spring-boot-maven-plugin 插件简化部署
1、Spring Boot 提供了如下插件可以将整个 Spring Boot 应用(即使是普通的 Java Web 应用)打包成一个可执行 Jar 文件,于是以后可以直接双击就能运行,简化了 web 应用部署。
<build>
<plugins>
<!-- spring-boot-maven-plugin插件:可以将应用打包成一个可执行的jar包;-->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
2、可以运行 "package" 将应用打包到 IDEA 工作目录下,也可以运行 "install" 将应用打包到 Maven 本地仓库下
3、运行方式一:直接双击可执行 jar 包 "helloWorld-1.0-SNAPSHOT.jar" 运行应用程序,此时在任务管理器可以看到 "javaw.exe" 的进程,结束此进程即可关闭应用程序。
4、运行方式二:命令行使用 "java -jar ****.jar" 运行应用程序。此时可以看到应用启动信息,也可以看到应用输出的所有信息,就相当于 Tomcat 的启动小黑窗口,关闭命令行窗口即可关闭应用程序。
5、应用中自己编写的类以及所有依赖的 jar 包全部打包到了下面的 "helloWorld-1.0-SNAPSHOT.jar" 中,其中就包括了集成的Tomcat 服务器
https://wangmaoxiong.blog.youkuaiyun.com/article/details/80859754#Spring Boot Maven plugin 打包应用
Spring-boot-starter-parent 启动器
1、自己的 Spring Boot 项目需要继承 spring-boot-starter-parent 项目,因为 spring-boot-starter-parent 项目继承了 spring‐boot‐dependencies。
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.1.3.RELEASE</version>
<relativePath>../../spring-boot-dependencies</relativePath>
</parent>
2、spring‐boot‐dependencies 真正管理 Spring Boot 应用里面的所有版本依赖关系,它的 pom.xml 文件也是最大的,是 Spring Boot 的版本仲裁中心;
Spring-boot-starter-web 启动器
1、spring-boot-starter-web 是 spring-boot 场景启动器(spring-boot-starter)之一,集成了 web 应用开发的常用 API ;
2、Spring Boot 将所有的功能场景都抽取出来,做成一个个starters(启动器),只需要在项目里面引入这些 starter,相关场景的所有依赖都会导入进来,要用什么功能就导入什么场景的启动器。
3、官网 Starters 可以看到所有的启动器,这些 starters 几乎涵盖了 java ee 所有常用场景,Spring Boot 对这些场景依赖的 jar 也做了严格的测试与版本控制。
4、Spring Boot 所有版本的官方文档:Index of /spring-boot/docs
@SpringBootApplication 启动类
1、@SpringBootApplication:标注在某个类上说明这个类是 SpringBoot 的主配置类,SpringBoot 就会运行这个类的 main 方法来启动 SpringBoot 应用;
2、@SpringBootApplication 注解内容如下所示:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = {
@Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {
1、@SpringBootConfiguration:是 Spring Boot 的配置类,标注在某个类上,表示这是一个Spring Boot的配置类;
2、@EnableAutoConfiguration:开启自动配置功能,以前需要手动配置的东西,现在Spring Boot帮我们自动进行配置;
3、@Import:导入所有的自动配置场景
4、@AutoConfigurationPackage:定义默认的包扫描规则,程序启动扫描加载主程序类所在的包以及下面所有子包的组件;
5、EnableAutoConfigurationImportSelector:导入哪些组件的选择器,将所有需要导入的组件以全类名的方式返回,这些组件就会被添加到容器中;会给容器中导入非常多的自动配置类(xxxAutoConfiguration);就是给容器中导入这个场景需要的所有组件,并配置好这些组件;
6、Spring Boot 在启动的时候从类路径下的 META-INF/spring.factories 中获取 EnableAutoConfiguration 指定的值,将这些值作为自动配置类导入到容器中,自动配置类就生效,帮我们进行自动配置工作;以前我们需要手动配置的东西,自动配置类都帮我们配置好,J2EE 的整体整合解决方案和自动配置都在spring-boot-autoconfigure-x.x.x.RELEASE.jar 中;
Spring Boot starter 自动配置原理
1、Spring boot 通过 Spring boot 提供的 starter 大大简化了项目初始搭建以及开发过程。
2、在使用 spring boot 搭建项目时,只需要引入官方提供的 starter,就可以直接使用,免去了各种配置。简单来讲就是引入了一些相关依赖和一些初始化的配置。
3、Spring 官方提供了很多 starter,第三方也可以定义 starter,为了加以区分, starter 从名称上进行了如下约定:
Spring 官方提供的 starter 名称格式: spring-boot-starter-XXX,例如 spring-boot-starter-web.
第三方提供的 starter 名称格式: XXX-spring-boot-starter,例如 mybatis-spring-boot-starter.
4、Spring boot 之所以能够简化项目的搭建和开发过程,主要是基于它提供的起步依赖和自动配置。
5、起步依赖:就是将具备某种功能的坐标打包到一起,同以简化依赖导入的过程。例如导入 spring-boot-starter-web, 则和 web 开发相关的 jar 包都一起导入到项目中了。
6、自动配置:就是无须手动配置 xml,自动配置并管理 bean,可以简化开发过程。
1、Spring Boot 启动的时候加载主配置类(@SpringBootApplication),开启了自动配置功能 @EnableAutoConfiguration
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration {
String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";
2、将 类路径下 META-INF/spring.factories 里面配置的所有 XxxAutoConfiguration 的值加入到了容器中;
...
# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\
org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\
org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,\
org.springframework.boot.autoconfigure.batch.BatchAutoConfiguration,\
org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration,\
org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration,\
org.springframework.boot.autoconfigure.cloud.CloudAutoConfiguration,\
org.springframework.boot.autoconfigure.context.ConfigurationPropertiesAutoConfiguration,\
org.springframework.boot.autoconfigure.context.MessageSourceAutoConfiguration,\
org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration,\
org.springframework.boot.autoconfigure.couchbase.CouchbaseAutoConfiguration,\
...
3、每一个这样的 xxxAutoConfiguration 类都是容器中的一个组件,都加入到容器中,用他们来做自动配置。
4、每一个自动配置类进行自动配置功能,以 HttpEncodingAutoConfiguration(Http 编码自动配置)为例解释自动配置原理。
@Configuration //表示这是一个配置类,与以前编写的配置文件一样,也可以给容器中添加组件
@EnableConfigurationProperties({HttpEncodingProperties.class}) //启动指定类的
//ConfigurationProperties功能;将配置文件中对应的值和HttpEncodingProperties绑定起来;并把
//HttpEncodingProperties加入到ioc容器中
@ConditionalOnWebApplication(
type = Type.SERVLET
) //判断当前应用是否是web应用,如果是,当前配置类生效
@ConditionalOnClass({CharacterEncodingFilter.class}) //判断当前项目有没有这个类
//CharacterEncodingFilter;SpringMVC中进行乱码解决的过滤器;
@ConditionalOnProperty(
prefix = "spring.http.encoding",
value = {"enabled"},
matchIfMissing = true
) //判断配置文件中是否存在某个配置 spring.http.encoding.enabled; matchIfMissing = true:如果不存在,判断也是成立的
public class HttpEncodingAutoConfiguration {
//他已经和SpringBoot的配置文件映射了
private final HttpEncodingProperties properties;
//只有一个有参构造器的情况下,参数的值就会从容器中拿
public HttpEncodingAutoConfiguration(HttpEncodingProperties properties) {
this.properties = properties;
}
@Bean //给容器中添加一个组件,这个组件的某些值需要从properties中获取
@ConditionalOnMissingBean(CharacterEncodingFilter.class) //判断容器没有这个组件?
public CharacterEncodingFilter characterEncodingFilter() {
CharacterEncodingFilter filter = new OrderedCharacterEncodingFilter();
filter.setEncoding(this.properties.getCharset().name());
filter.setForceRequestEncoding(this.properties.shouldForce(Type.REQUEST));
filter.setForceResponseEncoding(this.properties.shouldForce(Type.RESPONSE));
return filter;
}
5、根据当前不同的条件判断,决定这个配置类是否生效?一但这个配置类生效,这个配置类就会给容器中添加各种组件,这些组件的属性是从对应的 Xxxproperties 类中获取的,这些类里面的每一个属性又是和配置文件绑定的;所有在配置文件中能配置的属性都是在XxxProperties 类中封装的;配置文件能配置什么就可以参照某个功能对应的这个属性类。
@ConfigurationProperties(
prefix = "spring.http.encoding"
) //从配置文件中获取指定的值和bean的属性进行绑定
public class HttpEncodingProperties {
public static final Charset DEFAULT_CHARSET;
private Charset charset;
private Boolean force;
private Boolean forceRequest;
private Boolean forceResponse;
private Map<Locale, Charset> mapping;