spring boot - JiyangM/spring GitHub Wiki

为什么我们要用 Spring Boot?

  • 独立运行

    内置了Tomcat/ Jetty 等容器

  • 简化配置

    基于注解完成自动装配

  • 自动配置

    Spring Boot 的开启注解是:@SpringBootApplication,其实它就是由下面三个注解组成的: @Configuration @ComponentScan @EnableAutoConfiguration

    @EnableAutoConfiguration 注解了,它能根据类路径下的 jar 包和配置动态加载配置和注入bean。

    举个例子,比如我在 lib 下放一个 druid 连接池的 jar 包,然后在 application.yml 文件配置 druid 相关的参数,Spring Boot 就能够自 动配置所有我们需要的东西,如果我把 jar 包拿掉或者把参数去掉,那 Spring Boot 就不会自动配置。

    这样我们就能把许多功能做成公共的自动配置的启动器(starters),其实 druid 连接池就是这么做的,它提供了针对 Spring Boot 的启动 器:druid-spring-boot-starter。

    在spring程序main方法中 添加@SpringBootApplication或者@EnableAutoConfiguration 会自动去maven中读取每个starter中的spring.factories文件该文件里配置了所有需要被创建spring容器中的bean

  • 无代码生成和XML配置

  • 应用监控

    spring actuator模块公开一组REST端点,这些端点可以作为HTTP URL直接访问,以检查状态。

  • 上手容易


SpringBoot几个常用的注解

(1)@RestController和@Controller指定一个类,作为控制器的注解

(2)@RequestMapping方法级别的映射注解,这一个用过Spring MVC的小伙伴相信都很熟悉

(3)@EnableAutoConfiguration和@SpringBootApplication是类级别的注解,根据maven依赖的jar来自动猜测完成正确的spring的对应配置,只要引入了spring-boot-starter-web的依赖,默认会自动配置Spring MVC和tomcat容器

(4)@Configuration类级别的注解,一般这个注解,我们用来标识main方法所在的类,完成元数据bean的初始化。

(5)@ComponentScan类级别的注解,自动扫描加载所有的Spring组件包括Bean注入,一般用在main方法所在的类上

(6)@ImportResource类级别注解,当我们必须使用一个xml的配置时,使用@ImportResource和@Configuration来标识这个文件资源的类。

(7)@Autowired注解,一般结合@ComponentScan注解,来自动注入一个Service或Dao级别的Bean

(8)@Component类级别注解,用来标识一个组件,比如我自定了一个filter,则需要此注解标识之后,Spring Boot才会正确识别。


有什么Spring Boot启动器可供选择吗?

mybatis-spring-boot-starter

spring-boot-starter: 核心启动器,包括自动配置支持,日志记录和YAML

spring-boot-starter-aop: 使用Spring AOP和AspectJ进行面向方面编程的启动器

spring-boot-starter-data-jpa: 使用Spring Data JPA和Hibernate的启动器

spring-boot-starter-jdbc: 用于将JDBC与HikariCP连接池一起使用的启动器

spring-boot-starter-security: 使用Spring Security的启动器

spring-boot-starter-test: 用于测试Spring Boot应用程序的启动器

spring-boot-starter-web: 用于构建Web的入门者,包括使用Spring MVC的RESTful应用程序


Spring Boot 与 Spring 的区别

  • Spring Boot可以建立独立的Spring应用程序;
  • 内嵌了如Tomcat,Jetty和Undertow这样的容器,也就是说可以直接跑起来,用不着再做部署工作了。
  • 无需再像Spring那样搞一堆繁琐的xml文件的配置;
  • 可以自动配置Spring;

SpringBoot2.0新增什么?

1.支持 Java9

2.基于 Spring5 构建

3.Tomcat 升级到 8.5


我想要SpringBoot自动读取我的自定义配置,该做哪些事情?

写一个相应的starter 目的: 判断是否了解和写过Spring Boot Starter,主要是META-INF目录下的spring.factories文件和AutoConfiguration。了解AOP更佳。


SpringBoot和SpringCloud,请你谈谈对他们的理解?

SpringBoot专注于快速方便的开发单个个体微服务。

SpringCloud是关注全局的微服务协调、整理、治理的框架,它将SpringBoot开发的单体整合并管理起来。

SpringBoot可以离开SpringCloud独立使用开发项目,但是SpringCloud离不开SpringBoot,属于依赖关系。


Spring Boot 的核心配置文件有哪几个?它们的区别是什么?

Spring Boot 的核心配置文件是 application 和 bootstrap 配置文件。

application 配置文件这个容易理解,主要用于 Spring Boot 项目的自动化配置。

bootstrap 配置文件有以下几个应用场景。

使用 Spring Cloud Config 配置中心时,这时需要在 bootstrap 配置文件中添加连接到配置中心的配置属性来加载外部配置中心的配置信息; 一些固定的不能被覆盖的属性; 一些加密/解密的场景;

Spring Boot 的配置文件有哪几种格式?它们有什么区别?

.properties 和 .yml,它们的区别主要是书写格式不同。 另外,.yml 格式不支持 @PropertySource 注解导入配置。可以使用@Value注解或者将同一组类型的配置属性映射成一个类然后使用@ConfigurationPropeerties来实现。 .yml支持数组。


