一、SpringBoot项目的创建
Spring Boot项目创建的方式有很多,可以在cmd命令中通过Maven命令创建、在Eclipse中创建、使用STS创建、利用Idea创建或通过Spring Initializr网站地址http://start.spring.io/创建。在这里我使用网站地址创建为例,与Swagger2文档集成。
1.网址输入http://start.spring.io/,大致内容如下:
2.下载成功之后会生成一个zip包,解压后用我们的IntelliJ IDEA打开,目录如下:
二、基础配置分析
ZhApplication为主程序入口,可直接运行该类启动项目。resources为配置目录,用于存放一些配置信息。test文件用于单元测试使用。
1.pom.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion> <!--Maven版本->
<parent> <!---父项目配置,定义了SpringBoot版本的基础依赖,以及默认的配置内容-->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.8.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.yjkf</groupId> <!--在创建时对应项目包-->
<artifactId>zh</artifactId> <!--包名-->
<version>0.0.1-SNAPSHOT</version> <!--版本号-->
<packaging>jar</packaging> <!--打包的形式为jar,如果不写,默认也是jar,而非war的形式-->
<name>zh</name> <!--项目名-->
<description>Demo project for Spring Boot</description> <!--描述信息,可以自己修改-->
<properties>
<java.version>1.8</java.version> <!--Java版本-->
</properties>
<dependencies> <!---依赖集-->
<dependency>
<!--SpringBoot的Starter POMs采用spring-boot-starter-*的命名方式-->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins> <!--指定使用的插件-->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
2.理解spring-boot-starter
spring-boot-starter为SpringBoot提供诸多“开箱即用”的依赖模块,是基于Spring框架的“约定优先于配置(COC)”这么一个理念的实践之路,并且位于org.springfrmework.boot包或者命名的空间下。所有的spring-boot-starter-xx都有约定的默认配置,但允许我们调整这些配置以改变默认的配置行为,即为“约定优先于配置”。在这里对干预SpringBoot行为的配置方式(优先级从高到低)划分为命令、环境变量、文件系统中的配置文件、classpath中的配置文件、代码中的配置项。
3.了解spring-boot-starter-web
上面的pom.xml文件缺少了一个最常见的Web应用依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
应用中添加改依赖后,在项目下通过mvn spring-boot:run,就可以直接直接启动一个嵌入式tomcat服务Web请求的Web应用,不过这样没做处理的Web应用会在页面上返回一个whitelabel error page的错误。
spring-boot-starter-web自动为我们配置了SpringMVC必要组件,如ViewResolver,Converter,Formatter,一系列的HttpMessageConverter等。
嵌入式Web容器的层面的约定:spring-boot-starter-web默认使用嵌入式tomcat作为web容器对外提供HTTP服务,默认的使用8080端口对外监听和提供服务。如果不想使用默认的嵌入式tomcat,那么可以引入spring-boot-starter-jetty或spring-boot-starter-undertow做为替代。spring-boot-starter-web提供了很多以server.为前缀的配置项,如:server.ssl.*、server.port等,如果默认的约定满足不了需求,可以通过对IoC容器进行定制。
4.spring-boot-starter-jdbc
SpringBoot为我们默认集成了数据库访问设施,默认情况下,在没有配置任何DataSource,SpringBoot会为我们自动配置一个嵌入式的DataSource,默认的DataSource自动配置如下:
spring.datasource.url=jdbc:mysql://{host}:3306/{dataName}
spring.datasource.username={username}
spring.datasource.password={password}
SpringBoot中这些“开箱即用”的依赖很多,上面就列举了两个方便大家理解。下面时是对SpringBoot项目的基本注解进行简要刨析。
5.@SpringBootApplication
按住Ctrl键,鼠标点进后,会看到
@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 {
...
}
代码中可以看到,它定义了很多个Annotation,但重要的只有三个,即称为“三体”结构。这三个分别为@Configuration、@EnableAutoCOnfiguration、@CompnentScan。说白了我们的入口程序
@SpringBootApplication
public class ZhApplication {
public static void main(String[] args) {
SpringApplication.run(ZhApplication.class, args);
}
}
就是
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan
public class ZhApplication {
public static void main(String[] args) {
SpringApplication.run(ZhApplication.class, args);
}
}
下面在对这三个注解进行逐一分析
- @Configuration
这个注解就是JavaConfig形式的Spring IoC容器使用的那个@Configuration,所以这里的@Configuration也是一个IoC容器的配置类。为了便于理解,我把主程序这样拆解:
@Configuration
@EnableAutoConfiguration
@ComponentScan
public class ZhConfiguration{
@Bean
public Controller controller(){
return new Controller();
}
}
public class DemoApplication{
public static void main(String[] args){
SpringApplication.run(ZhCnfiguration.class, args);
}
}
ZhConfiguration定义的就是一个JavaConfig形式的IoC容器配置类。
- @EnableAutoConfiguration
@EnableAutoConfiguration与Spring框架的@Enable开头的注解类似,都是借助@Import的支持。@EnaableAutoConfiguration结构也很复杂
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration {
...
}
@EnableAutoConfiguratin可以将SpringBoot应用的所有符合条件的@Configuration配置都加载到当前SpringBoot创建并使用IoC容器,但这必须借助一个工具:SpringFactoriesLoader的支持。
SpringFactoriesLoader是Spring框架私有的一种扩展方案,主要功能是从指定的配置文件META-INF/spring.factories(格式为Key=Value)。
- @ComponentScan
它的作用就是自动扫描并加载符合条件的组件或bean定义,最终将这些bean定义加载到容器中,加载bean定义到Spring的IoC容器中,我们可以手工单个注册,所以@CmponentScan可有可无
6.application.properties文件
SpringBoot应用的配置内容都可以集中在该文件中,当然除了传统的properties文件外,还有一种被广泛推荐的YAML文件。YAML是一个高可读性,用来表达资料序列的格式。在这里,列举一个小例子对properties文件与YAML进行对比。
YAML格式:
environments:
dev:
url: http://dev.bar.com
name: Developer Setup
prod:
url: http://foo.bar.com
name: My Cool App
等价于properties文件格式:
environments.dev.url=http://dev.bar.com
environments.dev.name=Developer Setup
environments.prod.url=http://foo.bar.com
environments.prod.name=My Cool App
YAML的配置是利用阶梯化缩进方式编码,更易于阅读,编写时比较容易出错。当YAML文件与properties文件同时存在时,程序会先识别YAML文件。但YAML配置无法通过@PropertySource注解来加载。
本篇博客就说到这里吧,有不足的地方还会持续更进,这是我的笔记,也希望能为你们提供一点帮助吧!