Spring Boot学习笔记01

Spring Boot学习笔记01
强烈推介IDEA2020.2破解激活,IntelliJ IDEA 注册码,2020.2 IDEA 激活码

1、Spring Boot概要

Spring Boot介绍

随着动态语言的流行(Ruby、Scala、Node.js), Java的开发显得格外的笨重;繁多的配置、低下的开发效率、 复杂的部署流程以及第三方技术整合难度大。 在上述环境下,Spring Boot由此诞生,它的设计是为了使您能够尽可能快地启动和运行。它使用 “习惯优于配 置” (项目中存在大量的配置,而 Spring Boot 内置一个习惯性的配置,让你无须手动进行配置)的理念让你的 项目快速运行起来。使用 Spring Boot 很容易创建一个独立运行(运行jar,内嵌 Servlet 容器)、准生产强力 的基于 Spring 框架的项目,使用 Spring Boot你可以不用或者只需要很少的 Spring 配置。提供了 J2EE 开发的 一站式解决方案。

Spring Boot优点

1.快速构建独立运行的Spring项目;
2.无须依赖外部Servlet容器,应用无需打成WAR包;项目可以打成jar包独自运行;
3.提供 一系列 starter pom 来简化 Maven 的依赖加载;
4.大量的自动配置,对主流开发框架的无配置集成;
5.无须配置XML,开箱即用,简化开发,同时也可以修改默认值来满足特定的需求;
6.Spring Boot 并不是对 Spring 功能上的增强,而是提供了一种快速使用 Spring 的方式;
7.极大提高了开发、部署效率。

2、Spring Boot快速入门

2.1 pom.xml配置文件

在 pom.xml 中添加的 Spring Boot 相关的父级依赖,spring-boot-starter-parent 是一个特殊的starter,它提供了项目相关的默认依赖,使用它之后 ,常用的包依赖可以省去 version 标签。

2.2 引导类

通常有一个名为 *Application 的入口 类,里面定义一个main方法,使用SpringApplication.run(HelloMailAppliation.class, args);来启动 SpringBoot 应用项目。

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class HellospringbootApplication {

    public static void main(String[] args) {
        SpringApplication.run(HellospringbootApplication.class, args);
    }

}

@SpringBootApplication 注解说明:

标注在某个类上, 说明这个类是 Spring Boot 的引导类,Spring Boot 就应该运行这个类的main方法来启动 SpringBoot 应用。

@SpringBootApplication注解是以下三个注解的总和:

@SpringBootConfiguration:用于定义一个Spring Boot的配置类( 配置类 等同 配置文件)引用了@Configuration 注解,是Spring底层的一个注解,用于定义 Spring 的配置类。配置类也是容器中的一个组件@Component。
@EnableAutoConfiguration:告诉Spring Boot开启自动配置功能,这样Spring Boot会自动根据你导入的依赖jar包来自动配置项目。
在这里插入图片描述@AutoConfigurationPackage ——> @Import({Registrar.class}):
会将引导类(@SpringBootApplication标注的类)所在的包及下面所有子包里面的所有组件扫描到Spring容器;
@Import({AutoConfigurationImportSelector.class}):
1.将所有需要导入的组件以全类名的方式返回; 这些组件就会被添加到容器中;
2.会给容器导入非常多的自动配置类(xxxxAutoConfiguration),就是导入并配置好当前项目中所需要的组件,省去我们手动编写配置去注入组件。
Spring Boot在启动的时候从(spring-boot-autoconfigure-2.0.6.RELEASE.jar)类路径下的METAINF/spring.factories中获取EnableAutoConfiguration指定的值,将这些值作为自动配置类导入到容器中,自动配置类就生效,帮我们进行自动配置工作;以前我们需要自己配置的文件,自动配置类都帮我们完成了;
@ComponentScan:该注解标识的类, 会被 Spring 自动扫描并且装入bean容器。

2.3 目录结构

在这里插入图片描述
resources 文件夹中目录结构:

static :保存所有的静态资文件, js css images
templates :保存所有的模板页面(Spring Boot默认jar包使用嵌入式的Tomcat,默认不支持JSP页面),可以使用模板引擎(freemarker、thymeleaf);
application.properties:Spring Boot应用的配置文件;可以修改一些默认设置;如修改默认端口 server.prot=8081。

2.4 Spring Boot的配置文件

Spring Boot 使用一个全局配置文件,放置在 src/main/resources 目录或类路径的/config下;

  • application.properties
  • application.yml