spring boot 模块:

  • spring-boot-test
  • spring-boot-starters
  • spring-boot-actuator
  • spring-boot-autoconfigure
  • spring-boot-devtools
  • spring-boot-cli
  • spring-boot-tools

@EnableAutoConfiguration自动配置原理

通过@EnableAutoConfiguration启用Spring应用程序上下文的自动配置,这个注解会导入一个EnableAutoConfigurationImportSelector的类,而这个类会去读取一个spring.factories下key为EnableAutoConfiguration对应的全限定名的值。

这个spring.factories里面配置的那些类,主要作用是告诉Spring Boot这个stareter所需要加载的那些xxxAutoConfiguration类,也就是你真正的要自动注册的那些bean或功能。

然后,我们实现一个spring.factories指定的类,标上@Configuration注解,一个starter就定义完了。

如果想从自己的starter种读取应用的starter工程的配置,只需要在入口类上加上如下注解即可: @EnableConfigurationProperties(MyProperties.class)


Spring Boot 中的 starter 到底是什么 ?

这个 Starter 并非什么新的技术点,基本上还是基于 Spring 已有功能来实现的。首先它提供了一个自动化配置类,一般命名为 XXXAutoConfiguration ,在这个配置类中通过条件注解来决定一个配置是否生效(条件注解就是 Spring 中原本就有的),然后它还会提供一系列的默认配置,也允许开发者根据实际情况自定义相关配置,然后通过类型安全的属性注入将这些配置属性注入进来,新注入的属性会代替掉默认属性。正因为如此,很多第三方框架,我们只需要引入依赖就可以直接使用了。

当然,开发者也可以自定义 Starter,自定义 Starter 可以参考:徒手撸一个 Spring Boot 中的 Starter ,解密自动化配置黑魔法!。


自定义start

自定义 Starter 自动化配置需满足两个条件:

  • 能够生成 Bean,并注册到 Bean 容器中;
  • 能够自动配置项目所需要的配置。

在这里创建一个 spring-boot-starter-helloworld 项目作为例子,实现以上两点。 引入 SpringBoot 自动化配置依赖:

<dependencies>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-autoconfigure</artifactId>
    <version>1.5.9.RELEASE</version>
  </dependency>
</dependencies>

复制代码spring-boot-starter-helloworld 只是作为例子演示自定义 starter 的过程,实现的功能很简单就是创建一个 HelloworldService 的,并配置 sayHello() 方法打印的语句。

public class HelloworldService {

  private String words;

  private String getWords() {
    return words;
  }

  public void setWords(String words) {
    this.words = words;
  }

  public String sayHello() {
     return "hello, " + words;
  }
}
```java
复制代码创建属性类prefix = "helloworld"代表该项目在属性文件中配置的前缀即可以在属性文件中通过 helloworld.words=springboot就可以改变属性类字段 words 的值了。
```java
@ConfigurationProperties(prefix = "helloworld")
public class HelloworldProperties {
  public static final String DEFAULT_WORDS = "world";

  private String words = DEFAULT_WORDS;

  public String getWords() {
    return words;
  }

  public void setWords(String words) {
    this.words = words;
  }
}
```java
复制代码创建自动化配置类这个相当于就是一个普通的 Java 配置类可以在这里创建 Bean并可获得与 application.properties 属性文件相对应的属性类的 Bean。

```java
// 相当于一个普通的 java 配置类
@Configuration
// 当 HelloworldService 在类路径的条件下
@ConditionalOnClass({HelloworldService.class})
// 将 application.properties 的相关的属性字段与该类一一对应,并生成 Bean
@EnableConfigurationProperties(HelloworldProperties.class)
public class HelloworldAutoConfiguration {

  // 注入属性类
  @Autowired
  private HelloworldProperties hellowordProperties;

  @Bean
  // 当容器没有这个 Bean 的时候才创建这个 Bean
  @ConditionalOnMissingBean(HelloworldService.class)
  public HelloworldService helloworldService() {
    HelloworldService helloworldService = new HelloworldService();
    helloworldService.setWords(hellowordProperties.getWords());
    return helloworldService;
  }
}

复制代码在 META-INF 目录下创建 spring.factories,这个属性文件可重要啦,因为 SpringBoot 自动化配置最终就是要扫描 META-INF/spring.factories 来加载项目的自动化配置类。

# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.objcoding.starters.helloworld.Hello

spring-boot-start-patent

我一直在用的是maven,而且使用maven有些优势–spring-boot-starter-parent,这个部件是maven独有的。

这次我们从这里开始学习。

Maven的用户可以通过继承spring-boot-starter-parent项目来获得一些合理的默认配置。这个parent提供了以下特性:

  • 默认使用Java 8
  • 使用UTF-8编码
  • 一个引用管理的功能,在dependencies里的部分配置可以不用填写version信息,这些version信息会从spring-boot-dependencies里得到继承。
  • 识别过来资源过滤(Sensible resource filtering.)
  • 识别插件的配置(Sensible plugin configuration (exec plugin, surefire, Git commit ID, shade).)
  • 能够识别application.properties和application.yml类型的文件,同时也能支持profile-specific类型的文件(如: application-foo.properties and application-foo.yml,这个功能可以更好的配置不同生产环境下的配置文件)。

Spring boot 自动装配

https://juejin.im/post/5b679fbc5188251aad213110

⚠️ **GitHub.com Fallback** ⚠️