随着动态语言的流行(Ruby、Scala、Node.js), Java的开发显得格外的笨重;繁多的配置、低下的开发效率、 复杂的部署流程以及第三方技术整合难度大。 在上述环境下,Spring Boot由此诞生,它的设计是为了使您能够尽可能快地启动和运行。它使用 “习惯优于配 置” (项目中存在大量的配置,而 Spring Boot 内置一个习惯性的配置,让你无须手动进行配置)的理念让你的 项目快速运行起来。使用 Spring Boot 很容易创建一个独立运行(运行jar,内嵌 Servlet 容器)、准生产强力 的基于 Spring 框架的项目,使用 Spring Boot你可以不用或者只需要很少的 Spring 配置。提供了 J2EE 开发的 一站式解决方案。
1.快速构建独立运行的Spring项目;
2.无须依赖外部Servlet容器,应用无需打成WAR包;项目可以打成jar包独自运行;
3.提供 一系列 starter pom 来简化 Maven 的依赖加载;
4.大量的自动配置,对主流开发框架的无配置集成;
5.无须配置XML,开箱即用,简化开发,同时也可以修改默认值来满足特定的需求;
6.Spring Boot 并不是对 Spring 功能上的增强,而是提供了一种快速使用 Spring 的方式;
7.极大提高了开发、部署效率。
在 pom.xml 中添加的 Spring Boot 相关的父级依赖,spring-boot-starter-parent 是一个特殊的starter,它提供了项目相关的默认依赖,使用它之后 ,常用的包依赖可以省去 version 标签。
通常有一个名为 *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容器。
static
:保存所有的静态资文件, js css images
templates
:保存所有的模板页面(Spring Boot默认jar包使用嵌入式的Tomcat,默认不支持JSP页面),可以使用模板引擎(freemarker、thymeleaf);
application.properties
:Spring Boot应用的配置文件;可以修改一些默认设置;如修改默认端口 server.prot=8081。
Spring Boot 使用一个全局配置文件,放置在 src/main/resources
目录或类路径的/config
下;
配置文件的作用:修改 Spring Boot 自动配置的默认值。
yml 是 YAML(YAML Ain’t Markup Language)不是一个标记语言;
YAML基本语法:
key: value
表示一对键值对(冒号后面必须要有空格)name: "mengxuegu \n jiaoyu"
输出: mengxuegu 换行 jiaoyu"
name: 'mengxuegu \n jiaoyu
输出: mengxuegu \n jiaoyu
server:
port: 80
#emp的配置数据
emp:
name: korbin
age: 21
map:
key1: value1
key2: value2
list:
- one
- two
- three
forte:
name: java
time: 8
@Component
、@ConfigurationProperties(prefix = "emp")
注解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);
}
}
org.springframework.boot
spring-boot-configuration-processor
true
@Value
与 @ConfigurationProperties
获取值的差异:需要批量注入配置文件的属性值时用后者,需要指定单个属性值时用前者。
@ConfigurationProperties
默认从全局配置文件(application.properties/application.yml)中获取值,所有配置数据写在全局配置文件中,显得太臃肿了, 可将它们抽取出来,放到其他局部配置文件中。
@PropertySource
:用于加载局部配置文件;
将 全局配置文件 中的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
添加注解@PropertySource(value = {"classpath:emp.properties"})
:加载指定的配置文件; value 属性是数组类型,用于指定配置文件位置。
SpringBoot提倡零配置, 即无xml配置,但是在实际开发中,可能有一些特殊要求必须使用 xml 配置;这时我们可以通过 Spring 提供的@ImportResource 来加载 xml 配置文件。
@ImportResource
:加载Spring的xml配置文件内容加载到容器中使用;
public class EmpService {
public void add(){
}
}
@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);
}
}
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);
}
}
Spring Boot 推荐使用注解的方式向容器中注入组件, 操作如下:
@Configuration
配置类,来表示对应Spring配置文件@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"));
}
}
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
#调整日志级别: 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