配置文件的作用:修改 Spring Boot 自动配置的默认值。

yml 是 YAML(YAML Ain’t Markup Language)不是一个标记语言;

  • 标记语言:以前的配置文件;大多都使用的是 xxxxx.xml文件;
    在这里插入图片描述
  • YAML:以数据为中心,配置数据的时候具有面向对象的特征;比 json、xml 等更适合做配置文件;
    在这里插入图片描述
2.5 YAML语法格式

YAML基本语法:

  • key: value 表示一对键值对(冒号后面必须要有空格)
  • 使用空格缩进表示层级关系
  • 左侧缩进的空格数目不重要,只要同一层级的元素左侧对齐即可
  • key 与 value 大小写敏感
    在这里插入图片描述
    YMAL常用写法:
  • 字面量: 数值,字符串,布尔,日期
    • 字符串 默认不用加上引号;
      • 使用 双引号"" 不会转义特殊字符,特殊字符最终会转成本来想表示含义输出。
        name: "mengxuegu \n jiaoyu"输出: mengxuegu 换行 jiaoyu"
      • 使用 单引号 会转义特殊字符,特殊字符当作一个普通的字符串输出
        name: 'mengxuegu \n jiaoyu 输出: mengxuegu \n jiaoyu
  • 对象 & Map
    • key: value value存储对象,每个值换一行写,注意值要左对齐
      在这里插入图片描述
    • 行内写法
      在这里插入图片描述
  • 数组(List、Set)
    • - 值表示数组中的一个元素
      在这里插入图片描述
    • 行内写法
      在这里插入图片描述
2.6 yaml 配置文件注入值
  • 编写 application.yml 配置文件:
server:
  port: 80
#emp的配置数据
emp:
  name: korbin
  age: 21
  map:
    key1: value1
    key2: value2
  list:
    - one
    - two
    - three
  forte:
    name: java
    time: 8

  • 编写 JavaBean:添加get、set方法和@Component@ConfigurationProperties(prefix = "emp")注解
    在这里插入图片描述
    在这里插入图片描述
  • 使用 SpringBoot 单元测试类进行测试
import cn.korb1n.hellospringboot.bean.Emp;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
@SpringBootTest
public class HellospringbootApplicationTests {

    @Autowired
    private Emp emp;

    @Test
    public void contextLoads() {
        System.out.println(emp);
    }

}
  • 导入配置文件处理器,然后重新运行测试类,在编写配置文件时就会有代码提示
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-configuration-processor</artifactId>
	<optional>true</optional>
</dependency>

@Value@ConfigurationProperties 获取值的差异:需要批量注入配置文件的属性值时用后者,需要指定单个属性值时用前者。

2.7 加载指定配置文件
2.7.1 @PropertySource加载局部配置文件

@ConfigurationProperties 默认从全局配置文件(application.properties/application.yml)中获取值,所有配置数据写在全局配置文件中,显得太臃肿了, 可将它们抽取出来,放到其他局部配置文件中。

  • @PropertySource :用于加载局部配置文件;
    1. 将 全局配置文件 中的emp相关配置数据 抽取 到 resources/ emp.properties 文件中

      #emp的配置数据
      emp.name=korbin
      emp.age=21
      emp.map.key1=value1
      emp.map.key2=value3
      emp.list=one,two,three
      emp.forte.name=java
      emp.forte.time=10
      
    2. 添加注解@PropertySource(value = {"classpath:emp.properties"}) :加载指定的配置文件; value 属性是数组类型,用于指定配置文件位置。

2.7.2 @ImportResource使用xml配置

