springBoot
依赖
- 引入父工程,父工程里会检测个人编写的配置文件,父工程引用了父工程:spring-boot-dependencies,其限定了所需要的jar的一些版本,实现jar版本的管理
自动配置
- @SpringBootApplication注解包含
- @SpringBootConfiguration注解 包含@Configuration 即最终配置注解
- @EnableAutoConfiguration 自动配置 包含@Import({AutoConfigurationImportSelector.class}) 即引入了配置类
- AutoConfigurationImportSelector类:加载配置
- 同配置类包下:META-INF/spring.factories文件 -》ServletWebServerFactoryAutoConfiguration类引入了 -》ServerProperties类通过注解 -》@ConfigurationProperties加载默认配置 通过其josn文件 - @ComponentScan 组件扫描 即自动扫描@SpringBootApplication注解同级及子孙包
@SpringBootApplication即可具备以上三个注解作用。
修改配置
父工程
扫描文件
- 要修改配置只要覆盖默认配置即可 如:
# 服务器端口
server.port=8081
#当前web应用的名称
server.servlet.context-path=/demo1
yml语法
server:
port: 8082
name: zhangsan
#对象配置
person:
name: zhangsan
age: 18
addr: beijing
# 行内配置
person: {name: zhangsan,age: 18,addr: beijing}
# 配置数组
city:
- beijing
- tianjin
- chongqing
- shanghai
# 或者
city: [beijing,tianjin,chongqing,shanghai]
# 配置数据、集合(对象数据)
student:
- name: tom
age: 18
addr: beijing
- name: lucy
age: 17
addr: tianjing
# 或者
student: [{name: tom,age: 18,addr: beijing},{name: lucy,age: 17,addr: tianjing}]
# map配置
map:
key1: value1
key2: value2
获取配置文件所定义的属性
- @Value("${配置名}")
@Value("${name}")
private String name;
@Value("${person.addr}")
private String addr;
- @ConfigurationProperties(prefix = "配置前缀") + getxxx()方法
@ConfigurationProperties(prefix = "person")放在类上
private String name; //定义属性
提供get方法:
public String getName() {return name;}
public void setName(String name) {this.name = name;}
- @EnableConfigurationProperties(属性类字节码对象) 可以载入属性类
整合其他技术
- 整合junit测试
- 引入启动器
- 编写测试类,测试类需添加注解
@RunWith(SpringRunner.class)
@SpringBootTest(classes = 启动类字节码文件)
SpringBoot
一、配置文件
- 可以导入配置文件处理器,这样在配置文件和实体类可以建立映射
- @ConfigurationProperties(prefix="xxx") 通过前缀把配置中的信息绑定到实体类中
- @Value("${xxx}") 绑定配置文件中属性到实体类属性
- @PropertySource(value=-"classpath:xxxx.xx") 引入属性文件(即导入spring配置文件)
- @ImportResource("locations={classth:xxx.xml,xxxx.xxx,...}") 自己配置的文件不生效,通过注解引入配置文件,让其生效
多配置文件时,激活指定的配置文件(激活程序某一种环境):
- properties:
- 先给配置文件名称添加标识:如:application-dev.properties
- 在默认配置文件中指定配置文件: 如:spring.profiles.active = xxx
- 当启动后其会使用application-dev.properties这个配置文件了
- 先给配置文件名称添加标识:如:application-dev.properties
- yml: yml支持多文档块方式,即通过"---"来分隔表示不同的配置文件。修改:在默认的文档块中指定
配置文件加载顺序:先加载带后缀的,先加载外部的后加载内部的。
二、自动配置
springboot就是为了减去繁杂的配置而生,个人认为一切配置都有一个与之对应的配置类,就是把配置文件都转换成了配置类来进行操作。
- 1-开启:@EnableAutoConfiguration --》
- 利用@EnableAutoConfigurationImportSelector给容器中导入组件 --》
- springFacrorieaLoader.loadFacroryNames() 扫描所有jar包装路径下MERA-INF/spring.facrories
- xxxAutoConfigurationl类都是容器中一个组件(即类),都加入到了容器中用来做自动配置
- xxxProperties是通过前缀封装了配置文件中属性的类,属性与配置文件中相关配置绑定
- 使用springboot,即可以看其有没有自动配置类,【有&不满意】可以通过配置文件覆盖来修改【没有】自己编写配置类并添加到配置类,自己编写的配置类还可以和配置文件绑定来做配置。
**派生注解:@ConditionalXXX **
- 作用:必须是该注解指定的条件成立,才能给容器中添加组件,添加了组件配置里面配置的内容才能生效
- 如在某个配置类上加了这个注解:@conditionalOnClass({xxx.class,xxx.class,...}) 即表示:项目中有这些类,配置才能生效
自动配置类必须在一定的条件下才能生效:
配置文件中配置:
debug=true
即开启springboot的debug模式
在控制台就可以知道哪些类用了自动配置,哪些类没有用自动配置(因为配置的条件不满足)
三、日记处理
springboot底层是spring框架
spring默认用jcl日记框架
而springboot用的是slf4j抽象层和logback实现层。
日记门面(即抽象层或接口层)
- jcl(jakarta commons-logging)
- slf4j(simple logging facade for java)
- jboss-logging
- ...
日志实现
- log4j
- jul(java.util.logging)
- log4j2
- logback
- ...
可以说logback是对log4j的完善升级。
日志的使用
- 接口搭配对应的实现类
程序--》接口层面--》对应的实现类
- 接口搭配非对应实现类,需要通过适配器类来转换
程序--》接口层面--》适配器类层--》非对应实现类
遗留问题:框架中使用了其他框架,其他框架各自使用了不同日志,如何统一日志记录,使用同一日志框架进行输出呢?
解决:即通过适配器类来偷换jar实现包,以完成统一框架输出
- 1-系统中其他日志框架先排除出去
- 2-使用中间包来替换原有日志框架
- 3-导入所使用日志接口的实现类
springboot日志关系(使用)
- 1-springboot底层使用slf4j + logback的方式进行日志记录
- 2-springboot把其他日志都替换成了slf4j 接口来完成统一
- 3-即把中间替换包引入
- 4-如果引入其他框架,一定要把该框架默认日志依赖先移除
springboot能自动适配所有日志,底层使用【slf4j】 + 【logback】的方式记录日志,要想换成其他日志实现框架时,只需要把这个框架的日志配置放入到程序资源文件即可。
日志类:Logger类
- 获取:loggerFacroty.getLogger(getClass())
- .trace("xxxx信息");
- .debug("xxxx信息");
- .info("xxxx信息");
- .warn("xxxx信息");
- .error("xxxx信息");
以上五个方法也是日记的级别,由低到高。 spring默认设置日志级别是:info
可以调整日志的输出级别:其只会打印所设置级别即后面级别的日志信息。
- 设置级别:在配置文件中指定--logging.level.xxx包 = 级别名称 (不填写具体的包,即每个包的日记级别都设置)
- logging.file = 文件名或路径 --表示把日志打印到所设置的文件或路径中
- logging.path = 指定path --表示在指定目录下记录日志(与logging.file是冲突的,如果设置了logging.file后就会在其设置的文件或路径下输出日志)
- logging.pattern.console = xxxxx --设置在控制台输出的日志格式
- 如:%d{yyyy-MM-dd} [%thread] %-5level %logger{50} - %msg%n
- logging.pattern.file = xxxxx --设置在指定文件中输出的日志格式
profile特性 多环境日志的格式切换
- 1-给日志配置文件填加【-spring】后缀
- 2-在日志配置文件中添加:
指定日志配置文件
给类路径下放上日志框架自己的配置文件即可,springboot就不使用默认的日志配置了
切换日志框架
- 即上面所提的适配器类模式:把对应其他框架通过中间替换类替换统一接口
- 把默认日志实现类去掉,导入所用日志实现类
- 把日志配置文件导入到类路径下。
WEB
springboot对静态资源的映射规则
可以取webjars网站下载对应的静态资源对应的maven ,如jq、sootstrap等
webjars以jar包的方式引入静态资源
- 1-【/webjars/**】访问,都去classpath:/META-INF/resources/webjars/所找资源;
-
2-【/**】访问的任何资源,如果没有处理都默认去以下路径查找
- "classpath:/META-INF/resources/"
- "classpath:/resources/"
- "classpath:/static/"
- "classpath:/public/"
- "/"
-
3-【欢迎页】:静态资源文件下所有的index.html
-
4-【网页图标】:所有的**/favicon.ico都是在静态资源文件下找;
修改默认的静态资源访问路径:配置文件配置:spring.resources.static-locations=路径,路径,... 如:classpath:/hello/,classpath:/xiaoai/
模板引擎:thymeleaf
模板引擎:jsp、velocity、freemarker、thymeleaf
thymeleaf的使用
- 引入thymeleaf,即maven添加依赖
<dependency>
<grouprd>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
<-- springboot2以上版本不用改这些 -->
<java.version>1.8</java.version>
<thymeleaf.version>3.0.2.RELEASE</thymeleaf.version>
<!--布局功能的支持程序thymeLeaf3主程序layout2以上版本-->
<thymeleaf-layout-dialect.version>2.1.1</thymeleaf-layout-dialect.version>
</dependency>
- 只要把HTML页面放在classpath:/templates/,thymeleaf就能自动渲染
thymeleaf的语法
可以在页面上导入名称空间: 可以不导入,导入就是为了获得语法提示
- 语法
可以通过【th:属性名=${xxx}】修改任意属性