spring boot知識大匯總(你要的springboot都在這)

spring boot知識大彙總(你要的springboot都在這)

概念

Spring的優缺點

1. 優點(AOP和IOC簡化開發)
Spring是Java企業版(Java Enterprise Edition,JEE,也稱J2EE)的輕量級代替品。無需開發重量級的Enterprise JavaBean(EJB),Spring為企業級Java開發提供了一種相對簡單的方法,通過依賴注入和麵向切面編程,用簡單的Java對象(Plain Old Java Object,POJO)實現了EJB的功能。
2. 缺點(配置繁瑣和pom.xml的座標引入麻煩)
1. 雖然Spring的組件代碼是輕量級的,但它的配置卻是重量級的。一開始,Spring用XML配置,而且是很多XML配置。Spring 2.5引入了基於註解的組件掃描,這消除了大量針對應用程序自身組件的顯式XML配置。Spring 3.0引入了基於Java的配置,這是一種類型安全的可重構配置方式,可以代替XML。
2. 所有這些配置都代表了開發時的損耗。因為在思考Spring特性配置和解決業務問題之間需要進行思維切換,所以編寫配置擠佔了編寫應用程序邏輯的時間。和所有框架一樣,Spring實用,但與此同時它要求的回報也不少。
3. 除此之外,項目的依賴管理也是一件耗時耗力的事情。在環境搭建時,需要分析要導入哪些庫的座標,而且還需要分析導入與之有依賴關係的其他庫的座標,一旦選錯了依賴的版本,隨之而來的不兼容問題就會嚴重阻礙項目的開發進度。


SpringBoot

1. springboot解決spring的缺點:
SpringBoot基於**約定優於配置**的思想,不必在配置與邏輯業務之間進行思維的切換,從而大大提高了開發的效率.
2. SpringBoot的特點:
1. 為基於Spring的開發提供更快的入門體驗
2. 開箱即用,沒有代碼生成,也無需XML配置。同時也可以修改默認值來滿足特定的需求
3. 提供了一些大型項目中常見的非功能性特性,如嵌入式服務器、安全、指標,健康檢測、外部配置等
4. SpringBoot不是對Spring功能上的增強,而是提供了一種快速使用Spring的方式
3. 核心功能
1. 起步依賴(start dependence)
起步依賴本質上是一個Maven項目對象模型(Project Object Model,POM),定義了對其他庫的傳遞依賴,這些東西加在一起即支持某項功能。
簡單的說,起步依賴就是將具備某種功能的座標打包到一起,並提供一些默認的功能。
2. 自動配置(auto configuration)
SpringBoot的自動配置是一個運行時(更準確地說,是應用程序啟動時)的過程,考慮了眾多因素,才決定Spring配置應該用哪個,不該用哪個。該過程是Spring自動完成的。


開始代碼

快速開始

1. 創建普通的maven項目,簡單的javase就好
2. 編寫pom.xml文件
1. SpringBoot要求,項目要繼承SpringBoot的起步依賴spring-boot-starter-parent

org.springframework.boot
spring-boot-starter-parent
2.0.5.RELEASE

2. SpringBoot要集成SpringMVC進行Controller的開發,所以項目要導入web的啟動依賴(以功能為單位的)


org.springframework.boot
spring-boot-starter-web


3. 編寫啟動引導類(引導類放置的位置在創建項目時指定的groupid包下)

package cn.wzlove;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
// 使用註解標註該類是SpringBoot的引導類
@SpringBootApplication
public class MySpringBootApplication {

public static void main(String[] args) {
// run方法表示運行SpringBoot的引導類,參數是SpringBoot引導類的字節碼文件
SpringApplication.run(MySpringBootApplication.class);
}

}
4. 編寫Controller進行測試
@Controller
public class QuickController {

@RequestMapping("quick")
@ResponseBody
public String quickStart(){
return "quick start";
}
}
====================================
或者使用RestController
@RestController
public class HelloController {

@RequestMapping("hello")
public String hello(){
return "hello";
}
}

SpringBoot的熱部署

1. 添加功能座標:

org.springframework.boot

spring-boot-devtools

2. idea的配置
file ---> setting,搜索compile,選中Compile,右側會出現內容,這個時候選中Build project automatically.點擊apply,點擊ok
3. 快捷鍵ctrl+alt+shift+/,選中Registry,在aompiler.automake.allow.when.app.running後面打上對勾,之後關閉就好.

idea快速創建SpringBoot項目

1. file創建工程,這個時候不要選擇maven,而是選擇Spring Initializr,點擊下一步,輸入Group和Artifact,下一步,選擇依賴,目前先選擇Web下的Web,下一步,就可以一完成創建了.

SpringBoot的原理分析:

起步原理分析

1. SpringBoot繼承的起步依賴spring-boot-starter-parent

org.springframework.boot
spring-boot-starter-parent
2.0.6.RELEASE