SpringBoot提倡零配置, 即无xml配置,但是在实际开发中,可能有一些特殊要求必须使用 xml 配置;这时我们可以通过 Spring 提供的@ImportResource 来加载 xml 配置文件。

  • @ImportResource :加载Spring的xml配置文件内容加载到容器中使用;
    1. 创建业务类: EmpService.class
      public class EmpService {
      public void add(){
         
      	}
      }
      
    2. 创建 resources/spring01.xml 文件,添以下内容
      <?xml version="1.0" encoding="UTF-8"?>
      <beans xmlns="http://www.springframework.org/schema/beans"
      	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      	xsi:schemaLocation="http://www.springframework.org/schema/beans
      	http://www.springframework.org/schema/beans/spring-beans.xsd">
      
      	<bean id="empService" class="cn.korb1n.hellospringboot.bean.Emp"></bean>
      </beans>
      
    3. 将Spring的配置文件加载到容器中, 使用 @ImportResource 标注在一个配置类上,下面是主配置类
      import org.springframework.boot.SpringApplication;
      import org.springframework.boot.autoconfigure.SpringBootApplication;
      import org.springframework.context.annotation.ImportResource;
      
      @ImportResource(locations = {"classpath:spring01.xml"})
      @SpringBootApplication
      public class HellospringbootApplication {
      
      public static void main(String[] args) {
           SpringApplication.run(HellospringbootApplication.class, args);
          }
      
      }
      
    4. 单元测试
      package cn.korb1n.hellospringboot;
      
      import cn.korb1n.hellospringboot.bean.Emp;
      import org.junit.Test;
      import org.junit.runner.RunWith;
      import org.springframework.beans.factory.annotation.Autowired;
      import org.springframework.boot.test.context.SpringBootTest;
      import org.springframework.context.ApplicationContext;
      import org.springframework.test.context.junit4.SpringRunner;
      
      @RunWith(SpringRunner.class)
      @SpringBootTest
      public class HellospringbootApplicationTests {
      
      	@Autowired
      	private ApplicationContext applicationContext;
      	@Test
      	public void testXml(){
      	//没有找到就报错
      		System.out.println("empService:"+applicationContext.getBean("empService"));
      	}
      
      	@Autowired
      	private Emp emp;
      	@Test
      	public void contextLoads() {
       		System.out.println(emp);
      	}
      
      }
      
2.7.3 自定义配置类向容器注入组件

Spring Boot 推荐使用注解的方式向容器中注入组件, 操作如下:

  • 使用 @Configuration 配置类,来表示对应Spring配置文件
  • 使用 @Bean 向容器中注入组件对象
  • 把 上面 @importResource 注解注释掉测试
package cn.korb1n.hellospringboot.config;

import cn.korb1n.hellospringboot.service.EmpService;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @Configuration 用于标识当前类是一个配置类, 来表示对应的Spring配置文件
 */ 
@Configuration 
public class EmpConfig { 
    /** @Bean 标识的方法用于向容器注入组件 
     * 1. 方法的返回值就是注入容器中的组件对象, 
     * 2. 方法名是这个组件对象的 id 值 
     */ 
    @Bean 
    public EmpService empService2() { 
        System.out.println(" @Bean 注解已经将 EmpService 组件注入"); 
        return new EmpService(); 
    } 
}
  • 再次测试
package cn.korb1n.hellospringboot;

import cn.korb1n.hellospringboot.bean.Emp;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.ApplicationContext;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
@SpringBootTest
public class HellospringbootApplicationTests {

    @Autowired
    private ApplicationContext applicationContext;
    @Test
    public void testXml(){
        //没有找到就报错
        System.out.println("empService:"+applicationContext.getBean("empService2"));
    }
}
2.8 Spring Boot日志配置

Spring Boot采用了 slf4j+logback 的日志框架组合形式,Spring Boot也提供对JUL、log4j2、Logback提供了默认配置。

官网参考文档:https://docs.spring.io/spring-boot/docs/2.0.6.RELEASE/reference/htmlsingle/#boot-features-logging

  • SpringBoot默认配置好了日志, 只要启动 Spring Boot 项目就会在控制台输出日志信息。
  • 修改日志默认级别:
    #调整日志级别: trace < debug < info < warn < error
    logging:
    	level:
    		#cn.korb1n.hellospringboot包下的级别
    		cn.korb1n.hellospringboot: trace
    		#设置root级别
    		root: info
    
  • 修改日志文件生成路径:
    logging.file logging.path 示例 说明
    (none) (none) 只在控制台输出
    指定文件名 (none) springboot.log 输出到当前项目根路径下的springboot.log文件中
    (none) 指定目录 /springboot/log 输出到当前项目所在磁盘根路径下的/springboot/log目录中的spring.log文件中
    指定文件名 指定目录 当两个同时指定时,采用的是 logging.file 指定。推荐使用 logging.file 设置即可,因为它可以自定义文件名
    logging:
    	#输出到当前项目根路径下的 springboot.log 文件中
    	file: springboot.log
    	#输出到当前项目所在磁盘根路径下的 /springboot/log目录中的 spring.log 文件中,
    	#path: springboot/log
    
本文来源MrKorbin,由架构君转载发布,观点不代表Java架构师必看的立场,转载请标明来源出处:https://javajgs.com/archives/25320

发表评论