一、SpringBoot簡介
1.1 原有Spring的優缺點
1.優點
Spring是JavaEE的輕量級替代品,為JavaEE開發提供了一種相對簡單的方法,通過依賴注入和面向切面編程,用簡單的Java對象實現了EJB的功能。 -- 說白了就是讓我們快速的使用Spring。
2.缺點
配置過於繁瑣;
在環境搭建時,導入坐標之間版本的不兼容問題阻礙項目的開發。
1.2 SpringBoot概述
1.解決Spring的缺點
基於約定優於配置的思想,讓開發人員不必在配置與邏輯業務之間進行思維的切換,專注於邏輯業務的代碼編寫中,提高開發效率。
2.SpringBoot的特點
為基於Spring的開發提供更快的入門體驗;
開箱即用,沒有代碼生成,也無需XML配置,同時也可以修改默認值來滿足特定的滿足;
提供一些大型項目中的非功能性特性,如嵌入式服務器、安全、健康監測、外部配置等;
SpringBoot不是對Spring功能上的增強,而是提供了一種快速使用Spring的方式。-- Spring有的功能SpringBoot都有。
3.SpringBoot的核心功能
起步依賴:
起步依賴本質上是一個Maven項目的對象模型(POM),定義了對其他庫的傳遞依賴;
簡單的說,起步依賴就是將具備某種功能的坐標打包到一起,並提供一些默認的功能;
自動配置:
SpringBoot的自動配置是一個運行時(程序啟動時)的過程,決定Spring配置需要用哪個,不需要用哪個,SpringBoot自動完成該過程。
二、SpringBoot快速入門
2.1 入門Demo
-- SpringBoot在第一次加載依賴時很慢,請保持足夠的耐心:(
1.創建Maven工程 -- 普通maven工程即可
2.添加SpringBoot的起步依賴spring-boot-starter-parent
1 <parent> 2 <groupId>org.springframework.boot</groupId> 3 <artifactId>spring-boot-starter-parent</artifactId> 4 <version>2.0.1.RELEASE</version> 5 </parent>
SpringBoot要集成SpringMVC進行Controller的開發,所以項目要導入web的啟動依賴
1 <dependencies> 2 <dependency> 3 <groupId>org.springframework.boot</groupId> 4 <artifactId>spring-boot-starter-web</artifactId> 5 </dependency> 6 </dependencies>
3.編寫SpringBoot引導類
通過SpringBoot提供的引導類起步SpringBoot才可以進行訪問
1 @SpringBootApplication 2 public class MySpringBootApplication { 3 public static void main(String[] args) { 4 // run方法,表示運行SpringBoot的引導類,run里面的參數就是引導類的字節碼文件 5 SpringApplication.run(MySpringBootApplication.class); 6 } 7 }
4.編寫Controller
在引導類的MySpringBootApplication同級包中創建QuickStartController
1 @Controller 2 public class QuickStartController { 3 @RequestMapping("/quick") 4 @ResponseBody 5 public String quick(){ 6 return "SpringBoot訪問成功"; 7 } 8 }
5.測試
執行SpringBoot引導類的main方法
打開瀏覽器訪問url地址:http://localhost:8080/quick
這樣子就是訪問成功啦!!!!
2.2 快速入門解析
1.代碼解析
@SpringBootApplication:標注SpringBoot的啟動類,該注解具備多種功能(后面詳細剖析);
SpringApplication.run(MySpringBootApplication.class) 代表運行SpringBoot的啟動類,參數為SpringBoot啟動類的字節碼對象
2.SpringBoot工程熱部署
在pom.xml中添加配置
1 <!--熱部署配置--> 2 <dependency> 3 <groupId>org.springframework.boot</groupId> 4 <artifactId>spring-boot-devtools</artifactId> 5 </dependency>
注:在IDEA中初次進行熱部署會失敗,原因是IDEA默認情況下不會自動編譯,需要對idea進行自動編譯的設置。
Settings——>Build——>Compiler——>build project automatically(勾選)
然后shift+Ctrl+/,選擇Registry——>compiler.automake.allow.when.app.running(勾選)
操作完成后先重啟項目,然后對Controller中的返回字符串稍作修改
1 @Controller 2 public class QuickStartController { 3 @RequestMapping("/quick") 4 @ResponseBody 5 public String quick(){ 6 return "SpringBoot熱部署成功"; 7 } 8 }
刷新剛剛的頁面,頁面刷新成功:)
3.使用IDEA快速創建SpringBoot項目
-- 需要在有網絡連接(依賴導入超慢):(
這時我們會發現idea給我們創建的SpringBoot項目中的pom.xml已經導入了我們選組的web的起步依賴坐標以及一些其他的配置。
1 <?xml version="1.0" encoding="UTF-8"?> 2 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 3 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4 <modelVersion>4.0.0</modelVersion> 5 6 <groupId>com.buwei</groupId> 7 <artifactId>springboot02</artifactId> 8 <version>0.0.1-SNAPSHOT</version> 9 <packaging>jar</packaging> 10 11 <name>springboot02</name> 12 <description>Demo project for Spring Boot</description> 13 14 <parent> 15 <groupId>org.springframework.boot</groupId> 16 <artifactId>spring-boot-starter-parent</artifactId> 17 <version>2.1.0.RELEASE</version> 18 <relativePath/> <!-- lookup parent from repository --> 19 </parent> 20 21 <properties> 22 <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 23 <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> 24 <java.version>1.8</java.version> 25 </properties> 26 27 <dependencies> 28 <dependency> 29 <groupId>org.springframework.boot</groupId> 30 <artifactId>spring-boot-starter-web</artifactId> 31 </dependency> 32 33 <dependency> 34 <groupId>org.springframework.boot</groupId> 35 <artifactId>spring-boot-starter-test</artifactId> 36 <scope>test</scope> 37 </dependency> 38 </dependencies> 39 40 <build> 41 <plugins> 42 <plugin> 43 <groupId>org.springframework.boot</groupId> 44 <artifactId>spring-boot-maven-plugin</artifactId> 45 </plugin> 46 </plugins> 47 </build> 48 </project>
這里的話直接拷貝入門案例中的Controller進行訪問就可以啦!!!
三、SpringBoot原理分析
。。。。先掌握使用。。。。。原理后面補充。。。。可以自己點進源碼了解。。。。
反正也就是maven的依賴傳遞、注解后的自動裝配等等等等。。。。
四、SpringBoot的配置文件
4.1 SpringBoot配置文件的類型
1.SpringBoot配置文件類型和作用
SpringBoot是基於約定的,所以很多配置都有默認值,如果想使用自己的配置來替換默認配置的話,就可以使用application.properties或application.yml(yaml)進行配置。
SpringBoot默認會從Resource陌路下加載application.properties或application.yml(yaml)文件,其中.properties文件的優先級高於.yml文件,下面主要對yml文件進行講解。
2.application.yml配置文件
簡介:yml文件是YAML(YAML Aint Markup Language)編寫的文件格式,YAML是一種直觀的能夠被電腦識別的數據序列化格式,易閱讀,可以與腳本語言交互,可以被支持YAML庫的不同的編程語言程序導入,如:C/C++, Ruby, Python, Java, Perl, C#, PHP等。YML文件是以文件是以數據為核心的,比傳統的XML方式更加簡潔。
yml文件的擴展名可以使用.yml或.yaml.
語法:
1.普通數據:key: value
1 name: buwei
注意:value之前有一個空格
2.對象數據:key:
key1: value1
key2: value2
或:key: {key1: value1,key2: value2}
1 person: 2 name: buwei 3 age: 25 4 #或者 5 person: {name: buwei,age: 25}
注:key1前面的空格個數不限定,在yml語法中,相同縮進代表同一個級別
3.Map數據:同對象寫法
4.數組(List、Set)數據:key:
- value1
- value2
或:key:[value1,value2]
1 city: 2 - beijing 3 - shanghai 4 - guangzhou 5 - shenzhen 6 #或者 7 city: [beijing,shanghai,guangzhou,shenzhen]
注:value和 - 之間有一個空格
5.集合中元素為對象形式時
1 student: 2 - name: zhangsan 3 age: 18 4 - name: lisi 5 age: 2 6 #或者 7 student:[{name: zhangsan, age: 18},{name: lisi, age: 20}]
上面的關於SpringBoot的配置文件,主要目的是對是SpringBoot中默認的配置信息進行修改的,關於相關的配置格式可以查詢spring的官網。
4.2 配置文件與配置類的屬性映射方式
1.使用注解@Value映射
我們通常使用@Value注解將配置文件中的值映射到一個Spring管理的Bean的字段上。
application.properties配置如下:
1 person: 2 name: buwei 3 age: 18
在Java代碼中:
1 @Value("${person.name}") 2 private String name; 3 @Value("${person.age}") 4 private Integer age;
2.使用注解@ConfigurationProperties映射
通過注解@ConfigurationProperties(prefix = "配置文件中的key的前綴")可以將配置文件中的配置自動與實體進行映射。
補充(非必須):在pom.xml中添加依賴 -- 如果是在先Java代碼中配置好成員屬性后然后再來補充配置文件的話可以在書寫時獲得相應的提示。
1 <!--@ConfiguaritionProperties的執行器的配置--> 2 <dependency> 3 <groupId>org.springframework.boot</groupId> 4 <artifactId>spring-boot-configuration-processor</artifactId> 5 <optional>true</optional> 6 </dependency>
application.yml配置如下:作用同application.properties
1 person: 2 name: zhangsan 3 age: 18
實體Bean中的代碼如下:
1 @Controller 2 @ConfigurationProperties(prefix = "person") 3 public class QuickStartController02 { 4 private String name; 5 private Integer age; 6 7 @RequestMapping("/quick") 8 @ResponseBody 9 public String quick(){ 10 return "person中的name="+name+",age="+age; 11 } 12 13 public String getName() { 14 return name; 15 } 16 17 public void setName(String name) { 18 this.name = name; 19 } 20 21 public Integer getAge() { 22 return age; 23 } 24 25 public void setAge(Integer age) { 26 this.age = age; 27 } 28 }
使用@ConfigurationProperties注解,對應的實體字段必須提供set方法,使用@Value方法不必提供set方法。
五、SpringBoot整合其他技術
5.1 SpringBoot整合Mybatis
1.添加Maven坐標依賴 -- 注意這里的Mybatis中的依賴是由Mybatis提供的
1 <!--mybatis起步依賴--> 2 <dependency> 3 <groupId>org.mybatis.spring.boot</groupId> 4 <artifactId>mybatis-spring-boot-starter</artifactId> 5 <version>1.1.1</version> 6 </dependency> 7 8 <!-- MySQL連接驅動 --> 9 <dependency> 10 <groupId>mysql</groupId> 11 <artifactId>mysql-connector-java</artifactId> 12 </dependency>
2.添加數據庫的連接信息
-- 下面紅色部分的配置可能是受我SpringBoot的版本信息的影響,我這里引的SpringBoot的版本是2.1.0,降低版本可以用我們早先常用的配置。
1 #DB Configuration: 2 spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver 3 spring.datasource.url=jdbc:mysql://127.0.0.1:3306/springboot_mybatis?serverTimezone=UTC 4 useUnicode=true&characterEncoding=utf8 5 spring.datasource.username=root 6 spring.datasource.password=root
注:第一個紅色位置是新版數據庫連接驅動:使用舊的驅動控制台會打印 -- Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class is `com.mysql.cj.jdbc.Driver'. The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary。意思就是這個驅動已經過時,而且訪問controller的時候會報錯,不是很懂是什么原因,反正使用了就沒錯,同時還需要結合第二個標注位置一起才能完全解決問題。
第二個紅色位置是為了解決連接mysql的jdbc驅動最新版引發的問題,沒有配置的話在訪問controller的時候會報一個異常:java.sql.SQLException: The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the serverTimezone configuration property) to use a more specifc time zone value if you want to utilize time zone support.
3.在數據庫中創建user表
1 DROP TABLE IF EXISTS `user`; 2 CREATE TABLE `user` ( 3 `id` int(11) NOT NULL AUTO_INCREMENT, 4 `username` varchar(50) DEFAULT NULL, 5 `password` varchar(50) DEFAULT NULL, 6 PRIMARY KEY (`id`) 7 ) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8; 8 -- ---------------------------- 9 INSERT INTO `user` VALUES ('1', 'zhangsan', '123'); 10 INSERT INTO `user` VALUES ('2', 'lisi', '123');
打開表查看信息:
4.創建實體User類
1 public class User { 2 private Long id; // 主鍵id 3 private String username;// 用戶名 4 private String password;// 密碼 5 //省略getter和setter方法 6 }
5.編寫Mapper接口
1 @Mapper 2 public interface UserMapper { 3 public List<User> queryUserList(); 4 }
注:@Mapper標記該類是一個mybatis的Mapper接口,可以被SpringBoot自動掃描到Spring的上下文中。
6.配置mapper接口映射文件
在src\main\resource下與UserMapper同級目錄下加入UserMapper.xml配置文件
1 <?xml version="1.0" encoding="utf-8" ?> 2 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 3 "http://mybatis.org/dtd/mybatis-3-mapper.dtd" > 4 <mapper namespace="com.buwei.mapper.UserMapper"> 5 <select id="queryUserList" resultType="user"> 6 select * from user 7 </select> 8 </mapper>
7.編寫引導類
1 @SpringBootApplication 2 public class SpringBootMybatisApplication { 3 public static void main(String[] args) { 4 SpringApplication.run(SpringBootMybatisApplication.class, args); 5 } 6 }
8.在application.properties中添加mybatis的信息
1 #spring集成Mybatis環境 2 #pojo別名掃描包 3 mybatis.type-aliases-package=com.buwei.entity 4 #加載Mybatis映射文件 5 mybatis.mapper-locations=classpath:com/buwei/mapper/*Mapper.xml
9.編寫Controller
1 @Controller 2 public class MapperController { 3 @Autowired 4 private UserMapper userMapper; 5 6 @RequestMapping("/queryUser") 7 @ResponseBody 8 public List<User> queryUser(){ 9 List<User> users = userMapper.queryUserList(); 10 return users; 11 } 12 }
10.測試
執行引導類SpringBootMybatisApplication的main方法,然后訪問URL:http://localhost:8080/queryUser,成功獲取數據庫中數據,可對比上面數據庫表中信息。
5.2 SpringBoot整合Junit -- 在整合mybatis的工程中進行
1.添加Junit坐標依賴
1 <!--測試的起步依賴--> 2 <dependency> 3 <groupId>org.springframework.boot</groupId> 4 <artifactId>spring-boot-starter-test</artifactId> 5 <scope>test</scope> 6 </dependency>
2.編寫測試類
1 @RunWith(SpringRunner.class) 2 @SpringBootTest(classes = SpringBootMybatisApplication.class) 3 public class SpringBootMybatisApplicationTests { 4 @Autowired 5 private UserMapper userMapper; 6 @Test 7 public void test() { 8 List<User> users = userMapper.queryUserList(); 9 System.out.println(users); 10 } 11 12 }
運行測試方法,控制台打印輸出,運行成功
其中:SpringRunner繼承自SpringUnit4ClassRunner,使用哪一個Spring提供的測試測試引擎都可以
@SpringBootTest的屬性指定的是引導類的字節碼對象,貌似后面括號里面的內容不寫也是可以的:)
5.3 SpringBoot整合Spring Data JPA
這里需要創建新的工程,同樣是用SpringBoot快速生成的方式
1.添加Spring Data Jpa與數據庫驅動的坐標依賴
1 <!-- springBoot JPA的依賴 --> 2 <dependency> 3 <groupId>org.springframework.boot</groupId> 4 <artifactId>spring-boot-starter-data-jpa</artifactId> 5 </dependency> 6 7 <!-- MySQL連接驅動 --> 8 <dependency> 9 <groupId>mysql</groupId> 10 <artifactId>mysql-connector-java</artifactId> 11 </dependency>
2.添加application.properties中配置數據庫和JPA的相關屬性
1 #DB Configuration: 2 spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver 3 spring.datasource.url=jdbc:mysql://127.0.0.1:3306/springboot_mybatis?serverTimezone=UTC 4 useUnicode=true&characterEncoding=utf8 5 spring.datasource.username=root 6 spring.datasource.password=root 7 8 #JPA Configuration: 9 spring.jpa.database=MySQL 10 spring.jpa.show-sql=true 11 spring.jpa.generate-ddl=true 12 spring.jpa.hibernate.ddl-auto=update 13 spring.jpa.hibernate.naming_strategy=org.hibernate.cfg.ImprovedNamingStrategy
3.編寫實體類
1 @Entity 2 public class User { 3 // 主鍵 4 @Id 5 @GeneratedValue(strategy = GenerationType.IDENTITY) 6 private Long id; 7 // 用戶 8 private String username; 9 // 密碼 10 private String password; 11 12 //省略getter和setter方法 13 14 }
上面之所以沒有寫@Column和@Table注解就是數據庫中表名、字段名與類的類名、屬性名一樣。
4.編寫UserRepository
1 public interface UserRepository extends JpaRepository<User,Long>{ 2 }
5.編寫測試類
1 @RunWith(SpringRunner.class) 2 @SpringBootTest(classes = SpringBootJpaApplication.class) 3 public class SpringBootJpaApplicationTest { 4 @Autowired 5 private UserRepository userRepository; 6 @Test 7 public void test(){ 8 List<User> users = userRepository.findAll(); // findAll方法為JpaRepository中定義好的方法 9 System.out.println(users); 10 } 11 }
6.執行測試方法
控制台打印信息如上,到此,SpringBoot入門基礎到這里就結束啦,后面還有其他的內容的話會再來補上,例如整合redis等等,文中所有案例均已經過測試,如有失誤地方可在下方留言交流:)