Spring Boot 概述、初始化器、spring-boot-maven-plugin 插件简化部署、starter 自动配置原理

目录

Spring Boot 概述与快速初始化

Spring-boot-maven-plugin 插件简化部署

Spring-boot-starter-parent 启动器

Spring-boot-starter-web 启动器

@SpringBootApplication 启动类

 Spring Boot starter 自动配置原理


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.csdn.net/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;

  • 5
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蚩尤后裔-汪茂雄

芝兰生于深林,不以无人而不芳。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值