一個整合經常使用第三方框架,簡化xml配置,徹底採用註解形式,內置tomcat容器,幫助開發者快速實現項目搭建,spring boot 的web組件默認集成的是springMVC框架css
注意:spring boot 是一個開發框架 並不是微服務html
(1)、簡化項目搭建難度前端
(2) 、簡化jar配置java
(3)、大大減小xml 配置mysql
(4)、內容tomcat容器,開發者無需配置,且端口修改特別容易git
工具(建議):ideaweb
jdk: Java1.8及以上spring
spring版本:Spring Framework 4.1.5及以上sql
本文采用 Spring Boot 2.1.4 版本調試經過。數據庫
SpringBoot 是一個快速開發的框架,可以快速的整合第三方框架,簡化XML配置,所有采用註解形式,內置Tomcat容器,幫助開發者可以實現快速開發,SpringBoot的Web組件 默認集成的是SpringMVC框架。
SpringMVC只是控制層框架。
SpringBoot 是一個快速開發的框架,可以快速的整合第三方框架,簡化XML配置,所有采用註解形式,內置Tomcat容器,幫助開發者可以實現快速開發,SpringBoot的Web組件 默認集成的是SpringMVC框架。
SpringCloud依賴與SpringBoot組件,使用SpringMVC編寫Http協議接口,同時SpringCloud是一套完整的微服務解決框架。
https://my.oschina.net/springMVCAndspring/blog/3032360#h1_52
建立的項目 初始化樣式:
編寫功能類
這裏只是controller層
效果:
相關代碼:
主函數:
package cn.ma.spring_demo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; //發現@SpringBootApplication是一個複合註解, // 包括@ComponentScan,和@SpringBootConfiguration,@EnableAutoConfiguration。 //該註解掃面的是該類所在包下面的全部內容 就是 @ComponentScan("cn.ma.spring_demo") @SpringBootApplication//因此 如何要訪問的類包路徑高於啓動類的包路徑是沒法被訪問到的 public class SpringDemoApplication { public static void main(String[] args) { SpringApplication.run(SpringDemoApplication.class, args); } } |
相關方法:
/** * 公司: * 文件名:SpringDemoController * 做者: 18392 * 時間: 2019/4/24 0:07 * 描述: */ package cn.ma.spring_demo.controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController//只能返回字符串 @RestController = @RespnoseBody+ @Controller public class SpringDemoController { /* *1.spring boot 入門案例 * http://localhost:8080/springDemoFunction * @Author sunshine * @Description //TODO * @Date 0:11 2019/4/24 * @Param [] * @return java.lang.String **/ @RequestMapping("/springDemoFunction") public String springDemoFunction(){ return "我是spring boot 入門demo"; } }
pom中的相關配置
<?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>cn.ma</groupId> <artifactId>spring_demo</artifactId> <version>0.0.1-SNAPSHOT</version> <name>spring_demo</name> <description>Demo project for Spring Boot</description> <!--1.spring-boot-starter-parent 依賴管理 是借用了maven的繼承特色--> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.4.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <!--2.導入相關jar--> <dependencies> <!--2.1 springweb 核心組件--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--2.2 測試相關jar--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <!--3.jdk版本控制--> <properties> <java.version>1.8</java.version> </properties> <!--4.可以以Maven的方式爲應用提供Spring Boot的支持,即爲Spring Boot應用提供了執行Maven操做的可能--> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
(1) @RestController
在上加上RestController 表示修飾該Controller全部的方法返回JSON格式,直接能夠編寫Restful接口
列以下圖:
(2)@EnableAutoConfiguration
做用在於讓 Spring Boot 根據應用所聲明的依賴來對 Spring 框架進行自動配置
這個註解告訴Spring Boot根據添加的jar依賴猜想你想如何配置Spring。因爲spring-boot-starter-web添加了Tomcat和Spring MVC,因此auto-configuration將假定你正在開發一個web應用並相應地對Spring進行設置。
(3) @SpringBootConfiguration
繼承自@Configuration,兩者功能也一致,標註當前類是配置類,並會將當前類內聲明的一個或多個以@Bean註解標記的方法的實例歸入到srping容器中,而且實例名就是方法名。
(4) @ComponentScan,掃描當前包及其子包下被@Component,@Controller,@Service,@Repository註解標記的類並歸入到spring容器中進行管理。是之前的<context:component-scan>(之前使用在xml中使用的標籤,用來掃描包配置的平行支持)。因此本demo中的User爲什麼會被spring容器管理。
(5) @SpringBootApplication
@SpringBootApplication是一個複合註解,包括@ComponentScan,和@SpringBootConfiguration,@EnableAutoConfiguration。
也就是說咱們能夠用後3個來代替 @SpringBootApplication
以下圖:
訪問效果圖:
第一步:
在src/main/resources/建立一個templates文件夾,後綴爲*.ftl
第二步:引入freeMarker的依賴包
<!-- 2.3 引入freeMarker的依賴包. --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-freemarker</artifactId> </dependency> |
第三步:編寫後臺方法
第四步:編寫ftl頁面
第1步:springboot的pom中引入jsp相關jar
<!--2.4.1 springboot整合jsp--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> </dependency> <!-- 2.4.2 SpringBoot 外部tomcat支持 --> <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-jasper</artifactId> </dependency> <!-- 2.4.3 jstl標籤庫 --> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> </dependency>
第2步:配置前端位置
spring.mvc.view.prefix=/WEB-INF/jsp/ spring.mvc.view.suffix=.jsp
第三步:建立靜態文件防止路徑 看準路徑
第四步:後臺編寫及jsp頁面
效果:
/** * 公司:馬氏集團 * 文件名:GlobalExceptionHandler * 做者: 18392 * 時間: 2019/4/26 10:29 * 描述: */ package cn.ma.spring_demo.err; import com.alibaba.fastjson.JSONObject; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RequestMapping; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; import java.util.HashMap; @ControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(RuntimeException.class) @RequestMapping("/exceptionHandler") public void exceptionHandler(HttpServletResponse response) throws IOException { //解決亂碼 及跨域 response.setContentType("text/html; charset=utf-8"); response.setHeader("Access-Control-Allow-Origin", "*");//解決json跨域 HashMap<String, Object> map = new HashMap<>(); map.put("msg","系統異常!"); String msg = JSONObject.toJSONString(map); PrintWriter out = response.getWriter(); out.println(msg); out.flush(); out.close(); } }
效果:
方式有:3種
方式一:log4j
方式二:使用AOP統一處理Web請求日誌
方式三:lombok插件 打印 放在一級標題 9了(緣由很好用)
(1)引入相關jar
(2) 定義全局變量
//log4j打印日誌 private static final Logger logger = LoggerFactory.getLogger(SpringDemoController.class);
(3) 經過log4j打印
(1)導入aop相關jar
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> |
(2) 日誌工具類(記得該切點路徑)
/** * 公司: * 文件名:HttpAspect * 做者: 18392 * 時間: 2019/4/26 11:45 * 描述: */ package cn.ma.spring_demo.utils; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.AfterReturning; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.aspectj.lang.annotation.Pointcut; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import javax.servlet.http.HttpServletRequest; import java.util.Date; import java.util.Enumeration; /* * 做用:獲取用戶請求 * (1)訪問地址URL * (2) 請求方式 * (3) 請求者IP * (4) 請求方法的響應時長 * @Author sunshine * @Description //TODO * @Date 13:11 2019/4/26 * @Param * @return **/ @Aspect @Component public class HttpAspect { private static final Logger logger = LoggerFactory.getLogger(HttpAspect.class); //切點 @Pointcut("execution(public * cn.ma.spring_demo.controller.*.*(..))") public void webLog() { } // System.out.println();// new Date()爲獲取當前系統時間 long beginTime=0;//開始時間 long endTime=0;//結束時間 //前置通知 @Before("webLog()") public void doBefore(JoinPoint joinPoint) throws Exception { //沒抽取的緣由是併發的時候會致使問題 這樣安全性更高 Date d = new Date(); long time = d.getTime(); beginTime =time; // 接收到請求,記錄請求內容 ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); HttpServletRequest request = attributes.getRequest(); // 記錄下請求內容 logger.info("訪問地址URL : " + request.getRequestURL().toString()); logger.info("請求方式HTTP_METHOD : " + request.getMethod()); logger.info("訪問者IP : " + request.getRemoteAddr()); Enumeration<String> enu = request.getParameterNames(); while (enu.hasMoreElements()) { String name = (String) enu.nextElement(); logger.info("參數name:{},參數value:{}", name, request.getParameter(name)); } } //後置通知 @AfterReturning(returning = "ret", pointcut = "webLog()") public void doAfterReturning(Object ret) throws Throwable { // 處理完請求,返回內容 logger.info("返回內容RESPONSE : " + ret); Date d = new Date(); long time = d.getTime(); // long endTime = TimeUtils.getTimeGap();//沒抽取的緣由是併發的時候會致使問題 這樣安全性更高 long endTime = time; logger.info("響應時長(單位毫秒) : " +(endTime-beginTime)); } } |
效果:
這個插件特別好用 因此用一級標題 編寫
功能:簡化getXxx/setXxx方法 能夠打印日誌
在idea上安裝教程:
https://www.cnblogs.com/hackyo/p/7998485.html
效果:
使用教程:
(1) 引入插件
(2) 實體類上添加註解
@Slf4j @Data
測試:
@Data 標籤,生成getter/setter toString()等方法
@NonNull : 讓你不在擔心而且愛上NullPointerException
@CleanUp : 自動資源管理:不用再在finally中添加資源的close方法
@Setter/@Getter : 自動生成set和get方法
@ToString : 自動生成toString方法
@EqualsAndHashcode : 從對象的字段中生成hashCode和equals的實現
@NoArgsConstructor/@RequiredArgsConstructor/@AllArgsConstructor
自動生成構造方法
@Data : 自動生成set/get方法,toString方法,equals方法,hashCode方法,不帶參數的構造方法
@Value : 用於註解final類
@Builder : 產生複雜的構建器api類
@SneakyThrows : 異常處理(謹慎使用)
@Synchronized : 同步方法安全的轉化
@Getter(lazy=true) :
@Log : 支持各類logger對象,使用時用對應的註解,如:@Log4
@AllArgsConstructor
1. 搭建springboot項目
(2)pom中配置jar
<!--1.web--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- 2.2.1 springboot與mybaties整合jar --> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.1.1</version> </dependency> <!-- 2.2.2 MySQL 驅動jar --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <!-- 2.2.3 mybatis數據庫字段類型映射,將時間類型進行轉換:解決日期映射 --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-typehandlers-jsr310</artifactId> <version>1.0.1</version> </dependency> <!--2.2.4 druid鏈接池--> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.9</version> </dependency> <!-- 3. fastjson插件--> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.47</version> </dependency> <!--4.lombook--> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.16.18</version> </dependency>
很是重要:
<!--放行xml格式文件--> <resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.xml</include> </includes> <filtering>true</filtering> </resource> </resources>
(3) 配置數據源
6.0版本以前的
spring.datasource.driverClassName=com.mysql.jdbc.Driver spring.datasource.url=jdbc:mysql://localhost:3306/springboot spring.datasource.username=root spring.datasource.password=root
新版mysql:
#1.配置端口 server.port=9000 #2.鏈接數據源
spring.datasource.url=jdbc:mysql://localhost:3306/studydb?useUnicode=true&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
#3.鏈接池的配置信息
spring.datasource.initialSize=5
spring.datasource.minIdle=5
spring.datasource.maxActive=20
spring.datasource.maxWait=60000
spring.datasource.timeBetweenEvictionRunsMillis=60000
spring.datasource.minEvictableIdleTimeMillis=300000
spring.datasource.validationQuery=SELECT 1 FROM DUAL
spring.datasource.testWhileIdle=true
spring.datasource.testOnBorrow=false
spring.datasource.testOnReturn=false
spring.datasource.poolPreparedStatements=true
spring.datasource.maxPoolPreparedStatementPerConnectionSize=20
spring.datasource.filters=stat,wall,log4j
spring.datasource.connectionProperties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
#4.統一配置實體類包路徑
mybatis.type-aliases-package=cn.ma.sm.pojo
#5.開啓駝峯命名
mybatis.configuration.map-underscore-to-camel-case=true
(4) 建立3層包
(5) 三層代碼
5.1 controller層
5.2 業務層
業務層接口:
業務層實現類:
持久岑:
持久岑接口:
持久岑xml文件:
注意 配置掃包:
項目搭建好後的測試:
代碼:
碼雲:https://gitee.com/Luck_Me/springboot
百度雲:
連接:https://pan.baidu.com/s/1oPJ2ms9t-6yY27HPxB11TA
提取碼:2ovl
只須要web的相關jar 不須要添加任何其餘的jar
@EnableScheduling//開啓spring定時任務
// http://cron.qqe2.com/ //@Scheduled(cron="0 * * * * ?")// 間隔1分鐘執行 @Scheduled(cron = "0/5 * * * * ? ") // 間隔5秒執行 public void reportCurrentTime() { SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss"); System.out.println("如今時間:" + dateFormat.format(new Date())); }
//解決亂碼 及跨域 response.setContentType("text/html; charset=utf-8"); response.setHeader("Access-Control-Allow-Origin", "*");//解決json跨域
解決方案代碼:
#2.統一配置實體類包路徑 mybatis.type-aliases-package=cn.guang.springboot_mybites.domain
錯誤效果:
配置位置:
11.4 開始駝峯式命名
#3.開啓駝峯命名 mybatis.configuration.map-underscore-to-camel-case=true
問題效果:
開始後的效果:
11.5 xml靜態資源 掃包 及放行
掃包:
@MapperScan("cn.guang.springboot_mybites.mapper")//掃描xml文件路徑
xml 資源放行:(注意代碼 編寫的位置)
<!--放行xml格式文件--> <resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.xml</include> </includes> <filtering>true</filtering> </resource> </resources>
@EnableScheduling//開啓spring定時任務
// http://cron.qqe2.com/ //@Scheduled(cron="0 * * * * ?")// 間隔1分鐘執行 @Scheduled(cron = "0/5 * * * * ? ") // 間隔5秒執行 public void reportCurrentTime() { SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss"); System.out.println("如今時間:" + dateFormat.format(new Date())); }
效果:
/** * 公司:馬氏集團 * 文件名:LoginIntercept * 做者: 18392 * 時間: 2019/4/28 22:35 * 描述: */ package cn.guang.boottime.utils; import org.springframework.stereotype.Component; import org.springframework.util.StringUtils; import org.springframework.web.servlet.HandlerInterceptor; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /* * 自定義攔截器類 * 放行註冊 驗證碼 登陸等方法 * @Author sunshine * @Description //TODO * @Date 22:49 2019/4/28 * @Param * @return **/ @Component public class LoginIntercept implements HandlerInterceptor { public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { //解決亂碼 及跨域 response.setContentType("text/html; charset=utf-8"); response.setHeader("Access-Control-Allow-Origin", "*");//解決json跨域 //本身進行改造 到時候 判斷session區域中是否存在用戶 存在放行 不然到登陸頁面 System.out.println("開始攔截"); String token = request.getParameter("token"); if (StringUtils.isEmpty(token)) { response.getWriter().println("請先登陸");//實際上要跳轉頁面的 return false; } return true; } }
/** * 公司:馬氏集團 * 文件名:WebConfig * 做者: 18392 * 時間: 2019/4/27 22:27 * 描述: */ package cn.guang.boottime.utils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; 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.WebMvcConfigurationSupport; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; /* * 用於配置啓動 自定義攔截器類 * @Author sunshine * @Description //TODO * @Date 22:57 2019/4/28 * @Param * @return **/ @Configuration public class WebConfig implements WebMvcConfigurer { @Autowired private LoginIntercept loginIntercept;//本身定義的 // 這個方法是用來配置靜態資源的,好比html,js,css,等等 @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { } // 這個方法用來註冊攔截器,咱們本身寫好的攔截器須要經過這裏添加註冊才能生效 @Override public void addInterceptors(InterceptorRegistry registry) { // addPathPatterns("/**") 表示攔截全部的請求, // excludePathPatterns("/login", "/register") 表示除了登錄與註冊以外,由於登錄註冊不須要登錄也能夠訪問 registry.addInterceptor(loginIntercept).addPathPatterns("/**").excludePathPatterns("/login", "/register"); } }
效果:
未登陸前:
登陸成功 能夠訪問其餘方法
代碼編寫:
(1) 配置數據源
(2) 新建 實體類
(3) 三層代碼編寫 controller層簡單處理一下業務
附上代碼
碼雲:https://gitee.com/Luck_Me/Interceptor/tree/master
百度雲:
連接:https://pan.baidu.com/s/1aoZAlIlr9bBVwguJ_hVGPg
提取碼:saex
//注入配置變量 @Value("${ip}") private String ip;
效果:
開發步驟:
(1) 配置文件中定義變量
(2) 子須要的類中注入變量對象
(3) 須要的地方調用
效果:
很簡單 只要在須要事務的方法上加上事務註解便可
@Transactional//開啓事務註解
參考:
http://www.javashuo.com/article/p-bmxmtjpn-ez.html
效果:當後臺代碼改變的時候 該插件幫助咱們自動重啓服務
配置步驟:
(1) 添加相關jar
<!--3.4 熱加載 插件devtools--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <optional>true</optional> <scope>true</scope> </dependency>
<configuration> <fork>true</fork> </configuration>
(2) 設置裏面加上自動編譯
效果: