目录
SpringBoot
理解:
SpringBoot优点
快速搭建springboot应用程序
pom内的parent标签
@SpringBootApplication
@SpringBootApplication包含三大主要的注解
@ComponentScan注解
@EnableAutoConfiguration注解
@SpringBootTest注解
自定义SpringApplication
配置文件的使用
properties文件语法
yaml文件语法
配置文件的加载顺序
其他约定配置文件加载顺序
设置默认配置文件读取
普通方式
注解方式
动态为属性赋值
properties文件为属性动态赋值
yml文件为属性动态赋值
yml文件内特殊属性动态赋值
springboot环境分割
单文件形式
分文件形式
热部署
springboot日志的使用
springboot默认日志配置
日志的级别
日志的输出格式
静态资源访问
静态资源访问前缀
改变放入静态资源文件的目录
设置静态资源映射
静态欢迎页
网站图标
含义:是框架的框架,简化了常规框架的配置方式,只需要很少的代码便可实现大量的功能
作用:SpringBoot基于spring开发,能快速创建出生产级别的Spring,让以后用Spring开发变得简单
关于SpringBoot有一句很出名的话就是约定大于配置,采用springboot可以大大简化开发模式,它集成了大量常用的第三方库配置,所有你想集成的常用框架他都有对应的组件支持,例如:Redis、MongoDB、Dubbo、kafka、ES等。springboot应用中这些第三方库几乎可以零配置的开箱即用,大部分的springboot应用都只需要非常少量的配置代码,开发者能够专注于业务逻辑。另外springboot通过集成大量的框架使得依赖包的版本冲突,以及引用的不稳定性问题得到了很好的解决。
注意:
创建一个maven项目
导入依赖
org.springframework.boot
spring-boot-starter-parent
2.3.5.RELEASE
org.springframework.boot
spring-boot-starter-web
2.7.3
org.springframework.boot
spring-boot-starter-test
test
org.springframework.boot
spring-boot-maven-plugin
@RestController
@RequestMapping("/test")
public class HelloController {
@RequestMapping("/hello")
public String asyHi(){
return "hello world";
}
}
在所有类的外层创建启动类
//标记成springboot的启动类
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
将启动端口号改为8088,为项目加虚拟路径为app
#resources目录下(编译后会编译到classes文件中)
#application.properties(文件名必须固定为application)文件内
server.port=8088
#为项目加虚拟路径
server.servlet.context-path=/app
#初始化懒加载,所有的bean在spring容器初始化的时候将不会去创建这些bean,而是在我们使用的时候才会创建
spring.main.lazy-initialization=true
使用maven命令打包后在对应包所在文件中使用java -jar 完整包名 --server.port=8087命令开启服务
访问路径:localhost:8087/app/test/hello
注意:这里用直接配置的端口号覆盖了原来的配置端口,这样运行的信息会通过main函数的args参数传递下去 ,进而实现端口配置
测试类
//在主启动类所在同名包路径的同包或子包中
//提前已经将User类交给spring容器管理了
@SpringBootTest
public class TestSpringBoot {
@Autowired
private User user;
//注意@Test注解用import org.junit.jupiter.api.Test;
@Test
public void test1(){
System.out.println(user.getName());
}
}
作用:引入父maven项目,使该项目继承了父maven项目的所有配置信息
点开[spring-boot-starter-parent]依赖,然后发现其内部也有父maven项目——[spring-boot-dependencies],点进该父maven项目发现第三方库所有的版本号都在这里维护了;所以它就用该种方式帮我们管理了第三方库之间的版本冲突问题,以及我们会用到的所有依赖信息也都在这里引入进来了;以后我们导入已有的依赖就可以不用写版本号了
被该注解修饰的类,为springboot的启动类(入口);因为springboot的所有自动配置都是从该注解开始的
规则:Spring底层解析配置类的时候会扫描当前包的路径,默认是主启动类所在的包路径,以后写代码必须在主启动类所在包路径的同包或子包中编程
规则:该注解用来加载SpringBoot-start-xxx的启动项,当主启动类的执行时,则会开始加载启动项中的配置,实现自动化配置
注意:这里的开箱即用中SpringBoot-start-xxx的启动项为箱,@EnableAutoConfiguration自动化配置为即用
作用:当运行测试类中@Test注解标识的方法时springboot程序启动,springboot程序启动,内部spring容器启动,基于ioc管理对象,DI注入对象;进而可以在任意测试类中注入想要的对象
注意:
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication app = new SpringApplication(Application.class);
//关闭springboot的启动横幅
app.setBannerMode(Banner.Mode.OFF);
//一键启动springboot
app.run(args);
}
}
SpringBoot使用一个全局配置文件也称核心配置文件(application文件),配置文件在约定的情况下名字是固定的
配置文件的作用:修改springboot自动配置的默认值;springboot在底层都给我们配置好
server.port=8088
server.servlet.context-path=/app
server:
port: 8088
servlet:
context-path: /app
spring-boot-starter-parent内
**/application*.yml
**/application*.yaml
**/application*.properties
注意:配置文件加载顺序是针对共有的配置,如果两种文件有相同的配置则会以优先级高的文件配置为准,若优先级低的配置文件有优先级高的配置文件所没有的属性,则该属性也可用
#app.properties文件内
server.port=8888
注意:约定的配置优先级最高(application)
@SpringBootApplication
public class SpWebApplication {
public static void main(String[] args) throws Exception {
SpringApplication application = new SpringApplication(SpWebApplication.class);
Properties properties = new Properties();
//通过当前类加载器获得app.properties文件内容
InputStream stream = SpWebApplication.class.getClassLoader().getResourceAsStream("app.properties");
properties.load(stream);
//设置默认配置文件
application.setDefaultProperties(properties);
application.run(args);
}
}
@SpringBootApplication
@PropertySource("classpath:/app.properties")
public class SpWebApplication {
public static void main(String[] args) throws Exception {
SpringApplication application = new SpringApplication(SpWebApplication.class);
application.run(args);
}
}
#mysql.properties文件内
mysql.username=名字
mysql.password=123
@RestController
@PropertySource(value = "classpath:/mysql.properties",encoding = "UTF-8")
public class TestController {
@Value("${mysql.username}")
private String username;
@Value("${mysql.password}")
private String password;
@RequestMapping("/test")
public String getMsg(){
return username+password;
}
}
访问路径:localhost:8080/test
注意:
前言:只要是application的配置文件(yml、properties)都是springboot的核心配置文件,springboot已经对其进行管理,就不需要再交给spring来管理了
#application.yaml文件内
mysql:
username: 名字
password: 234
@RestController
public class TestController {
@Value("${mysql.username}")
private String username;
@Value("${mysql.password}")
private String password;
@RequestMapping("/test")
public String getMsg(){
return username+password;
}
}
访问路径:localhost:8080/test
注意:yaml文件读取时默认采用utf-8形式编码
#application.yaml内
server:
port: 8888
mysql:
#数组写法
hobbies: [足球,篮球] #数组写法1
pets: #数组写法2
- cat
- dog
#map写法
girlFriend:
18: 范凉凉
20: 地里冷吧
boyFriend: {18: 张三, 20: 李四}
#随机值写法
number: ${random.int[1,100]} #随机值范围1-100岁
类比properties文件
#application.properties文件内
server.port=8888
#数组写法
mysql.hobbies=唱歌,跳舞
#map集合写法
mysql.girlFriend.18=范凉凉
mysql.girlFriend.20=迪丽冷吧
#随机数写法
mysql.number=${random.int[1,100]}
@Data
@RestController
@ConfigurationProperties(prefix = "mysql")
public class TestController {
private List hobbies;
private List pets;
private Map girlFriend;
private Map boyFriend;
private Integer number;
@RequestMapping("/test")
public String getMsg(){
return "爱好为:"+hobbies+"\n宠物为"+pets;
}
@RequestMapping("/friend")
public String getFriend(){
return "朋友为:"+girlFriend+boyFriend;
}
@RequestMapping("/random")
public String getNumber(){
return "随机值为"+number;
}
}
注意:
前言:
#application.yaml文件内
spring:
profiles:
active: dev
---
server:
port: 8888
spring:
config:
activate:
on-profile: dev
---
server:
port: 6666
spring:
config:
activate:
on-profile: test
注意:
#application.yaml文件内
spring:
profiles:
active: dev
#application-dev.yaml文件内
server:
port: 8888
#application-test.yaml文件内
server:
port: 6666
注意:
前言:为了进一步提高开发效率,springboot为我们提供了全局项目热部署,日后在开发过程中修改了部分代码及相关配置文件后,不需要每次重启修改生效,在项目中开启了spring全局热部署之后只需要修改之后等待几秒钟即可使修改生效
引入热部署依赖
org.springframework.boot
spring-boot-devtools
true
idea中配置
日志门面:不实现日志功能,只是用来整合日志的(日志抽象层)
理解:市面上的日志框架非常混乱,一个项目内多个模块可能用不同的日志框架,所以引出日志门面
使用:左边选一个门面,右边选一个实现
注意:
@SpringBootTest
class Springboot3ApplicationTests {
//日志记录器
Logger logger = LoggerFactory.getLogger(getClass());
@Test
void contextLoads() {
String s=":";
String msg="message";
logger.trace("trace{}{}",s,msg);
logger.debug("debug{}{}",s,msg);
logger.info("info{}{}",s,msg);
logger.warn("warn{}{}",s,msg);
logger.error("error{}{}",s,msg);
}
}
日志级别:trace
注意:
#application.properties文件内
#将cn.tedu包下的文件日志级别调为trace级别
logging.level.cn.tedu=trace
#将打印的日志文件输出到具体位置
# 直接输出当前项目下的springboot.log文件中,如果不想在当前项目下生成日志文件,那么指定绝对路径
logging.file.name=springboot.log
#application.properties文件内
#将cn.tedu包下的文件日志级别调为trace级别
logging.level.cn.tedu=trace
#指定日志生成在文件的哪个目录,默认日志文件名为spring.log
#根目录下的spring/log目录里
logging.file.path=/spring/log
#application.properties文件内
#将cn.tedu包下的文件日志级别调为trace级别
logging.level.cn.tedu=trace
logging.file.name=springboot.log
#在控制台输出的日志格式
logging.pattern.console=[%thread] %msg %n
#在文件中日志输出的格式
logging.pattern.file=%d{yyyy-MM-dd} [%thread] %msg %n
前言:只要静态资源放在类路径下:static or public or resources or META-INF/resources这些目录中,那么接下来浏览器就可以直接访问(当前项目根路径/+静态资源名)
原理:静态资源映射/**
请求进来,先去找controller,看能不能处理,不能处理的所有请求就会交给静态资源处理器,然后静态资源就会按照以上文件内的名字进行查找,若静态资源能找到,那么就会访问,若不能找到,那么就会404
#application.yml文件内
spring:
mvc:
#为静态资源加访问前缀,默认为/**
static-path-pattern: /res/** #表示res下的所有请求都是静态资源请求
注意:以上说明访问res下的东西才会映射到static or public or resources or META-INF/resources这些目录中,去查找对应的文件
#application.yml文件内
spring:
mvc:
#为静态资源加访问前缀,默认为/**
static-path-pattern: /res/** #表示res下的所有请求都是静态资源请求
#修改将静态资源放入/app内可以直接访问
web:
resources:
static-locations: [classpath:/app] #传递的是一个数组
//说明其为一个配置类
@Configuration
public class WebMvcConfig extends WebMvcConfigurationSupport {
//设置静态资源映射
@Override
protected void addResourceHandlers(ResourceHandlerRegistry registry) {
//将路径中有backend的请求映射到classpath下的backend路径后面
registry.addResourceHandler("/backend/**").addResourceLocations("classpath:/backend/");
registry.addResourceHandler("/front/**").addResourceLocations("classpath:/front/");
}
}
将图标改为favicon.ico放入到springboot的静态目录中,那么以后访问该网页就自动有这个图标(可以配置静态资源路径,但不可配置静态资源访问前缀)
注意:这个图标在同一次会话中共享