目录
SpringBoot原理分析_核心注解
YAML文件_配置文件介绍
YAML文件_自定义配置简单数据
YAML文件_自定义配置对象数据
YAML文件_自定义配置集合数据
YAML文件_读取配置文件的数据
使用@ConfigurationProperties读取
YAML文件_占位符的使用
YAML文件_配置文件存放位置及优先级
YAML文件_bootstrap配置文件
SpringBoot注册web组件_注册Servlet
SpringBoot注册web组件_注册Filter
SpringBoot注册web组件_注册Listener
SpringBoot原理分析_核心注解
@SpringBootApplication
标注是SpringBoot的启动类。 此注解等同于
@SpringBootConfiguration + @EnableAutoConfiguration + @ComponentScan 。
@SpringBootConfiguration
@SpringBootConfiguration 是 @Configuration 的派生注解,跟 @Configuration 功能一 致,标注这个类是一个配置类,只不过 @SpringBootConfiguration 是 Springboot的注解,而 @Configuration 是Spring的注解
@EnableAutoConfiguration
SpringBoot自动配置注解。 等同于
@AutoConfigurationPackage + @Import(AutoConfigurationImportSelector.class)
@AutoConfigurationPackage
自动扫描包的注解,它会自动扫描主类所在包下所有加了注解的类 (@Controller,@Service等),以及配置类 (@Configuration)。
@Import({AutoConfigurationImportSelector.class})
该注解会导入 AutoConfifigurationImportSelector 类对象,该对象会从 META-INF/spring.factories 文件中读取配置类的名称列表。
@ComponentScan
该注解会扫描项目,自动装配一些项目启动需要的Bean。
YAML文件_配置文件介绍
SpringBoot项目中,大部分配置都有默认值,但如果想替换默认配 置的话,就可以使用application.properties或者application.yml进 行配置。
SpringBoot默认会从resources目录下加载application.properties 或application.yml文件。其中,application.properties文件是键值 对类型的文件,之前一直在使用,所以我们不再对properties文件 进行阐述。
https://docs.spring.io/spring-boot/docs/2.7.0-M1/reference/ htmlsingle/#application-properties.server可以查找配置文件 如何覆盖SpringBoot项目的默认配置。
除了properties文件外,SpringBoot还支持YAML文件进行配置。 YAML文件的扩展名为 .yml 或 .yaml ,它的基本要求如下:
1 大小写敏感
2 使用缩进代表层级关系
3 相同的部分只出现一次
比如使用properties文件配置tomcat端口: server.port=8888
而使用YAML文件配置tomcat端口:
server:
port: 8888
YAML文件_自定义配置简单数据
除了覆盖默认配置,我们还可以在YAML文件中配置其他信息以便我 们在项目中使用。配置简单数据的方式如下:
语法:
数据名: 值
示例代码:
name: baizhan
注意:value之前有一个空格
YAML文件_自定义配置对象数据
对象:
属性名1: 属性值
属性名2: 属性值
# 或者
对象: {属性名1: 属性值,属性名2: 属性值}
示例代码:
# 学生1
student1:
sex: female
age: 10
address: beijing
# 学生2
student2: {sex: female,age: 10,address: beijing}
属性名前面的空格个数不限,在yml语法中,相同缩进代表同一 个级别,只要每个属性前的空格数一样即可。
YAML文件_自定义配置集合数据
语法
集合:
- 值1
- 值2
# 或者
集合: [值1,值2]
示例代码
# 城市
city1:
- beijing
- tianjin
- shanghai
- chongqing
city2:
[beijing,tianjin,shanghai,chongqing]
# 集合中的元素是对象
students:
- name: xiaotong
age: 18
score: 100
- name: shangxuetang
age: 28
score: 88
- name: chengxuyuan
age: 38
score: 90
注意:值与之前的 - 之间存在一个空格
YAML文件_读取配置文件的数据
使用@Value读取
我们可以通过@Value注解将配置文件中的值映射到一个Spring管理 的Bean的字段上,用法如下:
配置文件
name: baizhan
student:
sex: female
age: 10
address: beijing
city1:
- beijing
- tianjin
- shanghai
- chongqing
students:
- name: xiaotong
age: 18
score: 100
- name: shangxuetang
age: 28
score: 88
- name: chengxuyuan
age: 38
score: 90
读取配置文件数据:
@Controller
public class YmlController1 {
@Value("${name}")
private String name;
@Value("${student1.age}")
private int age;
@Value("${city1[0]}")
private String city1;
@Value("${students[0].score}")
private double score1;
@RequestMapping("/yml1")
@ResponseBody
public String yml1(){
System.out.println(name);
System.out.println(age);
System.out.println(city1);
System.out.println(score1);
return "hello springboot!";
}
}
@Value只能映射简单数据类型,不能将yaml文件中的对 象、集合映射到属性中。
使用@ConfigurationProperties读取
通过 @ConfigurationProperties(prefifix="对象") 可以将配置文件中的配置自动与实 体进行映射,这样可以将yml文件中配置的对象属性直接映射到 Bean当中。
配置文件
user:
id: 10001
username: shangxuetang
address:
- beijing
- tianjin
- shanghai
- chongqing
grades:
- subject: math
score: 100
- subject: english
score: 90
实体类
public class Grade {
private String subject;
private double score;
// 省略getter/setter/tostring
}
读取配置文件
@Controller
@ConfigurationProperties(prefix = "user")
public class YmlController2 {
private int id;
private String username;
private List<String> address;
private List<Grade> grades;
@RequestMapping("/yml2")
@ResponseBody
public String yml2(){
System.out.println(id);
System.out.println(username);
System.out.println(address);
System.out.println(grades);
return "hello springboot!";
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public List<String> getAddress() {
return address;
}
public void setAddress(List<String> address) {
this.address = address;
}
public List<Grade> getGrades() {
return grades;
}
public void setGrades(List<Grade> grades) {
this.grades = grades;
}
}
YAML文件_占位符的使用
YAML文件中可以使用 ${} 占位符,它有两个作用:
使用配置文件中的值
编写配置文件
server:
port: 8888
myconfig:
myport: ${server.port}
读取配置文件
@Controller
public class YmlController3 {
@Value("${myconfig.myport}")
private int port;
@RequestMapping("/yml3")
@ResponseBody
public String yml3(){
System.out.println(port);
return "hello springboot!";
}
}
使用框架提供的方法
SpringBoot框架提供了一些生成随机数的方法可以在yml文件中使 用:
用法如下:
# 随机生成tomcat端口
server:
port: ${random.int(1024,9999)}
YAML文件_配置文件存放位置及优先级
配置文件有如下存放位置:
- 项目根目录下
- 项目根目录下的/config子目录中
- 项目的resources目录中
- 项目的resources下的/config子目录中
这些目录下都可以存放两类配置文件,分别是 application.yml 和 application.properties ,这些配置文件的优先级从高到低依次为:
项目根目录下的/config子目录中
- config/application.properties
- config/application.yml
项目根目录下
- application.properties
- application.yml
项目的resources下的/config子目录中
- resources/config/application.properties
- resources/config/application.yml
项目的resources目录中
- resources/application.properties
- resources/application.yml
优先级高的文件会覆盖优先级低的文件中的配置
YAML文件_bootstrap配置文件
SpringBoot中有两种容器对象,分别是bootstrap和application, bootstrap是应用程序的父容器,bootstrap加载优先于 applicaton。bootstrap配置文件主要对bootstrap容器进行配置, application配置文件是对applicaton容器进行配置。 bootstrap配置文件也同样支持properties和yml两种格式,主要用 于从外部引入Spring应用程序的配置。 bootstrap配置文件特征
- boostrap由父ApplicationContext加载,比applicaton优先加载。
- boostrap里面的属性不能被覆盖。
bootstrap与application的应用场景
- application配置文件主要用于SpringBoot项目的自动化配 置。
- bootstrap配置文件有以下几个应用场景。
- 使用Spring Cloud Config配置中心时,需要在bootstrap配置文件中添加连接到配置中 心的配置属性来加载外部配置中心的配置信息。
- 一些固定的不能被覆盖的属性。
- 一些加密/解密的场景。
SpringBoot注册web组件_注册Servlet
由于SpringBoot项目没有web.xml文件,所以无法在web.xml中注 册web组件,SpringBoot有自己的方式注册web组件。
注册方式一
- 编写servlet
@WebServlet("/first")
public class FirstServlet extends
HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response){
System.out.println("First Servlet........");
}
}
- 启动类扫描web组件
@SpringBootApplication
//SpringBoot启动时扫描注册注解标注的Web组件
@ServletComponentScan
public class Springbootdemo2Application {
public static void main(String[] args)
{
SpringApplication.run(Springbootdemo2Application.class, args);
}
}
注册方式二
- 编写servlet
public class SecondServlet extends
HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response){
System.out.println("Second Servlet........");
}
}
- 使用配置类注册servlet
@Configuration
public class ServletConfig {
//ServletRegistrationBean可以注册
Servlet组件,将其放入Spring容器中即可注册Servlet
@Bean
public ServletRegistrationBean getServletRegistrationBean(){
// 注册Servlet组件
ServletRegistrationBean bean = new ServletRegistrationBean(new SecondServlet());
// 添加Servlet组件访问路径
bean.addUrlMappings("/second");
return bean;
}
}
SpringBoot注册web组件_注册Filter
注册方式一
- 编写filter
@WebFilter(urlPatterns = "/first")
public class FirstFilter implements Filter
{
@Override
public void init(FilterConfig filterConfig) throws ServletException { }
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,FilterChain filterChain) throws IOException, ServletException {
System.out.println("进入First Filter");
filterChain.doFilter(servletRequest,servletResponse);
System.out.println("离开First Filter");
}
@Override
public void destroy() { }
}
- 启动类扫描web组件
@SpringBootApplication
//SpringBoot启动时扫描注册注解标注的Web组件
@ServletComponentScan
public class Springbootdemo2Application {
public static void main(String[] args)
{
SpringApplication.run(Springbootdemo2Appl ication.class, args);
}
}
注册方式二
- 编写filter
public class SecondFilter implements
Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException { }
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("进入Second Filter");
filterChain.doFilter(servletRequest,servletResponse);
System.out.println("离开Second Filter");
}
@Override
public void destroy() { }
}
- 使用配置类注册filter
@Configuration
public class FilterConfig {
@Bean
public FilterRegistrationBean getFilterRegistrationBean(){
// 注册filter组件
FilterRegistrationBean bean = new FilterRegistrationBean(new SecondFilter());
// 添加过滤路径
bean.addUrlPatterns("/second");
return bean;
}
}
SpringBoot注册web组件_注册Listener
注册方式一
- 编写Listener
@WebListener
public class FirstListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("First ListenerInit......");
}
@Override
public void contextDestroyed(ServletContextEvent sce){
}
}
启动类扫描web组件
@SpringBootApplication
//SpringBoot启动时扫描注册注解标注的Web组件
@ServletComponentScan
public class Springbootdemo2Application {
public static void main(String[] args){
SpringApplication.run(Springbootdemo2Appl ication.class, args);
}
}
注册方式二
- 编写Listener
public class SecondListener implements
ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("Second Listener Init......");
}
@Override
public void contextDestroyed(ServletContextEvent sce){
}
}
使用配置类注册Listener
@Configuration
public class ListenerConfig {
@Bean
public ServletListenerRegistrationBean getServletListenerRegistrationBean(){
ServletListenerRegistrationBean bean = new ServletListenerRegistrationBean(new SecondListener());
return bean;
}
}