Spring是JavaEE的輕量級替代品,爲JavaEE開發提供了一種相對簡單的方法,經過依賴注入和麪向切面編程,用簡單的Java對象實現了EJB的功能。 -- 說白了就是讓咱們快速的使用Spring。java
配置過於繁瑣;mysql
在環境搭建時,導入座標之間版本的不兼容問題阻礙項目的開發。web
基於約定優於配置的思想,讓開發人員沒必要在配置與邏輯業務之間進行思惟的切換,專一於邏輯業務的代碼編寫中,提升開發效率。redis
爲基於Spring的開發提供更快的入門體驗;spring
開箱即用,沒有代碼生成,也無需XML配置,同時也能夠修改默認值來知足特定的知足;sql
提供一些大型項目中的非功能性特性,如嵌入式服務器、安全、健康監測、外部配置等;數據庫
SpringBoot不是對Spring功能上的加強,而是提供了一種快速使用Spring的方式。-- Spring有的功能SpringBoot都有。apache
起步依賴:編程
起步依賴本質上是一個Maven項目的對象模型(POM),定義了對其餘庫的傳遞依賴;數組
簡單的說,起步依賴就是將具有某種功能的座標打包到一塊兒,並提供一些默認的功能;
自動配置:
SpringBoot的自動配置是一個運行時(程序啓動時)的過程,決定Spring配置須要用哪一個,不須要用哪一個,SpringBoot自動完成該過程。
-- SpringBoot在第一次加載依賴時很慢,請保持足夠的耐心:(
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>
經過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 }
在引導類的MySpringBootApplication同級包中建立QuickStartController
1 @Controller 2 public class QuickStartController { 3 @RequestMapping("/quick") 4 @ResponseBody 5 public String quick(){ 6 return "SpringBoot訪問成功"; 7 } 8 }
執行SpringBoot引導類的main方法
打開瀏覽器訪問url地址:http://localhost:8080/quick
這樣子就是訪問成功啦!!!!
@SpringBootApplication:標註SpringBoot的啓動類,該註解具有多種功能(後面詳細剖析);
SpringApplication.run(MySpringBootApplication.class) 表明運行SpringBoot的啓動類,參數爲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 }
刷新剛剛的頁面,頁面刷新成功:)
-- 須要在有網絡鏈接(依賴導入超慢):(
這時咱們會發現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進行訪問就能夠啦!!!
。。。。先掌握使用。。。。。原理後面補充。。。。能夠本身點進源碼瞭解。。。。
反正也就是maven的依賴傳遞、註解後的自動裝配等等等等。。。。
SpringBoot是基於約定的,因此不少配置都有默認值,若是想使用本身的配置來替換默認配置的話,就可使用application.properties或application.yml(yaml)進行配置。
SpringBoot默認會從Resource陌路下加載application.properties或application.yml(yaml)文件,其中.properties文件的優先級高於.yml文件,下面主要對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的官網。
咱們一般使用@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;
經過註解@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方法。
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>
-- 下面紅色部分的配置多是受我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.
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');
打開表查看信息:
1 public class User { 2 private Long id; // 主鍵id 3 private String username;// 用戶名 4 private String password;// 密碼 5 //省略getter和setter方法 6 }
1 @Mapper 2 public interface UserMapper { 3 public List<User> queryUserList(); 4 }
注:@Mapper標記該類是一個mybatis的Mapper接口,能夠被SpringBoot自動掃描到Spring的上下文中。
在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>
1 @SpringBootApplication 2 public class SpringBootMybatisApplication { 3 public static void main(String[] args) { 4 SpringApplication.run(SpringBootMybatisApplication.class, args); 5 } 6 }
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
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 }
執行引導類SpringBootMybatisApplication的main方法,而後訪問URL:http://localhost:8080/queryUser,成功獲取數據庫中數據,可對比上面數據庫表中信息。
1 <!--測試的起步依賴--> 2 <dependency> 3 <groupId>org.springframework.boot</groupId> 4 <artifactId>spring-boot-starter-test</artifactId> 5 <scope>test</scope> 6 </dependency>
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的屬性指定的是引導類的字節碼對象,貌似後面括號裏面的內容不寫也是能夠的:)
這裏須要建立新的工程,一樣是用SpringBoot快速生成的方式
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>
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
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註解就是數據庫中表名、字段名與類的類名、屬性名同樣。
1 public interface UserRepository extends JpaRepository<User,Long>{ 2 }
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 }
控制檯打印信息如上,到此,SpringBoot入門基礎到這裏就結束啦,後面還有其餘的內容的話會再來補上,例如整合redis等等,文中全部案例均已通過測試,若有失誤地方可在下方留言交流:)