1. 程式人生 > 實用技巧 >SpringBoot簡介

SpringBoot簡介

springboot


Springboot

新的框架,基於spring框架的工具框架.boot可以將spring容器和依賴的環境獨立執行

特點

實現容器的獨立執行

可以以jar包形式啟動一個具備spring容器的所有特點的工程

通過main方法執行啟動一個spring容器

內嵌了servlet容器

預設內嵌式tomcat,可以根據依賴替換成jetty,undertow

提供了簡化依賴

例如:開發一個web應用 spring-web,spring-webmvc,jackson-core等

springboot提供spring-boot-starter-web的簡化依賴

核心特性(自動配置)

是由於低層經過了大量程式碼編寫,擴充套件了自動配置的邏輯,會根據使用場景建立記憶體物件

手動搭建一個springboot

pom檔案修改 pom.xml

新增繼承springboot-parent工程

開發web應用,新增開發web應用依賴starter-web

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>
1.5.2.RELEASE</version> </parent> ​ ​ <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency>
--> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> </dependencies>

src/main/java

com.wiscom.controller
package com.wiscom.controller;
​
@RestController
public class HelloController {
    @Autowired
    private HelloService helloService;
    
    @RequestMapping("hello")
    public String sayHi(String name){
        return "controller:"+helloService.sayHi(name);
    }
}
com.wiscom.service
package com.wiscom.service;
​
@Service
public class HelloService {
    public String sayHi(String name) {
        return "service"+"hello springboot "+name;
    }
}
com.wiscom
package com.wiscom;
​
//springboot的核心註解
@SpringBootApplication
public class StarterDemo01 {
    //當前springboot中唯一的一個入口方法main
    public static void main(String[] args) {
        //SpringBoot體工程啟動物件
        SpringApplication.run(StarterDemo01.class, args);
    }
}

springboot配置

application.properties

springboot的全域性配置,

絕大多數應用場景使用的屬性都可以在這個配置檔案中配置讀取

實現埠修改

訪問路徑的修改

src/main/resourses

application.properties

properties檔案可以用yaml格式書寫

這是全域性配置

server.port=8090
server.context-path=/1905
​
#spring.datasource.driverClassName=com.jdbc.mysql.Driver
#datasource
#mybatis
#redis
#rabbitmq
#elasticsearch

自動配置原理

springboot自動配置利用的註解

@Configuration 定義配置類

@bean 配置bean物件

@ConfigurationProperties 讀取物件需要的屬性

java語言

javaconfig:將xml語言解析成記憶體物件,相當於DOM/SAX解析器

jdk1.5出現,spring利用javaconfig特性,將xml檔案轉化為註解

@Configuration:表示一個完整的xml檔案

@ComponentScan:表示xml中<context:compoment-scan>

@Bean:表示一個xml檔案中的<bean>標籤

.......

spring 需要掌握的標籤

@configuration

@Bean

@ConfigurationProperties

@conditionalOnClass

.....

將xml檔案轉化為註解的形式

src/main/java

com.wiscom
StartDemo.java
package com.wiscom;
​
//springboot的核心註解
@SpringBootApplication
public class StartDemo {
    
    // springboot中唯一的一個入口方法main
    public static void main(String[] args) {
        SpringApplication.run(StartDemo.class, args);
    }
}
com.wiscom.pojo
MyBean.java
package com.wiscom.pojo;
​
// 需要生成bean標籤物件
public class Mybean {
    private int age;
    private String name;
   
    public Mybean() {
        System.out.println("Mybean被建立成功");
    }
    
}
com.wiscom.config
MyBeanConfig.java
package com.wiscom.config;
​
// 配置類的註解,相當於一個獨立的xml檔案載入的內容
@Configuration
public class MybeanConfig {
    // 相當於  <bean id="initMybean" class="com.wiscom.pojo.Mybean">
    @Bean   
    public Mybean initMybean(){
        return new Mybean();
    }
}
​
com.wiscom.controller
HelloController.java
package com.wiscom.controller;

@RestController
public class HelloController {
    @Autowired
    private HelloService helloService;
    
    // 引用bean,檢視是否被建立成功
    @Autowired
    private Mybean mybean;
    
    @RequestMapping("hello")
    public String sayHi(String name){
        return "controller:"+helloService.sayHi(name);
    }
}

@ConfigurationProperties的使用

可以讀取配置中的值:properties/yml

可以定義字首,自動賦值給類中的同名屬性

