《Spring Boot 实战派》--01 Spring Boot基础
本文记录的是《Spring Boot 实战派》--让开发像搭积木一样简单
---龙中华
1. 认识Spring Boot
建立高阶的思维方式:
一般情况下,框架都有错误的反馈机制,例如: 通过日志或者控制台输出错误或提示信息。所以,在遇到问题或报错时,不要急于去搜索,更不要急于提问,一定要仔细地查看程序的报错信息或提示反馈;
学会自己发现和解决问题:
首先:要发现问题所在,一般通过“cause by”字样提示出现的位置,还可以查看“type” 和 “status”;
然后思考解决办法:搜索引擎--》 搜索问题的关键字
2. 准备开发环境
1. 打开oracle开发网站
2.选择适合自己电脑系统(32位或64位)的版本进行下载
3. 安装包下载完成后,双击后缀名“.exe”的文件,然后按照提示一次单击“下一步”按钮,完成安装;
4. 配置jdk路径
5. 安转及配置maven
打开Maven官方网站
单击“apache-maven-3.6.0-bin.zip”下载文件
配置maven的环境变量
检查安装情况: mvn -v
6. 认识pom.xml文件
<dependency>与</dependency>之间有三个标识:
groupId : 定义隶属的实际项目
artifactId : 定义项目中的一个模块
version : 依赖或项目的版本号
scope : 如果有一个在编译时需要而发布时不需要的Jar包,则可以用scope标签标记该包,并将其值设为provided
scope标签的参数如下:
参数 描述 compile scope的默认值,标识被依赖项目需要参与当前项目的编译、测试、运行阶 段。打包时也要包含进去 povided provided表示打包时可以不用打包进去,web container会提供。该依赖理 论上可以参与编译、测试、运行周期 runtime 表示dependency不作用在编译阶段,但会作用在运行和测试阶段,如JDBC 驱动使用运行和测试阶段 system 和provided相似,但是在系统中要以外部Jar包的形式提供,Maven不会在 repository中查找它 test 表示dependency作用在测试阶段,不作用在运行阶段。只在测试阶段使用, 用于编译和运行测试代码,不会随项目发布
properties :如果要使用自定义的变量,则可以在<properties>和</properties>元素中进行变量的定义
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<java.version>1.8</java.version>
<solr.version>8.0.0</solr.version>
</properties>
如果要使用上面定义的变量,可以通过表达式“${变量名}”来调用
<dependency>
<groupId>org.apache.solr</groupId>
<artifactId>solr-solrj</artifactId>
<version>${solr.version}</version>
</dependency>
plugin:
在创建Spring Boot项目时,默认提供了sprin-boot-maven-plugin插件。它提供打包时需要的信息,将Spring Boot应用打包为可执行的JAR或WAR文件;
完整的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 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <!-- 模型版本,声明项目描述符遵循哪一个POM模型版本,模型版本很少改变,但是它是必不可少的, 这是为了Maven引入特性或其他模型变更时,确保稳定性--> <modelVersion>4.0.0</modelVersion> <!-- 父项目的坐标,如果项目没规定某个元素的值,那么父项目中的对应值即为项目的默认值,坐标包括groupId、artifactId、version--> <parent> <!-- 被继承的父项目的唯一标识符--> <groupId>org.springframework.boot</groupId> <!-- 被继承的父项目的构件标识符--> <artifactId>spring-boot-starter-parent</artifactId> <!-- 被继承的父项目的版本号--> <version>2.5.0.RELEASE</version> <!-- 父项目的pom.xml文件的相对路径,相对路径允许一个不同的路径,默认值是../pom.xml Maven 先在构建当前项目的地方寻找父项目的pom, 然后在文件系统的relativePath位置寻找(如果没找到,则继续在本地仓库寻找), 最后再远程仓库中寻找父项目的pom --> <relativePath/> <!-- lookup parent from repository --> </parent> <!-- 公司或组织的唯一标志(项目的全球唯一标识符),并且配置时生成的路径也是由此生成的,通常使用全限定的包名区分该项目和其他项目, 如com.companyname.project, Maven会将该项目生成的JAR包放在本地路径:/com/companyname/project --> <groupId>com.feng</groupId> <!-- 项目的唯一ID,一个groupId 下面可能有多个项目,靠artifactId来区分 --> <artifactId>springbootmybatis</artifactId> <!-- 版本号,格式为主版本.次版本.增量版本-限定版本号--> <version>0.0.1-SNAPSHOT</version> <!-- 项目的名称,用于Maven产生的文档--> <name>springbootmybatis</name> <description>Demo project for Spring Boot</description> <properties> <!-- 项目开发的java版本号--> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--mybatis启动器--> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.2.0</version> </dependency> <!--mysql启动器--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <!--druid数据源--> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.12</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <!-- 构建项目(打包生成可执行文件)需要的信息--> <build> <!-- 项目使用的插件列表--> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> <!--配置Generator插件--> <plugin> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-maven-plugin</artifactId> <version>1.4.0</version> <dependencies> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> </dependencies> <!--配置指定文件的路径--> <configuration> <configurationFile>${project.basedir}/src/main/resources/generatorConfig.xml</configurationFile> <verbose>true</verbose> <overwrite>true</overwrite> </configuration> </plugin> </plugins> <!--配置资源拷贝插件--> <resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.xml</include> </includes> </resource> <resource> <directory>src/main/resources</directory> <includes> <include>**/*.yml</include> <include>**/*.properties</include> <include>**/*.xml</include> </includes> </resource> </resources> </build> </project>
mvn install : install-file -Dfile= D:\java-20181216\kaptcha-2.3.2.jar -Dgroupld=kcDgroupld -Dartifactld=kcartifactld -Dversion=0.0.1 -Dpackaging=jar
3. 使用开发工具
3.1 安装lombok插件
1. 先在idea的Plugins中安装Lombok插件
2. 添加lombok的依赖
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency>
3.使用lombok注解
@Data: 自动生成Getter/Setter、toString、equals、hashCode方法,以及不带参数的构造方法
@NonNull : 帮助处理NullPointerException
@CleanUp : 自动管理资源,不用再在finally中添加资源的close方法
@NoArgsConstructor : 自动生成构造方法
AllArgsConstructor : 自动生成构造方法
RequiredArgsConstructor : 自动生成构造方法
@Value : 用于注解final类
@Builder : 产生复杂的构建器API类
@SneakyThrows : 用于处理异常
@Synchronized : 同步方法的转化
@Log : 支持使用各种日志(logger)对象。只要在使用时,用对应的注解进行标注,比如使用Log4j作为日志库,则在需要加入日志的位置写上注解@Log4j即可
3.2 打包成可执行的JAR包
项目开发完成后,可以直接用Idea将其打包成JAR包运行,也可以打包成WAR包
在这里以打包成JAR包为例:
[INFO)一- maven 「- plugin:3 1.1 :ja 「( default-ja 「)@ demo 一-
[INFO) Building jar: D:\2018\java\book\book code\HelloWorld\target\demo-0.01-SNAPSHOT.Jar
[INFO) --- spring-boot-maven-plugin:2.1.3 RELEASE :repackage(repackage) @ demo
[INFO] Replacing main tifact with epackaged chive
[INFO) BUILD SUCCESS
(6)进入这个目录,在地址栏输入“cmd ”命令,在弹出的 cmd 命令窗口中 输入如下命令:
java -jar demo-0.01-SNAPSHOT.Jar
3.3 智能提示代码
3.4 自动提示参数
3.5 自定义高复用代码块
public static void main (String args) { }
3.5.2 IDEA 设置注释信息
![](https://img2022.cnblogs.com/blog/1267435/202204/1267435-20220423201435434-1713240659.png)
3.5.3 超能的“Alt + Enter”快捷键
3.6 IDEA 快捷键
![](https://img2022.cnblogs.com/blog/1267435/202204/1267435-20220423203417678-2011033246.png)
4. Spring Boot 基础
4.1 spring boot 的项目结构
4.2 Spring boot的自动配置
Java -Jar *.jar -debug
<dependency> <groupld>org.springframework.boot</groupld> <artifactld>spring-boot-devtools</artifactld> <optional>true</optional> </dependency>
该依赖在项目打包时会被禁用, 如果用“java -jar”命令启动应用程序,或使用一个特定的classloader启动应用程序,则 Spring Boot 会认为
这是一个“生产环境" ,所有不会运行。如果项目中使用了 Redis 作为缓存, 则 请禁止使用热部署,以免出现类型转换等问题。
4.3 系统注解
-
Override:用于修饰方法,表示此方法重新了父类方法
- Deprecated: 用于修饰方法,表示此方法已经过时,经常在版本升级后会遇到
- SuppressWarnings: 告诉编译器忽视某类编译警告
![](https://img2022.cnblogs.com/blog/1267435/202204/1267435-20220425120840204-425445149.png)
@Autowired @Qualifier("userService")
而@Resource 和它不同,@ Resource 自带 name 属性。
使用在方法上的注解:
$.ajax({ url : "/post", type : "POST", data : '{"name":"longzhiran"}', //这里不能写成 content-type contentType:"application/json charset=uth-8" success:function(data){ alert("request success!"); } });
在控制器中接收数据的代码如下:
@RequestMapping(”/post”)
public void post(@RequestBody String name){
//省略
}
@GetMapping( "/test”)
@ResponseBody
public String test(){
return "test";
}
其他常用注解:
使用配置文件:application.yml
server: port: 8080 servlet: session: timeout: 30 tomcat: uri-encoding: UTF-8 age: 19 name: zhaodabao personinfo: name: zhaoxiaobao age: 3
代码解释如下
• server: 定义服务器的配置。
编写单元测试:
package com.feng.springbootmybatis; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; @SpringBootTest @RunWith(SpringRunner.class) public class PropertiesTest { //获取配置文件中的age @Value("${age}") private int age; //获取配置文件中的name @Value("${name}") private String name; /** * 该注解表示一个测试方法 */ @Test public void getAge() { System.out.pintln(age); } @Test public void getName () { System.out.pintln(age); } }
代码解释如下
package com.example.demo;
@Component
@ConfigurationProperties(prefix="personinfo")
public class GetPersonlnfoProperties {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
@ConfigurationProperties :把同类配置信息自动封装成一个实体类。其属性prefix 代表配置文件中配置项的前缀,如在配置文件中定义的“ personinf。”
@Bean @ConfigurationProperties(prefix="personinfo") public GetPersonlnfoProperties getPersonlnfoProperties() { return new GetPersonlnfoProperties(); }
获取配置项的值:
@Autowired private GetPersonlnfoProperties getPersonlnfoPropertiesp; @Test public void getPersonlnfoPropertiesp() { System.out.println(getPersonlnfoPropertiesp.getName()+getPersonlnfoPropertiesp.getAge()); }
com.example.name=${name:longtao} com.example.age = 18 com.example.address[O]=北京 com.example.address[1 ]=上海 com.example.address[2]=广州
import lombok.Data;
import org.springframewo boot.context.propertiesConfigurationProperties;
import org.springframework. stereotype. Component;
import java.util.List;
@Data
@Component
@ConfigurationProperties(prefix =”com.example”)
public class CoExample{
private String name;
private int age;
private List<String> addresp;
}
- @Component :声明此类是 Sp ing 管理类。白常用在无法用@Service 、@Repositor 描述的 Spring 管理类上, 相当于通用的注解。
- @ConfigurationProperties 注入 application. properties 配置文件中的配置项。
- Data :自动生成 Setting、 Getting、 toString、equals、 hash Code 方法,以及不带参数的构造方法
注意:
这里一定要注意编码,如果使用的是中文,则有可能出现乱码,请单击 IDEA 菜单栏中的“File --> Settings --> Editor--->File Encodings 命令, 然后将 Properties Files (*.properties) 下的 " Defaul encoding for properties files " 设置为 UTF-8,并勾选 "Transparent native-to-ascii conversion"复选框。如果依然不行,则可以尝试删除文件,然后重新创建这个文件
port: 8080 servlet: session: timeout: 30 tomcat: uri-encoding: UTF-8 myenvironment: name:开发环境
(3)配置生产环境。
在application-prod.yml 文件中输入以下代码:
port: 8080 servlet: session: timeout: 30 tomcat: uri-encoding: UTF-8 myenvironment: name:生产环境
(4) 配置主配置文件。
spring: profiles: active: dev
注:active命令表示当前设定生效的配置文件是dev (调试环境);如果要发布,则直接将active的值改为“prod“
spring.profiles.active=dev
java -jar name.jar --spring.profiles.active=prod