Spring Boot项目的创建与基础配置分析

一、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);
	}
}

下面在对这三个注解进行逐一分析

  1. @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容器配置类。

  1. @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)。

  1. @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注解来加载。

本篇博客就说到这里吧,有不足的地方还会持续更进,这是我的笔记,也希望能为你们提供一点帮助吧!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值