src/main/resources

application.properties
springboot.conf.test.url=1
springboot.conf.test.username=1
springboot.conf.test.password=1
springboot.conf.test.driver=1

src/main/java

com.wiscom.pojo
Yourbean.java
package com.wiscom.pojo;

public class Yourbean {
    private String url;
    private String driver;
    private String username;
    private String password;
    
    public Yourbean(){
        System.out.println("YourBean已被建立");
    }
}

com.wiscom.config
YourBeanConfig.java

其中的屬性值要從配置中讀取

package com.wiscom.config;

@Configuration
// 配置檔案中的值要以 springboot.conf.test 為字首
@ConfigurationProperties("springboot.conf.test")
public class YourBeanConfig {
    
    private String url;            //    springboot.conf.test.url
    private String username;    //    springboot.conf.test.username
    private String password;    //    springboot.conf.test.password
    private String driver;        //    springboot.conf.test.driver

    @Bean
    public YourBean initYourBean(){
        // 
        YourBean yb=new YourBean();
        // 建立一個YourBean物件,給其中的屬性賦值
        yb.setUsername(username);
        yb.setPassword(password);
        yb.setDriver(driver);
        yb.setUrl(url);
        return yb;
    }
    
}

自動裝配的核心註解

@ConditionalOnClass:當前環境可以掃描到類時,滿足條件

@ConditionalOnBean:當前環境存在這個Bean物件時,滿足條件

@ConditionalOnMissingClass:當環境沒有class時,滿足

@ConditionalOnMissingBean:當環境滅有bean時,滿足

@ConditionalOnProperties:當環境具備什麼properties屬性值時,滿足條件

舉例

@ConditionalOnClass

src/main/java

com.wiscom.condition
ConditionalTestbean.java
package com.wiscom.condition;

public class ConditionalTestbean {
    private int age;
    private String name;
    
    public ConditionalTestbean() {
        System.out.println("ConditionalTestbean物件已被建立");
    }
}

com.wiscom.config
ConditionalConfig.java
package com.wiscom.config;

@Configuration
// 只有ConditionalTestbean類被載入後,才會載入這個類
// 如果沒有這個類,會報錯,但不影響執行
@ConditionalOnClass({ConditionalTestbean.class})
public class ConditionalConfig {
    @Bean
    public ConditionalTestbean iniMybean(){
        
        return new ConditionalTestbean();
    }
}

springboot的核心註解:@SpringBootApplication

@SpringBootApplication

是一個組合註解

組合註解

@SpringBootConfiguration:標識了一個配置類

效果等同於@Configuration

@EnableAutoConfiguration:自動轉配實現註解

可以實現讀取所有springboot擴充套件配置類的全路徑名稱

@ComponentScan:掃描

預設情況是根據註解所在的類的包名實現掃描範圍的

@EnableAutoConfiguration

Import匯入了一個開啟自動配置匯入選擇器的物件

@Import(EnableAutoConfigurationImportSelector.class)

EnableAutoConfigurationImportSelector的父類

AutoConfigurationImportSelector中的getCandidateConfigurations方法獲取了候選的配置類

方法中通過SpringFactoriesLoader可以載入所有自動配置中的檔案spring.factory

spring.factory

位於Maven Dependencies包下 ----> spring-boot-autoconfigure---> META-INF(元資料) ----> spring.factories

run方法啟動spring容器的過程

run呼叫

通過啟動類反射物件,收集工程各種環境資訊

收集spring啟動前的各種初始化資訊

利用收集的環境資訊開始建立容器中各種物件

bean物件,configuratoin factory(載入配置檔案)

收尾工作

將啟動建立過程中的工具銷燬

springboot自動配置原理

啟動順序

run方法啟動

初始化收集環境資訊,通過反射物件獲取核心註解@SpringBootApplication

根據初始化資訊,建立spring容器中各種物件

將中間物件銷燬,保留spring容器清潔,啟動結束

自動配置

springboot擴充套件了一大批需要自動配置類

每一個配置類的結構需要使用到spring的註解功能

@Configuration

標識一個配置類,相當於載入一個xml檔案

@ConfigurationProperties

物件建立初始化,從配置檔案中讀取屬性

@Conditional

衍生註解,指定載入配置類建立bean物件的詳細條件

只有滿足條件才會建立相應內容

@ConditionalOnClass

@ConditionalOnBean

@ConditionalOnMissingClass

@ConditionalOnMissingBean

@ConditionalOnProperties