一、Spring Boot介紹
Spring Boot可以很容易的建立可直接執行的獨立的基於Spring的應用程式。
功能特點:
- 建立獨立的Spring應用程式;
- 直接嵌入Tomcat、Jetty等Web容器(不需要部署WAR檔案);
- 提供一些“starter(啟動器)”依賴關係來簡化構建配置;
- 自動配置Spring和第三方庫;
- 提供可用於生產的功能,如執行狀況檢查和外部化配置等;
- 無程式碼生成和XML配置要求;
二、Spring Boot快速開始
1、建立一個maven工程
2、匯入Spring Boot相關的jar包
<!--父工程依賴--> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.6.RELEASE</version> <relativePath/> </parent> <dependencies> <!-- web --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies> <build> <finalName>spring-boot-web</finalName> <plugins> <!--打包fat jar,引入該外掛,可以幫助我們將web應用程式打成可執行jar包--> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>
3、編寫啟動程式
/** * @desc: spring boot 啟動類 * @author: toby * @date: 2019/7/17 23:03 */ @SpringBootApplication public class WebApplication { public static void main(String[] args) { SpringApplication.run(WebApplication.class, args); } }
4、自己寫的@Controller @Service等註解標示的元件,必須放在啟動類(WebApplication)所在的包及其子包下
5、執行程式
java -jar spring-boot-web.jar
三、Spring Boot初探
為什麼只引入spring-boot-starter-parent和spring-boot-starter-web就可以快速開發web mvc應用?
1、pom.xml分析
spring-boot-web的pom.xml如下:
進去如下spring-boot-starter-parent的pom.xml:
進去如下spring-boot-dependencies的pom.xml:
spring-boot-dependencies其實相當於一個對spring-boot所依賴jar包進行版本管理,所有我們匯入依賴預設是不需要寫版本的!
2、spring-boot-starter-web為我專案中匯入web開發需要的jar包依賴
四、Spring Boot擴充套件Spring Mvc配置
1、新增攔截器
第一步:建立一個攔截器
/** * @desc: 建立一個攔截器 * @author: toby */ @Slf4j public class TobyInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { log.info("TobyInterceptor的preHandle方法"); return false; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { log.info("TobyInterceptor的postHandle方法"); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { log.info("TobyInterceptor的afterCompletion方法"); } }
第二步:註冊攔截器
/** * @desc: WebMvc配置 * @author: toby */ @Configuration public class TobyWebMvcConfig implements WebMvcConfigurer { /** * 註冊攔截器 * @param registry */ @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new TobyInterceptor()).addPathPatterns("/**"); } }
2、增加過濾器
第一步:建立一個過濾器
/** * @desc: 建立一個過濾器 * @author: toby */ @Slf4j
@Component public class TobyFilter implements Filter { @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { log.info("TobyFilter的doFilter方法"); filterChain.doFilter(servletRequest,servletResponse); } }
第二步:註冊過濾器
/** * @desc: WebMvc配置 * @author: toby */ @Configuration public class TobyWebMvcConfig implements WebMvcConfigurer { @Bean public FilterRegistrationBean<TobyFilter> filterFilterRegistrationBean(TobyFilter tobyFilter){ FilterRegistrationBean<TobyFilter> filterFilterRegistrationBean = new FilterRegistrationBean<>(); List<String> uriList = new ArrayList<>(1); uriList.add("/**"); filterFilterRegistrationBean.setFilter(tobyFilter); filterFilterRegistrationBean.setEnabled(true); filterFilterRegistrationBean.setUrlPatterns(uriList); filterFilterRegistrationBean.setName("tobyFilter"); filterFilterRegistrationBean.setOrder(1); return filterFilterRegistrationBean; } }
3、新增Servlet
第一步:建立一個Servlet
/** * @desc: 建立一個Servlet * @author: toby */ @Slf4j @Component public class TobyServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doPost(req, resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.getWriter().write("TobyServlet的doPost方法"); } }
第二步:註冊Servlet
/** * @desc: WebMvc配置 * @author: toby */ @Configuration public class TobyWebMvcConfig implements WebMvcConfigurer { /** * 註冊Servlet * @param tobyFilter * @return */ @Bean public ServletRegistrationBean servletRegistrationBean(TobyFilter tobyFilter){ return new ServletRegistrationBean(new TobyServlet(), "/servlet"); } }
執行結果如下:
4、如何接管Spring Boot的Mvc配置
使用@EnableWebMvc註解(不推薦使用)
@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) @Documented
//匯入了DelegatingWebMvcConfiguration的元件 @Import(DelegatingWebMvcConfiguration.class) public @interface EnableWebMvc { }
① DelegatingWebMvcConfiguration的繼承圖
② 再看下WebMvc的自動配置類WebMvcAutoConfiguration
@Configuration @ConditionalOnWebApplication(type = Type.SERVLET) @ConditionalOnClass({ Servlet.class, DispatcherServlet.class, WebMvcConfigurer.class })
//容器中沒有WebMvcConfigurationSupport該配置檔案才生生效,但是我們使用了@EnableWebMvc匯入了WebMvcConfiurationSupport,它只保證了Spring Mvc的最基本的功能 @ConditionalOnMissingBean(WebMvcConfigurationSupport.class) @AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE + 10) @AutoConfigureAfter({ DispatcherServletAutoConfiguration.class, TaskExecutionAutoConfiguration.class, ValidationAutoConfiguration.class }) public class WebMvcAutoConfiguration {
五、總結
本文主要介紹了Spring Boot的功能特性,如何快速開始一個Spring Boot專案,以及如何擴充套件Spring Mvc配置,比如如何新增自己的攔截器,過濾器,和Servlet。Spring Boot是微服務的開發利器,所以要對微服務元件有深入瞭解,Spring Boot的自動裝配元件是必備技能。