Springboot小知识(1):启动类与配置
一、启动类(引导类)
在通常情况下,你创建的Spring应用项目都会为你自动生成一个启动类,它是这个应用的起点。
在Spring Boot中,引导类(也称为启动类,通常是main
方法所在的类)是整个应用程序的入口点,用于引导和启动Spring Boot应用。它主要用来加载Spring的上下文
、自动配置
并启动内嵌的服务器
。
1.1 启动类重要注解
一个经典的SpringBoot启动类如下代码所示:
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
@SpringBootApplication
注解是Spring Boot启动类的核心,它包含了三个重要注解:
- @SpringBootConfiguration:这个注解实际上是
@Configuration
的派生注解,表示该类是一个Spring配置类,可以定义@Bean方法。Spring会将这些方法返回的对象作为Bean,添加到应用上下文中。 - @EnableAutoConfiguration:这是Spring Boot的自动配置核心,通过这个注解,Spring Boot会根据项目中引入的依赖,自动配置各种组件。例如,如果项目中有
spring-boot-starter-web
依赖,那么Spring Boot会自动配置一个Web环境,包含内嵌的Tomcat
服务器、DispatcherServlet等。 - @ComponentScan:这个注解会扫描指定包及其子包下的所有@Component、@Service、@Repository、@Controller等注解,将它们作为Bean加载到Spring的上下文中。默认情况下,它会扫描引导类所在包及其子包,所以通常建议将引导类放在项目根包下。
1.2 SpringApplication.run的功能
在引导类中,SpringApplication.run(Application.class, args)用于启动Spring Boot应用,它执行了多项初始化工作,具体包括以下几个步骤:
-
初始化SpringApplication对象:SpringApplication类会根据应用的类型(通常是SpringBootServletInitializer或SpringApplication)决定启动方式。这个类会加载各类初始化器ApplicationContextInitializer和监听器ApplicationListener,同时准备一些默认设置。
-
启动引导和环境配置:Spring Boot会初始化Environment对象,加载系统属性、环境变量以及应用配置文件(如application.properties或application.yml),将这些内容加载到Spring上下文环境中。
-
创建并配置ApplicationContext:根据应用的类型选择具体的ApplicationContext类型,一般是AnnotationConfigApplicationContext或WebApplicationContext,用来管理应用中的所有Bean。
-
自动加载Spring Boot特性:通过@EnableAutoConfiguration,Spring Boot会扫描所有自动配置类,通常是位于META-INF/spring.factories文件中的@Configuration类,自动配置相应的组件(如数据库连接池、数据源、JPA配置等)。
-
启动内嵌Web服务器(如有):如果是Web应用,Spring Boot会启动一个内嵌的
Web服务器(例如Tomcat或Jetty)
,并将DispatcherServlet等必要的组件注入到应用上下文中,使应用可以接收和处理HTTP请求。 -
启动ApplicationRunner和CommandLineRunner:如果应用中有实现了ApplicationRunner或CommandLineRunner接口的类,Spring Boot会在启动完成后运行这些类中的run方法。它们常用于在应用启动后执行一些初始化任务。
1.3 引导类的实际运行机制
整个引导类运行的关键在于SpringApplication.run()方法,它的运行机制大致如下:
-
加载监听器:Spring Boot使用各种事件来驱动应用启动流程,例如,加载ApplicationStartingEvent、ApplicationPreparedEvent等一系列事件,在应用生命周期的不同阶段进行通知。你可以创建自定义的监听器来监听这些事件。
-
设置默认属性:Spring Boot会根据项目结构和配置文件设置默认属性,例如端口号、环境配置、日志配置等。你可以在application.properties或application.yml中进行自定义。
-
创建上下文和刷新上下文:Spring Boot会创建应用的ApplicationContext,并刷新它。ApplicationContext会自动管理所有Spring组件和Bean的生命周期,注入相应依赖,并准备服务。
-
调用生命周期钩子和运行应用:在上下文加载完成后,Spring Boot会调用所有实现SmartLifecycle接口的组件,执行它们的启动逻辑。之后,启动内嵌的服务器,监听请求端口,应用正式启动并进入运行状态。
1.4 使用引导类的配置和扩展
你可以通过自定义SpringApplication来更细粒度地控制Spring Boot的启动行为:
- 设置Banner:可以通过SpringApplication.setBanner()或在application.properties中配置自定义启动Banner。
- 配置监听器:可以通过SpringApplication.addListeners()方法,添加自定义监听器来捕获启动过程中不同阶段的事件。
- 配置初始化器:通过SpringApplication.addInitializers()方法,自定义上下文的初始化行为。
可能看到这里的同学有点蒙,关于基础篇里面,我们只需要知道启动类大致干了点啥就行,究竟是怎么干的,为什么这么干的,这属于核心原理了,到时候放在原理那里讲解,上面每一个小点单独拉出来讲都要参考无数篇文献,都能写一个万字以上的论文,对于基础来讲无须理解那么多,知道有这么个东西为主。
那么现在启动main方法,同时启动了内置的服务器(核心注解中的@EnableAutoConfiguration有相关依赖的话),这样我们整个程序就运行起来了。
二、配置
2.1 application.properties
这是Spring Boot最常用的配置文件,位于src/main/resources
目录下。文件名一般为
Spring Boot会根据这些配置文件自动加载相关属性。如果上述三个文件中关于某一项的配置全部存在(例如port),则其优先级顺序为:
常见配置项
服务器端口:server.port=8080(修改服务器端口)
数据源配置:
spring.datasource.url=jdbc:mysql://localhost:3306/dbname
spring.datasource.username=root
spring.datasource.password=root
日志配置:logging.level.com.example=DEBUG(设置日志级别)
邮件配置:spring.mail.host=smtp.example.com
2.2 多环境配置
Spring Boot支持根据环境自动加载不同的配置文件,例如application-dev.properties、application-prod.properties等。通过spring.profiles.active来指定当前环境:
spring.profiles.active=dev
例子如下:
他在目录中就会有两个配置文件,其中的yml可以如上图所示,在需要参数的地方以变量名称占位,在dev文件中填写具体的参数,区分开开发环境参数与运行环境参数。
yml中:
dev中:
作为配置来讲,重中之重就是:后面有一个空格,如果没有空格则配置均会失效!
2.3 读取配置文件中的参数
使用@Value(“${}”)注解即可从配置中读取参数赋值给变量,用例如下:
用例代码,这里注意括号中的变量名称需要与配置相同,但是具体的变量名不需要与配置中的变量名相同
输出:
2.4 配置文件中引用属性
2.5 使用类封装属性
使用:@ConfigurationProperties
这个注解完成对类的封装,用例如下所示:
配置文件:
类文件:
输出: