技术标签: spring boot java
所有的技术框架的发展似乎都遵循了一条主线规律:
- 从一个复杂应用场景衍生一种规范框架, 人们只需要进行各种配置而不需要自己去实现它, 这时候强大的配置功能成了优点;
- 发展到一定程度之后, 人们根据实际生产应用情况, 选取其中实用功能和设计精华, 重构出一些轻量级的框架;
- 之后为了提高开发效率, 嫌弃原先的各类配置过于麻烦, 于是开始提倡 “约定大于配置″, 进而衍生出一些一站式的解决方案。
这就是 Java 企业级应用 ->J2EE-> spring-> spring boot 的过程。
优点:1. 节省了调用资源。2. 每个功能元素的服务都是一个可替换的、可独立升级的软件代码。
优点:易于开发和测试,方便部署;当需要扩展时,只需要将 war 复制多份, 然后放到多个服务器上, 再做个负载均衡就可以了。
缺点:修改一个非常小的地方, 都需要停掉整个服务, 重新打包部署这个应用 War 包;对于一个大型应用,如何维护,如何分工合作都是问题。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
自动导包的核心 AutoConfigurationImportSelector 类:选择了什么东西
AutoConfigurationImportSelector 类中的方法:
// 1.获得自动配置实体(调用“获取所有候选配置”的方法获取实体)。
protected AutoConfigurationEntry getAutoConfigurationEntry(AnnotationMetadata annotationMetadata)
// 2.获取所有候选配置(候选配置是哪些配置)。
List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes){
List<String> configurations = SpringFactoriesLoader.loadFactoryNames(this.getSpringFactoriesLoaderFactoryClass(), this.getBeanClassLoader());
Assert.notEmpty(configurations, "No auto configuration classes found in META-INF/spring.factories. If you are using a custom packaging, make sure that file is correct.");
return configurations;
}
// 3.候选配置是所有标注@EnableAutoConfiguration注解的类下的所有配置。(即获取主启动类下的所有配置)
protected Class<?> getSpringFactoriesLoaderFactoryClass() {
return EnableAutoConfiguration.class;
}
// 4.获取所有的配置从哪里来,上面第二个方法调用了loadFactoryNames方法
public static List<String> loadFactoryNames(Class<?> factoryType, @Nullable ClassLoader classLoader) {
String factoryTypeName = factoryType.getName();
return (List)loadSpringFactories(classLoader).getOrDefault(factoryTypeName, Collections.emptyList());
}
// 5.loadFactoryNames方法调用了loadSpringFactories方法
// 6.loadSpringFactories方法从项目资源和系统资源中获取配置文件
classLoader.getResources("META-INF/spring.factories") ClassLoader.getSystemResources("META-INF/spring.factories")
META-INF/spring.factories:自动配置的核心文件。
// 遍历所有的资源,封装成properties供我们使用
Properties properties = PropertiesLoaderUtils.loadProperties(resource);
结论: springboot 所有自动配置都是在启动的时候扫描并加载: 所有的自动配置类都在 spring.factories 里面,但是不一定生效;要判断条件是否成立:只要导入了对应的 start,就有对应的启动器,有了启动器,我们自动装配就会生效,然后自动配置就可以成功。
详细步骤:
main 方法中的 run 方法启动会开启一个服务。
@SpringBootApplication
public class SpringbootWeb01Application {
public static void main(String[] args) {
// 该方法返回一个ConfigurableApplicationContext对象
// 参数一:应用入口的类, 参数二:命令行参数
SpringApplication.run(SpringbootWeb01Application.class, args);
}
}
主要两部分
springboot 配置文件能够配置的东西都有一个固有的规律:
他们都有对应的 xxxAutoConfiguration 配置类,这个配置类都会绑定一个 xxxProperties 类,xxxProperties 类和 springboot 的配置文件绑定;这样我们就可以在 springboot 配置文件中自定义配置了。
spring 的底层注解:根据不同的条件,来判断当前配置或者类是否生效。@Conditionalxxx
SpringBoot 使用一个全局的配置文件,配置文件名是固定的。
全局配置文件的作用:修改 SpringBoot 自动配置的默认值,它会在底层帮我们自动配置。
# 对象
student:
name: 'zs'
age: 12
# 对象的行内写法
student1: {
name: 'zs',age: 12}
# 数组
pets:
- cat
- dog
- pig
# 数组行内写法
pets1: [cat,dog,pig]
/*
ConfigurationProperties作用
将yml配置文件中配置的每个属性的值,映射到这个组件中;
告诉SpringBoot将本类中的所有属性和yml配置文件中相关的配置进行绑定;
参数prefix="person":将yml配置文件中的person下面的所有属性和本类属性对应。
(只有这个组件是容器中的组件,才能使用容器提供的ConfigurationProperties功能)
*/
// 可以直接拿到复杂类型的值
@Component
@ConfigurationProperties(prefix = "person")
@Data
public class Person {
private String name;
private Integer age;
private Boolean flag;
private Date birth;
private Map<String,Object> map;
private List<Object> list;
private Dog dog;
}
// application.yml
person:
name: zs
age: 12
flag: false
birth: 2021/04/20
map: {
k1: v1,k2: v2}
list: [code,music,girl]
dog:
name: 旺财
age: 3
<!--spring-boot-configuration-processor依赖可以在yml配置时给出提示-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
// 复杂类型不能用@Value直接取值
@Configuration
@Data
public class Person {
@Value("${person222.name}")
private String name;
@Value("${person222.age}")
private Integer age;
@Value("${person222.flag}")
private Boolean flag;
@Value("${person222.birth}")
private Date birth;
private Map<String,Object> map;
private List<Object> list;
private Dog dog;
}
// application.yml
person222:
name: zs
age: 12
flag: false
birth: 2021/04/20
map: {
k1: v1,k2: v2}
list: [code,music,girl]
dog:
name: 旺财
age: 3
@Component
@PropertySource(value = "classpath:test.properties")//可以这样配置@PropertySource({"classpath:test.properties"})
@Data
public class Person {
// SPEL表达式取出配置文件的值
@Value("${name}")
private String name;
@Value("${age}")
private Integer age;
private Boolean flag;
private Date birth;
private Map<String,Object> map;
private List<Object> list;
private Dog dog;
}
// test.properties
name=zhangsan
age=13
yml 配置属性的 - 可以和实体属性的驼峰对应绑定
@Component
@ConfigurationProperties(prefix = "person")
@Data
public class Person {
private String firstName;
}
// application.yml
person:
first-name: zs
@Component
@ConfigurationProperties(prefix = "person")
@Data
@Validated //数据校验
public class Person {
@Email(message="邮箱格式错误")
private String name;
}
HibernateValidator 是 BeanValidation 的参考实现;HibernateValidator 提供了 JSR 303 规范中所有内置 constraint 的实现;和附加的 constraint
HibernateValidator 附加的 constraint
<!--thymeleaf,我们都是基于3.x开发;2.x项目会报错-->
<dependency>
<groupId>org.thymeleaf</groupId>
<artifactId>thymeleaf-spring5</artifactId>
</dependency>
<dependency>
<groupId>org.thymeleaf.extras</groupId>
<artifactId>thymeleaf-extras-java8time</artifactId>
</dependency>
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>首页</title>
</head>
<body>
<div th:text="${msg}"></div>
</body>
</html>
package com.sywl.config;
import org.springframework.context.annotation.Configuration;
import org.springframework
文章浏览阅读2.1k次。人事部统计员小马负责本次公务员考试成绩数据的整理,按照下列要求帮助小马完成相关的整理、统计和分析工作:1.将考生文件夹下的工作簿文档“Excel素材.xlsx”另存为“Excel.xlsx”(“.xlsx”为文件扩展名),之后所有的操作均基于此文件,否则不得分。操作过程中,不可以随意改变工作表中数据的顺序。2.将考生文件夹下的工作簿“行政区划代码对照表.xlsx”中的工作表“Sheet1”复制到工..._excel准考证号的第四位为1,考试类别为a考试成绩
文章浏览阅读135次。跟你说,昨天......马云远赴非洲为他们颁奖......他们是谁呢?南非当地时间8月7日,来自非洲各国的一线野生动物巡护员齐聚开普敦。马云代表阿里巴巴公益基金会和桃花源生态保护基金会为他们颁奖。这群用生命保护大象、狮子和犀牛的巡护员们,第一次得到来自中国的资金和技术支持。在颁奖现场,每一位嘉宾的座位上都摆着一只可爱的非洲野生动物公仔。它们..._史上最危险的工作但是奖金最多
文章浏览阅读4k次。这里讨论两种多线程访问UI控件的方法,线程完成后更新Lable控件如下图,第一种方式为方式1按钮按下,线程运行,并更新label第二种方法为按下方式2按钮,线程运行,完成后更新label 新建winform项目程序,布局如上,大家可以不用配色,简单即可引用using System.Threading; 第一种方法:使用delegate和invoke来从其他线程中调用控件 当一个控件的InvokeRequired属性值为真时,说明有一个创建它以外的线程想访问它,所以我们判断这个属性来更新label的值 _winform多线程访问控件
文章浏览阅读509次。cat /etc/redhat-releasevi/etc/selinux/config修改参数:SELINUX=disabledyum updateyum install wget添加仓库:wget -q -O - https://www.atomicorp.com/installers/atomic | sh安装:yum install op..._centos7安装openvas安装超详细 运行openvas-nvt-sync失败 run a synchronization
文章浏览阅读4.8k次,点赞2次,收藏26次。新安江模型新安江模型是华东水利学院(现河海大学)赵人俊教授团队提出的一个水文模型,是中国少有的一个具有世界影响力的水文模型。新安江模型是集总式水文模型(划分子流域时成为分散式水文模型),可用于湿润地区与半湿润地区的湿润季节。当流域面积较小时,新安江模型采用集总模型,当面积较大时,采用分散模型。它把全流域分为许多块单元流域,对每个单元流域作产汇流计算,得出单元流域的出口流量过程。再进行出口以下的河道洪水演算,求得流域出口的流量过程。把每个单元流域的出流过程相加,就求得了流域的总出流过程。放大显示_集总式水文模型和分布式水文模型
文章浏览阅读2.4k次。ElasticSearch Head插件 常用命令语句_elasticsearch head 怎么查mapping
文章浏览阅读2.9w次。1. 大英帝国 面积:三千三百一十万平方公里 年代:1946 人口:五亿三千一百万大英帝国,是一个以英国(实际仍为王国)为中心的全球帝国,在20世纪初的鼎盛时期,全世界有大约4至5亿人,也就意味着当时全球人口的约四分之一,都是该帝国的子民,其领土面积则有约3367万平方公里(它宣称对加拿大北极圈内、澳大利亚内陆和南极洲的土地拥有主权),是世界陆地总面积的四分之一,成为了历史上跨度最广、面积最大_恺撒疆域版图为多少万平方公里
文章浏览阅读63次。*&---------------------------------------------------------------------**& Report Z_ALV_TREE_JAMES* Project : N/A* Author : James.Zong* Description : Template of Progr...
文章浏览阅读326次。《电路分析基础》作业一、填空题(共20个空,每空1分,共20分)1、基尔霍夫定律适用于 电路。其中KCL的实质是 ;KVL的实质是 。2、用10V的冲激电压与2H的电感相连(=0),t=0+ 时刻建立的电流初值为 ;冲激响应的实质是 。3、若正弦电流 A,则该= 。4、理想变压器的耦合系数k= ,其瞬时功率= 。理想变压器_12条支路7个节点几个独立回路
文章浏览阅读4.7w次,点赞597次,收藏3.9k次。大家好,我是帅地。假如你没有明确的目标,或许可以按照我说的学习路线来学习一波,我写的每一份学习路线,不会很全面,因为我认为,东西列的太多,反而不利于新手的学习,所以我列举的,都是比较必要的知识,当你把这些知识学了的时候,我相信你不需要别人的学习路线,也能知道自己接下来需要学啥了。虽然帅地的技术栈是后端开发,不过后端和前端显然是一对的,还是经常要和前端打交道,所以在之前也学习过不少前端的知识,下面总结的这套前端学习路线,是我参考了别人大量的学习经历 + 自己的思考 + 咨询前端大佬后提取出来的,可能不会像_前端学习跟着什么学最好
文章浏览阅读4.9k次,点赞4次,收藏42次。《FPGA Verilog开发实战指南——基于Altera EP4CE10》2021.7.10(上)串口RS232的学习_232tx和rx
文章浏览阅读2.9w次,点赞7次,收藏12次。Python编程语言赢得了“年度编程语言”的称号!Python已经获得了这个称号,因为与其他所有语言相比,它在2018年获得了最多的排名。Python语言赢得了3.62%,其次是Visual Basic .NET和Java。Python现在已经成为大型编程语言的一部分。近20年来,C,C ++和Java一直位居前三,远远领先于其他公司。Python现在正在加入这三种语言。它是当今大学中最常用的第一..._2019 计算机语言排行榜