【SpringBoot2】 SpringBoot2核心技术 基础
写在前面
1 SpringBoot2核心技术 基础
1.1 Spring与SpringBoot
SpringBoot是一个高层框架
1.2 项目创建
1.2.1 创建POM
①导入spring-boot-starter-parent父工程
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.2</version>
</parent>
②添加依赖spring-boot-starter-web
SpringBootWeb场景启动器,会自动进行导入web场景所用的jar包
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.hikaru</groupId>
<artifactId>SpringBoot_HelloWorld</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.2</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
</project>
1.2.2 创建主程序
@SpringBootApplication
public class MainApplication {
public static void main(String[] args) {
SpringApplication.run(MainApplication.class, args);
}
}
MainApplication为主程序类,@SpringBootApplication注解表明这是一个SpringBoot应用。
1.2.3 编写业务
主程序类MainApplication默认只会访问同一包下的文件,所以编写的业务类应该和主程序类放在同一个包下!
@RestController
public class HelloController {
@RequestMapping("/")
public String hello() {
return "Hello,boot!";
}
}
@ RestController注解为 @ ResponseBody 和 @ Controller 的合体
1.2.4 /resources/Application.properties指定Tomcat服务器端口号
application.properties
server.port=8081
SpringBoot内置了Tomcat服务器,不再需要手动进行配置
文件名固定且区分大小写,否则IDEA中能够读取(但是文件中变量为灰色表示没有被用到)但是打成的jar包无法读取配置信息
1.3 项目部署
以前部署的做法,是将项目打包成war,然后在服务器安装tomcat,再将war部署到tomcat服务器。而现在,SpringBoot可以通过引入一个spring-boot-maven-plugin
插件将项目打包成为一个可以执行的jar包。
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.7.2</version>
</plugin>
</plugins>
</build>
1.4 项目配置的原理
依赖管理spring-boot-starter-parent中
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.2</version>
</parent>
它的父项目spring-boot-dependencies
几乎声明了开发中常用的依赖版本号,因此在开发中引入依赖无需关注版本号,即自动仲裁
。
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.7.2</version>
</parent>
而且也可以根据开发中的需求进行修改版本号:首先在spring-boot-dependencies
查看依赖的版本定义,然后在spring-boot-starter-parent
中进行修改。
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<mysql-version>5.1.43</mysql-version>
</properties>
1.5 场景启动器
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
形如spring-boot-starter-***,即为Spring-boot场景启动器,只要引入starter,这个场景的所有常规需要的依赖我们都自动引入,Spring Boot所有支持的场景:
可以在项目pom.xml下右键生成分析依赖树:
场景启动器最底层的依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>2.7.2</version>
<scope>compile</scope>
</dependency>
1.6 自动配置
1.6.1 自动配置tomcat
①引入tomcat依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<version>2.7.2</version>
<scope>compile</scope>
</dependency>
1.6.2 自动配置Spring-MVC
①引入MVC全套组件
如DispatcherServlet用于拦截所有请求、字符编码拦截器CharacterEncodingFilter用于解决返回响应中文乱码问题、viewResolver视图解析器、文件上传解析器multipartResolve
②自动配置好SpringMVC常用组件(功能)
1.6.3 自动配置web常见功能
如上面说的字符编码问题
1.6.4 默认的包结构
主程序所在的包
及其下面的包
里面的组件都会被默认扫描出来,无需配置以前的包扫描。同时也可以自行指定扫描的包。
①通过SpringBootApplication注解的属性值scanBasePackages指定
@SpringBootApplication(scanBasePackages = "com.hikaru.boot")
②通过使用ComponentScan包扫描注解
③通过三个混合注解,等同于SpringBootApplication+属性值的方式
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan
1.6.5 配置的默认值
默认配置都会最终映射到一个配置文件,如spring.servlet.multipart.max-file-size即上传文件的文件最大值设定最终会映射MultipartProperties。
然后配置文件的值会映射到对应的类中,如MultipartProperties类,最终带着配置信息在IOC容器中创建对象。
1.6.6 按需加载所有的自动配置项
引入哪些场景,那些场景的自动配置才会进行。SpringBoot的所有自动配置功能都在spring-boot-autoconfigure
中。如spring-boot-starter-web
场景依赖spring-boot-starter
,spring-boot-autoconfigure
包就存在于其中。
2 容器注解
2.1 @Configuration注解
@Configuration注解 + @Bean的方式进行组件注册,详细可以参照之前的博文:【Spring注解驱动】(一)IOC容器 - Tod4 - 博客园
@Bean注册的组件默认是单实例的(@Bean的单例、多例可以由@Scope注解进行控制),@Configuration的配置类也是一个组件,而且这个组件默认是一个代理对象
,即这个对象负责进行其他组件的实例化。
2.1.1 Lite 模式
而在SpringBoot中,@Configuration进行了部分修改,增加了属性proxyBeanMethods
,属性值为true时,表示经过代理对象创建的组件
默认为单实例,为false则为多实例。
@Configuration(proxyBeanMethods = true)
public class MyConfig {
@Bean
public User user() {
return new User(1, "ryuu", "123");
}
@Bean
public Pet tomCat() {
return new Pet("Tom");
}
}
进行测试,第一个为true,第二个为false,这是因为:第二个是通过代理对象调用方法,创建的因此需要服从proxyBeanMethods
参数的设定,SpringBoot在方法执行的时候总会先行检查IOC容器中是否存在该组件,如果存在则直接返回而不会去重新创建,以此实现单例模式;而第一个不用,而且此时输出bean则会显示:com.hikaru.boot.config.MyConfig$$EnhancerBySpringCGLIB$$14aea548@4565a70a,表明这个是一个代理对象
@SpringBootApplication(scanBasePackages = "com.hikaru.boot")
public class MainApplication {
public static void main(String[] args) {
// 返回IOC容器
ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);
User user1 = (User) run.getBean("user");
User user2 = (User) run.getBean("user");
System.out.println(user1 == user2);
MyConfig bean = run.getBean(MyConfig.class);
User user3 = bean.user();
User user4 = bean.user();
System.out.println(user3 == user4);
}
}
Lite模式的应用场景大多是在组件依赖中,即一个类中包含着子类,实例化的时候能够保证子类的实例化对象和IOC容器中的是同一个。
2.1.2 Full 模式
若将参数改为false(默认为true),则输出bean为com.hikaru.boot.config.MyConfig@378bd86d是一个真正的对象,而不需要进行代理,创建的对象自然也不是单例的。
2.2 @Conditional注解实现按条件注册
正常的使用方法是声明一个Condition的实现类作为注解的value值,并实现其matches方法在其中写好条件逻辑,以判断注解所在的类是否满足条件注册,这里不再赘述。
SpringBoot则在此基础上新增了大量不同场景的注解,如@ConditionalBean表示容器存在其他Bean则注册此Bean。
2.3 @ImportSource导入原生配置文件
为了防止原生的配置文件如xml手动转换为注解方式过于繁琐,可以在相关配置类上添加@ImportSource注解即可将配置Bean导入配置类。
2.4 ConfigurationProperties配置绑定
回忆一下之前Property配置文件绑定的方法,是通过
在类上添加 @PropertySource 注解,然后通过 @Value('${环境变量名}') 的方式
或者直接在容器中:
ConfigurableEnvironment environment = context.getEnvironment();
String property = environment.getProperty("环境变量名");
2.4.1 @ConfigurationProperties 绑定组件和配置文件
而在SpringBoot中,则可以使用下面的方式,使得组件可以从SpringBoot配置文件application.properties
中绑定以mycar为开头的变量,并在容器自动装配的时候进行属性赋值。
@ConfigurationProperties(prefix = "mycar")
@Component
public class Car
application.properties
server.port=8080
mycar.carName = BYD
mycar.carPrice = 1000000
这种方式只能适用于容器中的组件
2.4.2 @EnableConfigurationProperties
也可以使用下面的方式进行配置绑定,@EnableConfigurationProperties有两个功能:
开启组件的配置绑定
在容器中注册该组件
简而言之,@EnableConfigurationProperties + @ConfigurationProperties = @ConfigurationProperties + @Component
@Configuration(proxyBeanMethods = false)
@EnableConfigurationProperties(Car.class)
public class MyConfig
3 自动配置原理入门
源码先略过了。。
3.1 引导加载自动配置类
3.1.1 SpringBootConfiguration
4 最佳实践
4.1 SpringBoot如何编写
引入场景依赖
查看自动配置了哪些(选做)
自己分析:引入场景依赖中有xxxAutoConfiguration表示自动配置
开启debug模式:在application.properties中设置debug=true,然后
是否需要修改配置
自定义加入或替换组件:@Bean @Component 和 自定义器xxxxCustomer
如设置Spring启动的banner图,直接在application.properties添加
spring.banner.image.location = classpath:banner.png
4.1 Lombok简化JavaBean开发
- 引入lombok依赖,SpringBoot对其自动版本仲裁,在spring-boot-dependencies中可以看到信息。
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
搜索安装lombok插件,新版idea已经自动集成了
在Bean上添加
@Data
注解,即可在编译的时候自动生成getter
、setter
方法在 Bean上添加
@toString
注解,即可在编译的时候自动生成toString
方法在 Bean上添加
AllArgsConstructor
注解,即可在编译的时候自动生成有参构造器
在 Bean上添加
NoArgsConstructor
注解,即可在编译的时候自动生成无参构造器
在类上添加
@Slf4j
注解,然后可以在类方法中使用log
打印日志信息
4.2 devtools热部署
引入devtools依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
ctrl+f9,如果是对静态文件的修改可以不经过重启服务器直接run,否则会进行服务器重启
4.3 SpringInitializer
可以在创建的时候选择场景启动器和版本,生成配置文件和容器启动器。使得我们只需要关注业务逻辑的编写。
【SpringBoot2】 SpringBoot2核心技术 基础的更多相关文章
- 【01】SpringBoot2核心技术-基础入门
SpringBoot 2 1. SpringBoot2核心技术-基础入门 01 Spring与SpringBoot 1.Spring 能做什么 1.1 Spring的能力 微服务:将一个应用的所有功能 ...
- 一、搭建SpringBoot2.0.0M4基础Web项目
本次开发环境为: 系统:Linux Mint 18 JDK:1.8 开发工具:IntelliJ IDEA 2017.2.4 1.启动IDEA工具,开始创建一个基础项目.点击Create New Pro ...
- Java基础巩固——《Java核心技术基础·卷一:基础知识》
阅读记录追踪:前言部分 阅读前先看:简介.目录和勘误! Java编程语言是一种多用途.并发的.基于类的.面向对象的编程语言:编译时通常包括将持续转化成机器无关的字节码表示.运行时活动包括加载和链接执行 ...
- 【读书笔记】Java核心技术-基础知识-反射
在网页中运行Java程序称为applet. 反射 这项功能被大量地应用于JavaBeans中,它是Java组件的体系结构. 能够分析类能力的程序称为反射(reflective).反射机制的功能及其强大 ...
- 十倍效能提升——Web 基础研发体系的建立
1 导读 web 基础研发体系指的是, web 研发中一线工程师所直接操作的技术.工具,以及所属组织架构的总和.在过去提升企业研发效能的讨论中,围绕的主题基本都是——”通过云计算.云存储等方式将底层核 ...
- springboot mybatis 使用多数据源
SpringBoot系列博客目录,含1.5.X版本和2.X版本 springboot2.0正式版发布之后,很多的组件集成需要变更了,这次将多数据源的使用踩的坑给大家填一填.当前多数据源的主要为主从库, ...
- 2014年7月份第1周51Aspx源码发布详情
QF万能视频播放器源码 2014-6-30 [VS2010]本源码是一个万能视频播放器源码.可实现各种格式的影片播放功能. 1.点击[开始]按钮,弹出窗口,选择影片路径,确定后即可播放.可拖拽滚 ...
- Web 程序的建立
1 导读 web 基础研发体系指的是, web 研发中一线工程师所直接操作的技术.工具,以及所属组织架构的总和.在过去提升企业研发效能的讨论中,围绕的主题基本都是——”通过云计算.云存储等方式将底层核 ...
- 新零售下的 AI智能货柜
公司有个智能货柜,通过微信扫码开门,拿货,自动扣款,挺智能的.还不错.研究一下原理,网上查了一下. 文章简介: 目前新零售风刮的蛮大,笔者进入该领域近一年,负责过无人便利店.智能货柜.智慧商超等产品, ...
- (六)SpringBoot2.0基础篇- Redis整合(JedisCluster集群连接)
一.环境 Redis:4.0.9 SpringBoot:2.0.1 Redis安装:Linux(Redhat)安装Redis 二.SpringBoot整合Redis 1.项目基本搭建: 我们基于(五) ...
随机推荐
- mysql_记录操作
在MySQL管理软件中,可以通过SQL语句中的DML语言来实现数据的操作,包括 使用INSERT实现数据的插入 UPDATE实现数据的更新 使用DELETE实现数据的删除 使用SELECT查询数据以及 ...
- IndexError: invalid index of a 0-dim tensor. Use tensor.item() to convert a 0-dim tensor to a Python number
print('Epoch[{}/{}], loss:{:.6f}'.format(epoch+1,num_epoch,loss.data[0])) 将loss.data[0] 改为loss.item( ...
- VUE-使用touchstart、touchmove、touchend实现拖拽卡片列表,实现更新排序功能
感谢本文参考地址,原文解析更加清晰如有需要请移步:https://blog.csdn.net/weixin_40400844/article/details/114849253 怕原链接失效,将代码拷 ...
- midway 框架学习
最近 和别人一块运维 开源 产品,后台需要用到 midway框架,所以进行学习. 首先就是midway的搭建, 首先 npm init midway ,初始化项目,选择 koa-v3 template ...
- Websocket是什么?
一. WebSocket是什么? Websocket是一种网络通信协议,是一个在计算机里专门在[两点]之间传输数据的约定和规范. 二. 为什么存在WebSocket? 因为 HTTP 协议有一个缺陷: ...
- MySQL Workbench常用快捷键及修改方法
常用快捷键: 1. 执行整篇sql脚本:Ctrl + Shift + Enter 2. 执行当前行:Ctrl + Enter 3. 注释/取消注释: Ctrl + / 4. 格式化sql语句(美化sq ...
- NFS只能挂载为nobody的解决办法
方法一 mount中指定参数 mount -t nfs -o vers=3 192.168.23.23:/data1 /data1 这种方法不推荐,但可以解决临时挂载的需求 方法二 cat /etc/ ...
- 微信小程序中如何上传图片来识别身份证银行卡?
Page({ shibie2(){ //识别银行卡 var that=this wx.chooseImage({ //选择图片 count: 1, //上传数量 sizeType: ['origina ...
- oracle学习笔记1 安装 虚拟机 plsql 连接 oracle
第一步就是安装 为了节省资源,运行起来更快捷,首先是在电脑上安装好vm虚拟机, 新建虚拟机,安装xp,也就是把xp光盘文件导入, 接着在虚拟机中下载oracle,解压的话会用到WinRAR,也一并导入 ...
- nat是干什么的,为什么要有nat?以及谈谈ovs里使用ct实现nat功能
博客竟然不显示更新的时间,只有个发布时间.看起来像2个月没更新一样,其实更新了几行呢.好几个东西想理一下,本来想和周记放一起了,但放一起就没有主题了. 当然一搜也有一些很好的博客,更详细:https: ...