一、解析 pom.xml 文件:
(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> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.4.1</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.example</groupId> <artifactId>demo</artifactId> <version>0.0.1-SNAPSHOT</version> <name>demo</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.postgresql</groupId> <artifactId>postgresql</artifactId> <scope>runtime</scope> </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 的父级依赖:
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.4.1</version> <relativePath/> <!-- lookup parent from repository --> </parent>
有了这个标签,说明当前项目才是一个Spring Boot项目。
spring-boot-starter-parent 用来提供相关的 Maven 默认依赖,使用后,常用的包依赖就可以省去version 标签。
二、应用入口类 DemoApplication.java
Spring Boot 项目通常有一个名为 *Application 的入口类,入口类里有一个 main 方法, 这个 main 方法其实就是一个标准的 Java 应用的入口方法。
1、@SpringBootApplication 注解的作用:
@SpringBootApplication 是 Spring Boot 的核心注解,它是一个组合注解,该注解组合了:@Configuration、@EnableAutoConfiguration、@ComponentScan。若是不用 @SpringBootApplication 注解也可以使用这三个注解代替。
2、@EnableAutoConfiguration 注解的作用:
(1)、让Spring Boot 根据类路径中的jar 包依赖为当前项目自动配置,例如,添加 Spring-boot-starter-web 依赖,会自动添加 Tomcat 和 Spring MVC 的依赖,那么Spring Boot 会对 Tomcat 和 Spring MVC 进行自动配置。
(2)、Spring Boot 自动扫描@SpringBootApplication所在类的同级包以及下级包里的Bean,所以入口类建议就配置在 groupId+ artifactId 组合的包名下。(这里为 com.example.demo 包)
3、@EnableAutoConfiguration 注解的原理:
从@Import的类可以找到下面自动加载自动配置的映射。
org.springframework.core.io.support.SpringFactoriesLoader.loadFactoryNames(Class<?>, ClassLoader) public static List<String> loadFactoryNames(Class<?> factoryClass, ClassLoader classLoader) { String factoryClassName = factoryClass.getName(); try { Enumeration<URL> urls = (classLoader != null ? classLoader.getResources(FACTORIES_RESOURCE_LOCATION) : lassLoader.getSystemResources(FACTORIES_RESOURCE_LOCATION)); List<String> result = new ArrayList<String>(); while (urls.hasMoreElements()) { URL url = urls.nextElement(); Properties properties = PropertiesLoaderUtils.loadProperties(new UrlResource(url)); String factoryClassNames = properties.getProperty(factoryClassName); result.addAll(Arrays.asList(StringUtils.commaDelimitedListToStringArray(factoryClassNames))); } return result; } catch (IOException ex) { throw new IllegalArgumentException("Unable to load [" + factoryClass.getName() + "] factories from location [" + FACTORIES_RESOURCE_LOCATION + "]", ex); }} 这个方法会加载类路径及所有jar包下META-INF/spring.factories配置中映射的自动配置的类 /** * The location to look for factories. * <p>Can be present in multiple JAR files. */
public static final String FACTORIES_RESOURCE_LOCATION ="META-INF/spring.factories";
查看Spring Boot自带的自动配置的包: spring-boot-autoconfigure-1.5.6.RELEASE.jar,打开其中的META-INF/spring.factories文件会找到自动配置的映射。
# 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,\ ...
再来看看数据源自动配置的实现注解
@Configuration @ConditionalOnClass({DataSource.class,EmbeddedDatabaseType.class}) @EnableConfigurationProperties(DataSourceProperties.class) @Import({Registrar.class, DataSourcePoolMetadataProvidersConfiguration.class}) public class DataSourceAutoConfiguration { ...
@Configuration,@ConditionalOnClass就是自动配置的核心,首先它得是一个配置文件,其次根据类路径下是否有这个类去自动配置。
三、Spring Boot 的配置文件
用过 Spring Boot 的都知道在 Spring Boot 中有以下两种配置文件
- bootstrap (.yml 或者 .properties)
- application (.yml 或者 .properties)
(1)、bootstrap 与application 的区别与联系
Spring Cloud 构建于 Spring Boot 之上,在 Spring Boot 中有两种上下文,一种是 bootstrap, 另外一种是 application, bootstrap 是应用程序的父上下文,也就是说 bootstrap 加载优先于 applicaton。bootstrap 主要用于从额外的资源来加载配置信息,还可以在本地外部配置文件中解密属性。这两个上下文共用一个环境,它是任何Spring应用程序的外部属性的来源。bootstrap 里面的属性会优先加载,它们默认也不能被本地相同配置覆盖。
因此,对比 application 配置文件,bootstrap 配置文件具有以下几个特性。
- boostrap 由父 ApplicationContext 加载,比 applicaton 优先加载
- boostrap 里面的属性不能被覆盖
(2)、bootstrap与application 的应用场景
application 配置文件这个容易理解,主要用于 Spring Boot 项目的自动化配置。
bootstrap 配置文件有以下几个应用场景。
- 使用 Spring Cloud Config 配置中心时,这时需要在 bootstrap 配置文件中添加连接到配置中心的配置属性来加载外部配置中心的配置信息;
- 一些固定的不能被覆盖的属性
- 一些加密/解密的场景;
application.properties 配置文件,在main/resources 目录下:
Spring Boot 不仅支持properties 配置文件,还支持 yaml 语言的配置文件。
yaml是以数据为中心的语言,在配置数据的时候具有面向对象的特征。
Spring Boot 的全局配置文件的作用是对一些默认配置进行修改.
修改 application.properties 配置文件示例:
(1)、打开resources 目录下: application.properties 文件
(2)、在这里我们可以设置访问的端口,将Tomcat 默认的端口设置8080 ,并将默认的访问路径从“/” 修改为 “/cn”时,再访问 http://localhost:8080/ 时什么都有的,此时要访问 hello 要使用 http://localhost:8080/cn/hello
(3)、在 HelloController.java 类中使用 @Value 来获取配置属性,代码(请看注释):
server.port=8080 server.servlet.context-path=/cn name=xiao ming url=http://www.baidu.com @RestController public class HelloController { // 获取.yml 文件中值 @Value("${name}") private String name; // 获取 age @Value("${url}") private String url; //路径映射,对应浏览器访问的地址,访问该路径则执行下面函数 @RequestMapping("/hello") public String hello() { return "name = "+ name +" url:" + url; } }
(4)、重启 Spring Boot ,输入地址:http://localhost:8080/cn/hello 能看到结果:
(5)、此时如果配置的中文有乱码,需要设置文件编码格式为UTF8