三天講透SpringBoot-初識基礎使用
這次我們來說一下我們的SpringBoot,現在SpringBoot已經成為趨勢,在我這裡我用三篇文章的形式來講清楚我們的SpringBoot,大致分為,第一篇講搭建,基本使用,第二篇三方整合,自動裝配原理,第三篇,將main方法啟動原理,總結史上最全的SpringBoot註解及其含義。後面有機會再細緻的扒一下原始碼(書還沒看完,怕誤導大家)。
我們先來看我們的搭建,很簡單,我們來一個最小最簡潔的啟動方式。
三種搭建(一):
準備工作,我們是在IntelliJ IDEA的工具上來講解的,用Eclipse或者STS的都可以,大同小異,我們講三種搭建方式,以後就別某度SpringBoot的搭建了。
1.我們先來建立一個maven專案,最簡單的方式建立即可
輸入我們的GroupID和ArtifactID
點選我們的Finish,我們的第一步就完成了。
自己對比一下建立完成的目錄結構是不是一致的。
2.接下來我們匯入我們的jar依賴,修改我們的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 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.springboot_xiaocai</groupId> <artifactId>springboot_xiaocai</artifactId> <version>1.0-SNAPSHOT</version> <dependencies> <!-- 加入springboot依賴--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.7.RELEASE</version> </dependency> <!-- 加入spring mvc-web依賴--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies> <build> <plugins> <!-- 引入一個springboot外掛,可以支援我們將web應用打成jar包--> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
所有加粗字型為我後來加的,你也可以全部複製到你的pom.xml檔案下(注意專案名)。
3.加入我們的配置檔案yml,在resources目錄下建立application.yml,不建立也可以
application.yml
server: port: 8888
4.寫入我們的啟動類,MainStart.java
MainStart.java
package com.springboot_xiaocai.controller; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class MainStart { public static void main(String[] args) { SpringApplication.run(MainStart.class,args); } }
5.隨便編寫一個Controller測試類,執行main方法,走起。(貼圖帶目錄結構,自己對比一下自己的對不對)
我們的第一種簡單搭建就完成了。配置比較麻煩,不建議這樣搭建,我們來看第二種搭建方式
三種搭建(二):
1.我們還是來構建一個專案,這裡選擇Spring Initializr
2.輸入引數,點選next
3.選擇Web,勾選Spring Web,點選next(有的版本可能沒有Spring Web,那你就勾選Spring Web Starter),最上方可以設定spring boot的版本,我這裡是2.1.9。
4.隨便編寫一個測試類,啟動,看效果。
三種搭建(三):
第三種幾乎沒人用的,不是很方便,我只是帶著說一下,直接登入https://start.spring.io/ 然後設定相關引數,點選Generate就會生成我們想要的SpringBoot專案了。
上述三種方式,第二種是最好用,也是最常用的,我們只需要記住第二種就可以了。
配置檔案:
有的小夥伴看到我的前兩種搭建方式配置檔案並不一樣,一種是application.yml,另外一種是application.properties,這兩種配置檔案都是可以的,官方推薦我們使用application.yml檔案,我可以不接受他的意見,按照個人喜好來咯。
我們很多時候我們的生產環境和我們的開發環境的配置是完全不一致的,我們可以這樣來設定
application.yml
spring: profiles: active: pro --- spring: profiles: dev server: port: 1111 --- spring: profiles: pro server: port: 2222
意思就是我們啟用pro的配置,下面用三個減號來設定多文件塊。
貌似這樣的設定還不是特別好,我們再來改一下。將application.yml複製多份,分別叫application-dev.yml和application-pro.yml
application-pro.yml
server: port: 2222
這樣我們就更好的區分了,我們的配置環境,但貌似還不是很好的,我們的主配置是啟用我們的pro配置,不能每次我們開發都設定啟用我們的開發環境,然後部署的時候再改為啟用生產環境吧。我們再來改一下。
我們保持application.yml配置不動,還是啟用我們的Pro配置檔案,我們來設定一下我們的啟動引數
選擇我們的主啟動類,將我們的啟動引數-Dspring.profiles.active=dev配置進去,如果要啟用多個可以用|連線,例如-Dspring.profiles.active=dev|pro|st
這樣配置,我們再啟動的時候就管你application.yml配置的啟用什麼配置,也是不起作用的,只有在我們的編輯器內部配置的引數才是生效的。
JAR與WAR
我們都知道SpringBoot打包出來的都是jar包,我們有時候不得不弄成war包的,比如遇到使用jsp的情況。
首先我們改一下我們的pom檔案,設定成<packaging>war</packaging>
再來一下spring-boot-starter設定為provided
最後一步,改我們的啟動類,繼承SpringBootServletInitializer類,重寫configure方法。
package com.springboot_xiaocaijishu; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; @SpringBootApplication public class SpringbootXiaocaijishuApplication extends SpringBootServletInitializer { public static void main(String[] args) { SpringApplication.run(SpringbootXiaocaijishuApplication.class, args); } @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) { return builder.sources(SpringbootXiaocaijishuApplication.class); } }
打包,配置Tomcat,啟動,進入測試類,走起。
這裡帶兩個別的知識,不屬於本節的SpringBoot的。
我們嫌棄包的名字太長,不方便,我們可以在<build>標籤下設定<finalName>來指定我們的war包名。
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> <finalName>xiaocaijishu</finalName> </build>
讀取配置檔案:
有時候我們需要讀取配置檔案的資料,比如自動任務開關,還有一些靜態的引數配置,我們可以這樣來寫
假設我們要讀取application.yml的person資料。
先來改我們的pom檔案。新增依賴
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency>
編寫接收引數物件,在上面給予@ConfigurationProperties(prefix = "person")註解,prefix的值就是我們配置檔案外層節點的值。
package com.springboot_xiaocaijishu.bean; import org.springframework.boot.context.properties.ConfigurationProperties; import java.util.List; import java.util.Map; @ConfigurationProperties(prefix = "person") public class PersonBean { private String name; private int age; private Map<String, Object> address; private List<String> hobbit; 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; } public Map<String, Object> getAddress() { return address; } public void setAddress(Map<String, Object> address) { this.address = address; } public List<String> getHobbit() { return hobbit; } public void setHobbit(List<String> hobbit) { this.hobbit = hobbit; } }View Code
編寫我們的測試類
package com.springboot_xiaocaijishu.controller; import com.springboot_xiaocaijishu.bean.PersonBean; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController @EnableConfigurationProperties(PersonBean.class) public class UserController { @Autowired private PersonBean personBean; @GetMapping("getPerson") public PersonBean getPersonBean(){ return personBean; } }
測試走起,看結果。
SelectCompent:(Select過濾器)
以前我們的專案都有web.xml來配置我們的Servlet,現在沒有了,我們來看一下配置,我們先建立一個ServletConifg類
ServletConifg類
package com.springboot_xiaocaijishu.servlet; import com.springboot_xiaocaijishu.controller.ServletController; import org.springframework.boot.web.servlet.ServletRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class ServletConifg{ @Bean public ServletRegistrationBean addServlet() { ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new ServletController(),"/hello_servlet"); return servletRegistrationBean; } }
編寫一個ServletController類
package com.springboot_xiaocaijishu.controller; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public class ServletController extends HttpServlet { protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.getWriter().write("hello Servlet"); } protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doPost(req, resp); } }
這時我們啟動專案,訪問http://localhost:8080/hello_servlet就可以跳轉到我們的Servlet下,有了Servlet,我們來新增過濾器吧。新增一個CustomFilter類。
CustomFilter類
package com.springboot_xiaocaijishu.CustomFilter; import javax.servlet.*; import java.io.IOException; public class CustomFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { System.out.println("init"); } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { System.out.println("CustomFilter的doFilter方法"); filterChain.doFilter(servletRequest, servletResponse); } @Override public void destroy() { System.out.println("destroy"); } }
將我們我Filter註冊到Servlet中去,回到我們的ServletConifg類中,新增這樣的程式碼。
/** * 註冊一個filter * @return */ @Bean public FilterRegistrationBean<CustomFilter> filterFilterRegistrationBean() { FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(); filterRegistrationBean.setFilter(new CustomFilter()); filterRegistrationBean.addUrlPatterns("/*"); return filterRegistrationBean; }
攔截器:
定義一個CustomInterceptor類,實現HandlerInterceptor類。後期我會說下HandlerInterceptor類內部的原始碼。
package com.springboot_xiaocaijishu.CustomInterceptor; import org.springframework.lang.Nullable; import org.springframework.stereotype.Component; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @Component public class CustomInterceptor implements HandlerInterceptor { /** * 方法執行之前 * @param request * @param response * @param handler * @return * @throws Exception */ public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)throws Exception { System.out.println("preHandle"); return true; } /** * 呼叫目標方法之後,渲染檢視之前 * @param request * @param response * @param handler * @param modelAndView * @throws Exception */ public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception { System.out.println("postHandle"); } /** * 渲染檢視之後 * @param request * @param response * @param handler * @param ex * @throws Exception */ public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception { System.out.println("afterCompletion"); } }
新增WebConifg類,註冊我們的攔截器
package com.springboot_xiaocaijishu.servlet; import com.springboot_xiaocaijishu.CustomInterceptor.CustomInterceptor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @Configuration public class WebConifg implements WebMvcConfigurer { @Autowired private CustomInterceptor CustomInterceptor; /** * 註冊攔截器 * @param registry */ public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(CustomInterceptor).addPathPatterns("/**").excludePathPatterns("/login","/"); } }
東西實在太多了,有點弄不完了,程式碼還忘記保留了,下次我一起傳程式碼吧,下次說一下我們繼承那些三方外掛吧~!
最進弄了一個公眾號,小菜技術,歡迎大家的加入