文章目錄
一、Spring Boot介紹
Spring Boot是爲了簡化Spring應用的創建、運行、調試、部署等而出現的,使用它可以做到專注於Spring應用的開發,而無需過多關注XML的配置。是一個能讓你在5分鐘內創建一個產品級的spring應用的開發框架。
簡單來說,它提供了一堆依賴打包,並已經按照使用習慣解決了依賴問題—習慣大於約定。
Spring Boot默認使用tomcat作爲服務器,使用logback提供日誌記錄。
Spring Boot提供了一系列的依賴包,所以需要構建工具的支持:maven 或 gradle。
二、創建springboot應用的三種方法
1、通過start.spring.io
輸入信息之後點擊 Generate Project,就能把項目下載下來,之後解壓導入到eclipse即可。
2、通過IDE(IDEA、STS)快速創建
安裝STS插件
首先如果eclipse沒有STS插件要先安裝STS插件:
點擊Help -> Eclipse Marketplace
搜索STS
點擊Install安裝
創建springboot項目
new創建項目,在spring Boot下選擇Spring Starter Project
點擊next,輸入項目相關信息
繼續點擊next,找到要在pom.xml引入的相關包
finish完成創建
3、完全手動創建
新建普通Java maven工廠
新建maven project,然後點next
選擇maven-archetype-quickstart,點擊next,然後就是填項目信息
Group Id:是公司名,Artifact Id:項目名,package:包名。
引入maven依賴
<?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>
<!-- Springboot父工程依賴 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.3.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.lgy</groupId>
<artifactId>lgyProject</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>lgyProject</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web-services</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.0.0</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<finalName>lgyProject</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
編寫啓動類
package com.lgy.test;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Lgypplication {
public static void main(String[] args) {
SpringApplication.run(Lgypplication.class, args);
}
}
三、Springboot註解
1、@SpringBootApplication:包含了@ComponentScan、@Configuration和@EnableAutoConfiguration註解。其中
@ComponentScan讓spring Boot掃描到Configuration類並把它加入到程序上下文。
@Configuration 等同於spring的XML配置文件;使用Java代碼可以檢查類型安全。
@EnableAutoConfiguration 自動配置。
@ComponentScan 組件掃描,可自動發現和裝配一些Bean。
@Component可配合CommandLineRunner使用,在程序啓動後執行一些基礎任務。
補充:
bean掃描的basePackage默認爲啓動類所在包
2、@RestController註解是@Controller和@ResponseBody的合集,表示這是個控制器bean,並且是將函數的返回值直 接填入HTTP響應體中,是REST風格的控制器。在返回值類型前加上@ResponseBody表示返回結果是json的格式,不會是頁面。
3、@EnableAutoConfiguration:Spring Boot自動配置(auto-configuration):嘗試根據你添加的jar依賴自動配置你的Spring應用。例如,如果你的classpath下存在HSQLDB,並且你沒有手動配置任何數據庫連接beans,那麼我們將自動配置一個內存型(in-memory)數據庫”。你可以將@EnableAutoConfiguration或者@SpringBootApplication註解添加到一個@Configuration類上來選擇自動配置。如果發現應用了你不想要的特定自動配置類,你可以使用@EnableAutoConfiguration註解的排除屬性來禁用它們。
這個註釋告訴SpringBoot“猜”你將如何想配置Spring,基於你已經添加jar依賴項。如果spring-boot-starter-web已經添加Tomcat和Spring MVC,這個註釋自動將假設您正在開發一個web應用程序並添加相應的spring設置。
自動配置被設計用來和“Starters”一起更好的工作,但這兩個概念並不直接相關。您可以自由挑選starter依賴項以外的jar包,springboot仍將盡力自動配置您的應用程序。
4、@Bean:相當於XML中的bean,放在方法的上面,而不是類,意思是產生一個bean,並交給spring管理。
5、@RequestMapping:@RequestMapping(value = {"/", “/index”})value值爲“/”表示根目錄,“/index”表示訪問路徑後面爲index,方法如果直接返回字符串,框架默認會去 spring.view.prefix 目錄下的 (index拼接spring.view.suffix)頁面;如果返回類型爲ModelAndView,則是返回頁面,頁面由返回的ModelAndView對象確定。
@RequestMapping(value = {"/", "/index"})
public String index(Map<String, Object> model) {
// 直接返回字符串,框架默認會去 spring.view.prefix 目錄下的 (index拼接spring.view.suffix)頁面
// 本例爲 /WEB-INF/jsp/index.jsp
model.put("time", new Date());
model.put("message", this.hello);
return "index";
}
@RequestMapping("/page")
public ModelAndView page() {
ModelAndView model = new ModelAndView();
model.setViewName("index");
model.addObject("time", new Date());
model.addObject("message", this.hello);
return model;
}
6、其他
@Autowired自動導入。
@PathVariable獲取參數。
@JsonBackReference解決嵌套外鏈問題。
@RepositoryRestResourcepublic配合spring-boot-starter-data-rest使用。
四、Springboot支持jsp
1、配置application.properties
# 頁面默認前綴目錄
spring.mvc.view.prefix=/WEB-INF/jsp/
# 響應頁面默認後綴
spring.mvc.view.suffix=.jsp
2、加入依賴
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
</dependency>
3、使用方法結合@RequestMapping的用法。
五、Springboot支持freemarker
1、配置application.properties
spring.freemarker.allow-request-override=false
spring.freemarker.cache=true
spring.freemarker.check-template-location=true
spring.freemarker.charset=UTF-8
spring.freemarker.content-type=text/html
spring.freemarker.expose-request-attributes=false
spring.freemarker.expose-session-attributes=false
spring.freemarker.expose-spring-macro-helpers=false
2、加入依賴
<!-- 引入freeMarker的依賴包. -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
control代碼:
@RequestMapping("/freemarker")
public String freemarker(Map<String, Object> map) {
map.put("name", "[Angel -- 守護天使]");
map.put("gender", 1);//gender:性別,1:男;0:女;
List<Map<String, Object>> friends = new ArrayList<Map<String, Object>>();
Map<String, Object> friend = new HashMap<String, Object>();
friend.put("name", "jack");
friend.put("age", 30);
friends.add(friend);
friend = new HashMap<String, Object>();
friend.put("name", "jeff");
friend.put("age", 36);
friends.add(friend);
map.put("friends", friends);
return "freemarker";
}
freemarker.ftl
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org"
xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity3">
<head>
<title>Hello World!</title>
</head>
<body>
<p>
welcome ${name} to freemarker!
</p>
<p>性別:
<#if gender==0>
女
<#elseif gender==1>
男
<#else>
保密
</#if>
</p>
<h4>我的好友:</h4>
<#list friends as item>
姓名:${item.name} , 年齡${item.age}
<br>
</#list>
</body>
</html>
六、Springboot Servlet註冊
Springboot中有兩種方式可以添加 Servlet、Filter、Listener
1、代碼註冊通過ServletRegistrationBean、 FilterRegistrationBean 和 ServletListenerRegistrationBean 獲得控制,並且要在方法前加上@Bean註解。
SpringBoot啓動類上添加代碼:
@Bean
public ServletRegistrationBean servletRegistrationBean() {
return new ServletRegistrationBean(new JackServlet(), "/xs/*");}
單請求url爲xs時,就會調用JackServlet。
對應的JackServlet代碼:
package com.dongnao.jack.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class JackServlet extends HttpServlet {
private static final long serialVersionUID = -8685285401859800066L;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// TODO Auto-generated method stub
this.doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// TODO Auto-generated method stub
System.out.println("this is jackServlet doposet method");
PrintWriter pw = resp.getWriter();
pw.write("hello springboot servlet register by JackServlet");
pw.flush();
pw.close();
}
@Override
public void init() throws ServletException {
// TODO Auto-generated method stub
super.init();
}
}
2、在 SpringBootApplication 上使用@ServletComponentScan 註解後,Servlet、Filter、Listener 可以直接通過 @WebServlet、@WebFilter、@WebListener 註解自動註冊,無需其他代碼。
SpringBoot啓動類上添加註解:
//掃描工程中的Servlet、Filter、Listener
@ServletComponentScan(basePackages = {"com.dongnao.jack"})
servlet類添加@WebFilter(要加上urlPatterns訪問路徑)就可以訪問了,相應的servlet類:
package com.dongnao.jack.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* @Description 帶 @WebServlet註解的Servlet註冊需要@ServletComponentScan註解的掃描
* @ClassName JeffServlet
* @Date 2017年8月28日 下午2:17:01
* @Author 動腦學院-jack
*/
@WebServlet(urlPatterns = "/jeff/*")
public class JeffServlet extends HttpServlet {
private static final long serialVersionUID = -8685285401859800067L;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// TODO Auto-generated method stub
this.doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
System.out.println("this is JeffServlet doposet method");
PrintWriter pw = resp.getWriter();
pw.write("hello springboot servlet register by JeffServlet");
pw.flush();
pw.close();
}
@Override
public void init() throws ServletException {
// TODO Auto-generated method stub
super.init();
}
}
七、攔截器
Springboot 攔截器
1、創建我們自己的攔截器類並實現 HandlerInterceptor 接口。其中preHandle方法返回true就是放行,false就是攔截。
package com.dongnao.jack.interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
public class JackInterceptor implements HandlerInterceptor {
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
System.out.println(this.getClass().getName() + "<------>preHandle");
return true;//返回true就是放行,false就是攔截
}
public void postHandle(HttpServletRequest request,
HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
System.out.println(this.getClass().getName() + "<------>postHandle");
}
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex)
throws Exception {
System.out.println(this.getClass().getName()
+ "<------>afterCompletion");
}
}
2、創建一個Java類繼承WebMvcConfigurerAdapter,並重寫 addInterceptors 方法,並且需要添加@Configuration註解,讓啓動器找能夠找到。
3、實例化我們自定義的攔截器,然後將對像手動添加到攔截器鏈中(在addInterceptors方法中添加)。
package com.dongnao.jack.config;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import com.dongnao.jack.interceptor.JackInterceptor;
import com.dongnao.jack.interceptor.JeffInterceptor;
@Configuration
public class SpringInterceptorRegister extends WebMvcConfigurerAdapter {
private static final Logger logger = LoggerFactory.getLogger(SpringInterceptorRegister.class);
/*
* 添加spring中的攔截器
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new JackInterceptor()).addPathPatterns("/**");//添加攔截路徑
registry.addInterceptor(new JeffInterceptor())
.addPathPatterns("/freemarker/**");
super.addInterceptors(registry);
}
}
自定義攔截器
package com.dongnao.jack.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
/**
* @Description 自定義的Serlvlet過濾器
* @ClassName JackFilter
* @Date 2017年8月28日 下午2:29:50
* @Author 動腦學院-jack
*/
@WebFilter(filterName = "jackFilter", urlPatterns = "/*")
public class JackFilter implements Filter {
public void init(FilterConfig filterConfig) throws ServletException {
// TODO Auto-generated method stub
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest)request;
System.out.println(req.getRequestURL() + "------>doFilter");
chain.doFilter(request, response);
}
public void destroy() {
// TODO Auto-generated method stub
}
}
八、Springboot 靜態資源處理
1、Spring Boot 的默認資源映射
其中默認配置的 /映射到 /static (或/public、/resources、/META-INF/resources)
其中默認配置的 /webjars/ 映射到 classpath:/META-INF/resources/webjars/ 上面的 static、public、resources 等目錄都在 classpath: 下面(如 src/main/resources/static)。
2、自定義資源映射
繼承 WebMvcConfigurerAdapter 並重寫方法 addResourceHandlers
registry.addResourceHandler("/image/").addResourceLocations(“file:H:/image/”);
registry.addResourceHandler(“/image1/”).addResourceLocations(“classpath:/img1/”)
package com.dongnao.jack.config;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import com.dongnao.jack.interceptor.JackInterceptor;
import com.dongnao.jack.interceptor.JeffInterceptor;
@Configuration
public class SpringInterceptorRegister extends WebMvcConfigurerAdapter {
private static final Logger logger = LoggerFactory.getLogger(SpringInterceptorRegister.class);
/*
* 註冊靜態文件的自定義映射路徑
*/
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
//image/** 這個是url請求路徑
//classpath:/image/ 去這個路徑下尋找靜態文件
registry.addResourceHandler("/image/**")
.addResourceLocations("classpath:/image/");
registry.addResourceHandler("/picture/**")
.addResourceLocations("file:D:/picture/");
super.addResourceHandlers(registry);
}
}
3、通過配置文件映射
使用 spring.mvc.static-path-pattern 可以重新定義pattern,如修改爲 /image/**
使用 spring.resources.static-locations 可以重新定義 pattern 所指向的路徑,支持 classpath: 和 file: 注意 spring.mvc.static-path-pattern 只可以定義一個,目前不支持多個逗號分割的方式。
默認值爲 spring.mvc.static-path-pattern= /image/**
默認值爲 classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/
spring.resources.static-locations=classpath:/image/
九、Springboot 啓動加載數據
實際應用中,我們會有在項目服務啓動的時候就去加載一些數據或做一些事情這樣的需求。爲了解決這樣的問題,spring Boot 爲我們提供了一個方法,通過實現接口 CommandLineRunner或者ApplicationRunner 來實現,兩個接口是一樣的,沒有區別。
package com.dongnao.jack.runner;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.CommandLineRunner;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
/**
* @Description 啓動加載數據
* @ClassName StartUp1
* @Date 2017年8月28日 下午4:01:38
* @Author 動腦學院-jack
*/
@Component
@Order(value = 1)//value值越小越先加載
public class StartUp1 implements CommandLineRunner {
private static final Logger logger = LoggerFactory.getLogger(StartUp1.class);
public void run(String... args) throws Exception {
// System.out.println(this.getClass().getName() + "啓動加載數據" + args);
logger.info(this.getClass().getName() + "啓動加載數據" + args);
}
}
十、Springboot JDBC
1、屬性配置文件(application.properties)
spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
2、pom.xml 配置maven依賴
<!-- MYSQL -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- Spring Boot JDBC -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId> </dependency>
實例代碼:
package com.dongnao.jack.service;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Service;
import com.dongnao.jack.bean.ConsultContent;
import com.dongnao.jack.bean.ConsultContract;
import com.dongnao.jack.dao.IConsultContract;
@Service
public class CommonServiceImpl implements CommonService {
@Autowired
private JdbcTemplate jdbcTemplate;
@Autowired
private IConsultContract iConsultContract;
public List<ConsultContent> queryContent(Map map) {
String sql = "select * from consult_content a where a.state = 0 and a.type = 1 order by a.itemindex";
return jdbcTemplate.query(sql, new RowMapper<ConsultContent>() {
public ConsultContent mapRow(ResultSet rs, int rowNum)
throws SQLException {
ConsultContent cc = new ConsultContent();
cc.setContent(rs.getString("content"));
cc.setId(rs.getInt("id"));
cc.setItemIndex(rs.getInt("itemIndex"));
cc.setState(rs.getInt("state"));
cc.setType(rs.getString("type"));
return cc;
}
});
}
// public int updateConsultContract(String psptId, int id) {
// return iConsultContract.
// }
public List<ConsultContract> queryConsultContract() {
return iConsultContract.findAll();
}
}
control代碼:
@RequestMapping("/queryContent")
public @ResponseBody List<ConsultContent> queryContent() {
logger.info("查詢開始!");
List<ConsultContent> consults = commonService.queryContent(new HashMap());
logger.info("查詢結束!");
return consults;
}
十一、Springboot Mybatis
1、pom.xml 配置maven依賴
<dependency>
<groupId>org.mybatis.spring.boot</groupId
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.0.0</version>
</dependency>
2、一定要在啓動的地方加上@MapperScan(“com.dongnao.jack.dao”)
3、配置文件中加上配置
mybatis.typeAliasesPackage=com.dongnao.jack.bean
mybatis.mapperLocations=classpath:com/dongnao/jack/xml/*Mapper.xml