查看源碼可以看到默認加載resources下的以application開頭的配置文件和各種插件,並且還繼承了spring-boot-dependencies.

繼續查看spring-boot-dependencies的源碼,主要看之間的內容,也就是版本控制,裡面包含了各種依賴包的版本號,繼續看裡面的內容,版本統一管理器.

這下就可以看出來繼承的起步依賴主要是為了進行jar包的版本控制的.這樣我們在pom文件中導入依賴就不需要指定版本了.
2. web工程的起步依賴所做的事

org.springframework.boot
spring-boot-starter-web

查看源碼可以看到這個依賴內部引入了更多的依賴,比如過spring-web,spring-webmvc,json等等,傳遞依賴.

自動配置

1. 從@SpringBootApplication開始研究,自動配置就是從這開始的.查看源碼主要看: 

// SpringBootConfiguration其實就是@Configuration,指定配置文件的
@SpringBootConfiguration
// 自動配置
@EnableAutoConfiguration
// 根據約定大於配置,所以默認的掃描包是啟動類下及其子包下的所有Bean
@ComponentScan(excludeFilters = {
@Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
2. @EnableAutoConfiguration代表是否可以自動配置 ,查看源碼主要看@Import(AutoConfigurationImportSelector.class),查看AutoConfigurationImportSelector類下的selectImports方法,看List configurations = getCandidateConfigurations(annotationMetadata,attributes);其實應該就是全包名的集合,點進去看看,會讓去查找META-INF/spring.factories下的這個文件,這個文件在當前類所在的包下,打開看看就是各種全類名.可以繼續向下研究,查看各種AutoConfiguration類的源碼

創建配置文件修改端口號和web應用的名稱

resources下創建application.properties,內容為:
# 設置啟動端口號為8081
server.port=8081
# 當前web的應用名稱
server.servlet.context-path=/springboot

SpringBoot的配置文件:

配置文件類型和作用:

1. 覆蓋默認配置: SpringBoot是基於約定的,所以很多配置都有默認值,但如果想替換默認配置的話,就可以使用application.properties或者application.yml(application.yaml)進行配置。
2. 配置額外信息,比如數據源等等
3. 配置文件放在resources目錄下.默認加載application.properties或application.yml(application.yaml)文件
4. application.properties文件是鍵值對類型的文件.yml文件類似於json.

yml文件

1. YML文件格式是YAML (YAML Aint Markup Language)編寫的文件格式,YAML是一種直觀的能夠被電腦識別的的數據數據序列化格式,並且容易被人類閱讀,容易和腳本語言交互的,可以被支持YAML庫的不同的編程語言程序導入,比如: C/C++, Ruby, Python, Java, Perl, C#, PHP等。YML文件是以數據為核心的,比傳統的xml方式更加簡潔。
2. YML文件的擴展名可以使用.yml或者.yaml。(SpringBoot是有默認加載順序的,源碼可以看到,先加載yml的,後加載yaml的,最後加載properties,後面的會覆蓋前面的).
3. 語法形式:
1. 配置普通數據
name: wangzhi =====> 冒號後面有空格
2. 配置對象數據(person對象為例),兩種,推薦第一種
person:
name: zhangsan
age: 18
addr: beijing

=============================
person: {name: zhangsan,age: 18,addr: beijing}
3. 配置數組
普通數組:
city:
- beijing
- tianjin
- chongqing
- shanghai
=============================
city: [beijing,tianjin,chongqing,shanghai]
對象集合:
student:
- name: tom
age: 18
addr: beijing
- name: lucy
age: 17
addr: yuncheng
============================
student: [{name: zhangsan,age: 18,addr: beijing},{name: tom,age: 18,addr: beijing}]
4. map配置:
map:
key1: value1
key2: value2
4. 測試注入:
application.yml的內容為:
name: wangzhi
person:
name: lucy
age: 24
addr: 運城
代碼內的注入(使用@Value註解):
@Value("${name}")
private String name;
@Value("${person.addr}")
private String addr;
@Value("${person.age}")
private int age;
代碼內的注入方式2:
通過註解@ConfigurationProperties(prefix="配置文件中的key的前綴")可以將配置文件中的配置自動與實體進行映射,需要提供get和set方法
2. 執行器的配置(編寫yml的文件的時候有代碼提示,不配置也可以完成功能)



org.springframework.boot
spring-boot-configuration-processor
true


SpringBoot與其他技術的整合

與Mybatis的整合

1. 添加Mybatis的起步依賴


org.mybatis.spring.boot
mybatis-spring-boot-starter
1.3.2

2. 添加數據庫驅動座標

mysql

mysql-connector-java

3. 添加數據庫的連接信息(在resources下的application.properties添加內容):
# 數據庫的連接信息
spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=nrblwbb7
4. 創建數據庫和表結構:
CREATE DATABASE test;
USER test;
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`username` VARCHAR(50) DEFAULT NULL,
`password` VARCHAR(50) DEFAULT NULL,
`name` VARCHAR(50) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=INNODB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8;
INSERT INTO `user` VALUES ('1', 'zhangsan', '123', '張三');
INSERT INTO `user` VALUES ('2', 'lisi', '123', '李四');
SELECT * FROM USER;
5. 創建實體類
public class User {
// 主鍵
private Long id;
// 用戶名
private String username;
// 密碼
private String password;
// 姓名
private String name;

//此處省略getter和setter方法 .. ..
}
6. 創建mapper接口
public interface UserMapper {
List queryUserList();
}

7. 創建映射配置文件(在resources下新建mapper文件夾,在下面創建UserMapper.xml)

br> "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >



8. 配置文件配置mybatis的信息:
#spring集成Mybatis環境
#pojo別名掃描包
mybatis.type-aliases-package=cn.wzlove.domain
#加載Mybatis映射文件
mybatis.mapper-locations=classpath:mapper/*Mapper.xml
9. 寫個Controller進行代碼測試
@RestController
public class Controller {

@Autowired
private UserMapper userMapper;

@RequestMapping("mybatis")
public String testMyBatis(){
List users = userMapper.queryUserList();
System.out.println(users);
return "success";

}
}

與Junit的整合

1. 添加SpringBoot集成Junit測試的起步依賴(如果使用idea創建的話會直接引入,不需要重複導入) 


org.springframework.boot
spring-boot-starter-test
test

2. 編寫測試類:
// SpringRunner繼承自SpringJUnit4ClassRunner,使用哪一個Spring提供的測試測試引擎都可以
@RunWith(SpringRunner.class)
// classes後面的字節碼是啟動類的字節碼
@SpringBootTest(classes = SpringbootMybatisApplication.class)
public class UserMapperTest {

@Autowired
private UserMapper userMapper;

@Test
public void testMyBatis(){
List users = userMapper.queryUserList();
System.out.println(users);
}
}

與SpringDataJPA的整合

1. 添加Spring Data JPA的起步依賴

org.springframework.boot
spring-boot-starter-data-jpa


2. 添加mysql連接驅動依賴

mysql
mysql-connector-java

3. 在application.properties中配置數據庫和jpa的相關屬性
# 配置數據庫的連接信息
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql:////127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=nrblwbb7

# 配置Spring Data JPA的相關信息
spring.jpa.database=mysql
spring.jpa.show-sql=true
spring.jpa.generate-ddl=true
spring.jpa.hibernate.ddl-auto=update
4. 創建實體並使用springdatajpa進行配置
@Entity
public class User {
// 主鍵(mysql主鍵自增)
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
// 用戶名
private String username;
// 密碼
private String password;
// 姓名
private String name;

//此處省略setter和getter方法... ...
}
5. 創建repository接口(也就是dao)

/**
* @ClassName UserRepository
* @Author wz157
* @Date 2018/10/19 23:18
* @Description TODO
* 兩個泛型,第一個是實體,第二個是主鍵類型
*/
public interface UserRepository extends JpaRepository {

List findAll();
}
6. 創建測試類進行測試
@RunWith(SpringRunner.class)
@SpringBootTest(classes = SpringbootSpringdatajpaApplication.class)
public class JpaTest {

@Autowired
private UserRepository userRepository;

@Test
public void testJps(){
List all = userRepository.findAll();
System.out.println(all);
}
}
7. 如果是jdk9可能報錯,需要額外引入依賴

javax.xml.bind
jaxb-api
2.3.0


與Redis的整合

1. 配置redis的起步依賴:


org.springframework.boot
spring-boot-starter-data-redis

2. 配置redis的連接信息(本地需要安裝有Redis)
#Redis
spring.redis.host=127.0.0.1
spring.redis.port=6379
3. 編寫測試類:
@RunWith(SpringRunner.class)
@SpringBootTest(classes = SpringbootSpringdatajpaApplication.class)
public class RedisTest {

// 轉化成json各執字符串
@Autowired
private RedisTemplate redisTemplate;

@Autowired
private UserRepository userRepository;

@Test
public void testRedis() throws JsonProcessingException {
// 1. 從redis中獲取數據,習慣json字符串
String userListJson = redisTemplate.boundValueOps("user.findAll").get();
// 2. 判斷redis是否存在數據
if(null == userListJson){
// 3. 如果不存在數據,從數據庫查詢

List all = userRepository.findAll();
// 將查詢出的數據存儲到緩存中
// 先將集合轉換成json格式的字符串, 使用jackson進行轉換
ObjectMapper objectMapper = new ObjectMapper();
userListJson = objectMapper.writeValueAsString(all);
redisTemplate.boundValueOps("user.findAll").set(userListJson);
System.out.println("=============從數據庫中查詢=============");
} else{
System.out.println("從緩存中查詢");
}
// 4. 如果存在,將結果返回(測試直接打印就好)
System.out.println(userListJson);
}

}


分享到:


相關文章: