SpringBoot快速入門 springboot是什麼?爲何要用?怎麼用? springboot是爲了簡化spring的開發的一個輕量級的框架,減小配置,簡化maven配置,嵌入tomcat,不須要部署war包1.添加依賴 <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.3.RELEASE</version> </parent> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>2.使用 1.helloworld 新建App啓動類,增長註釋@EnableAutoConfiguration @RestController @EnableAutoConfiguration public class Application1 { @RequestMapping("/") String home() { return "Hello World!"; } public static void main( String[] args ) { SpringApplication.run(Application1.class,args); } } 詳見Application1 訪問入口:http://localhost:8080 2.啓動類使用@SpringBootApplication 詳見Application2 訪問入口:http://localhost:8080/test/hello 3.與mybatis集成 1.建表t_user 詳見:t_user.sql 2.使用mybatis generator 生成model,Dao,xml 依賴mybatis-generator-core 3.依賴 <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.2.0</version> </dependency> 4.配置數據源,新建application.properties 5.在UsersMapper增長註解@Mapper 或者在啓動類上增長@MapperScan(value = {"com.suns.dao"}) 6.新建測試類UserTest 依賴spring-boot-starter-test @SpringBootTest(classes = {Application3.class}) @RunWith(SpringRunner.class) // SpringJUnit4ClassRunner public class UserTest {...} 詳見UserTest 訪問入口:UserTest.testAdd 4.事務支持 1.注意:表的存儲引擎要爲InnoDB 2.新建IUserService ,UserServiceImpl,增長註解@Transactional 3.在啓動類上增長@EnableTransactionManagement 詳見UserTest 訪問入口:UserTest.testAddBatch 5.全局異常 1.新建ExceptionController#testExeception(), int i=1/0; 2.訪問 http://localhost:8080/testExe 會報錯 :Whitelabel Error Page 3.解決辦法:新建全局異常處理類 @ControllerAdvice public class GlobalExceptionHandler {} 4.訪問一個不存在的路徑 http://localhost:8080/testExe12343 又會報錯 :Whitelabel Error Page 5.解決辦法: 1.在全局異常處理類GlobalExceptionHandler中新增 @Bean public WebServerFactoryCustomizer<ConfigurableWebServerFactory> webServerFactoryCustomizer(){} 2.新建BaseController,必定公共處理的方法 @RequestMapping("/404.do") public Object error_404() {} 6.靜態資源訪問,如js,css,圖片,html等 Spring Boot默認提供靜態資源目錄位置需置於classpath下,目錄名需符合以下規則: /static /public /resources /META-INF/resources 1.在resources下新建static,放一張圖片20190221.png 2.訪問http://localhost:8080/20190221.png 7.與jsp集成 (訪問不到jsp頁面,有問題) 通常來講springboot不建議使用jsp。 並且springboot 內置的tomcat 並無集成jsp,也沒有el表達式。所以若是要使用須要添加依賴 1.依賴 <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> </dependency> <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-jasper</artifactId> </dependency> 2.在application.properties中增長 spring.mvc.view.prefix=/WEB-INF/jsp spring.mvc.view.suffix=.jsp 3.依次新建webapp目錄,WEB-INF目錄,jsp目錄,index.jsp 4.訪問 http://localhost:8080/jsp/index 8.模板引擎thymeleaf SpringBoot 推薦使用模板引擎來渲染html,若是你不是歷史遺留項目,必定不要使用JSP,經常使用的模板引擎不少,有freemark,thymeleaf等,其實都大同小異其中springboot 強烈推薦的是用thymeleaf 1.依賴 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> 2.註釋掉jsp相關jar ,並註釋application.properties中jsp的配置 3.新建controller @Controller @RequestMapping("/tpl") public class ThymeleafController {} 4.依次在resources下新建templates目錄,testThymeleaf.html 注意:必定要templates,不能是template,否則會找不到 5.訪問:http://localhost:8080/tpl/testThymeleaf 9.swagger2 自動生成api文檔,並能夠在線測試 1.依賴 <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>2.7.0</version> </dependency> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> <version>2.7.0</version> </dependency> 2.增長配置類 @EnableSwagger2 @Configuration public class SwaggerConfig {} 3.新建測試類 @RestController @RequestMapping(value="/swagger") public class SwaggerController {} 4.訪問入口:http://localhost:8080/swagger-ui.htm 10.日誌 般狀況下,springboot日誌只會輸出到控制檯,並不會寫入到日誌文件,可是,在一些正式環境的應用中,咱們須要經過在 application.properites 文件中配置 logging.file 文件名稱和 logging.path 文件路徑,將日誌輸出到日誌文件中 1.在application.properties增長配置 logging.path = e:/log logging.file = xxx.log logging.level.root = info # 配置具體類的日誌級別 logging.level.org.springframework.web=debug logging.level.com.suns.controller.TestContronller=info logging.level.com.suns.controller.ThymeleafController=debug 注意:若是隻配置 logging.path,在 /var/tmp文件夾生成一個日誌文件爲 spring.log。若是隻配置 logging.file,會在項目的當前路徑下生成一個 xxx.log 日誌文件 默認是使用logback,若是要使用其餘的日誌框架,須要排除掉logback 2.使用log4j2 <!-- log4j2 ,因爲默認使用logback在擴展log4j2以前先要把logback移除--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-log4j2</artifactId> </dependency> 3.使用log4j, 通常使用log4j2,而不使用log4j 若是不僅爲了學習集成log4j,在工做是最好不要使用log4j,畢竟有了log4j2,也有了logback使用log4j就是吃飽了撐着在springboot中並無提供對log4j這個依賴的支持,所以要使用它配置起來仍是挺麻煩的。在: mvnrepository.com 中發現log4j最新版本spring-boot-starter-log4j是1.3.8.RELEAS 1.依賴 <!-- log4j ,因爲默認使用logback在擴展log4j2以前先要把logback移除 ,通常不使用log4j,如今已不維護了 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-log4j</artifactId> <version>1.3.8.RELEASE</version> </dependency> 2.在resources下新建log4j.properties,log4j的日誌控制是在log4j.properties,包括日誌級別 3.新建Log4jController, private final Logger logger = Logger.getLogger(Log4jController.class); 使用logger輸出日誌 4.訪問入口:http://localhost:8080/log4j/hello 5.就能夠看到當前目錄下有logs/all.log文件了 11.使用aop對日誌進行統一處理 1.依賴 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> 2.增長切面類 @Aspect @Component public class WebLogAspect {} @Pointcut("execution(* com.suns.controller.*.*(..)))") 攔截controller 3.訪問入口:http://localhost:8080/test/hello 隨意訪問一個路徑,查看日誌輸出 12.springboot熱加載/熱部署 devtools 熱部署通常用於開發環境,不會用到生產環境。spring-boot-devtools 是一個爲開發者服務的一個模塊,其中最重要的功能就是自動應用代碼更改到最新的App上面去。原理是在發現代碼有更改以後,從新啓動應用,可是速度比手動中止後再啓動還要更快,更快指的不是節省出來的手工操做的時間 原理:其深層原理是使用了兩個ClassLoader,一個Classloader加載那些不會改變的類(第三方Jar包),另外一個ClassLoader加載會更改的類,稱爲 restart ClassLoader,這樣在有代碼更改的時候,原來的restart ClassLoader 被丟棄,從新建立一個restart ClassLoader,因爲須要加載的類相比較少,因此實現了較快的重啓時間 1.依賴 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> </dependency> 2.修改properties文件 若是使用的Thymeleaf 模板,那麼請直接在application.properties中添加 spring.thymeleaf.cache=false 若是使用的FreeMarker 模板,那麼請直接在application.properties中添加 spring.freemarker.cache=false 3.若是是在idea中使用熱加載須要做以下步驟。若是是ecplise,則不須要作以下步驟,只須要ctrl+s就會自動從新編譯代碼了 1.在pom中增長以下插件 <!-- 用戶devtools熱部署的插件 --> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <!-- 若是不設置fork,那麼不會restart,devtools熱部署不會起做用--> <fork>true</fork> </configuration> </plugin> 2.手動編譯:修改完代碼,按快捷鍵Ctrl+F9,手動構建項目,或者只修改單個類文件的話,按Ctrl+Shift+F9,從新編譯該類文件,便可觸發重啓服務 3.自動編譯: 1.File -> Settings -> Compiler,勾選 Build Project automatically 2.按快捷鍵Ctrl+Shift+Alt+/,選擇 Registry... ==> 勾選 compiler.automake.allow.when.app.running 便可3.高級使用 1.集成redis 1.依賴 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> 2.在配置文件application.properties中增長配置: # Redis數據庫索引(默認爲0) spring.redis.database=0 # Redis服務器地址 spring.redis.host=47.107.146.57 # Redis服務器鏈接端口 spring.redis.port=6379 # Redis服務器鏈接密碼(默認爲空) spring.redis.password= # 鏈接超時時間(毫秒) spring.redis.timeout=5000 3.測試類 詳見:RedisTest,首先要啓動redis服務 2.集成RabbitMQ 1.依賴 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency> 2.在配置文件application.properties中增長配置: spring.rabbitmq.host=47.107.146.57 spring.rabbitmq.port=5672 spring.rabbitmq.username=admin spring.rabbitmq.password=admin 3.RabbitMQ配置類:建立Queue @Configuration public class RabbitConfig { @Bean public Queue queue(){ // 建立一個隊列,名稱爲:rmq001 return new Queue("rmq001"); } } 4.生產者 @Component public class RabbitSender { @Autowired private AmqpTemplate amqpTemplate; public void send(){ amqpTemplate.convertAndSend("rmq001","rabbitmq發送到隊列rmp001測試"); System.out.println("生產者:"+"rabbitmq發送到隊列rmp001測試"); } } 5.消費者 @RabbitListener(queues = {"rmq001"}) @Component public class RabbitReceiver { @RabbitHandler public void receive(String msg){ System.out.println("消費者:"+"rabbitmq收到隊列rmp001數據:"+msg); } } 6.測試類 詳見:RabbitMQTest ,首先要啓動rabbitmq服務 3.監控管理Actuator Actuator是spring boot的一個附加功能,可幫助你在應用程序生產環境時監視和管理應用程序。可使用HTTP的各類請求來監管,審計,收集應用的運行狀況.特別對於微服務管理十分有意義 缺點:沒有可視化界面(Spring cloud 還會用到這功能,就能夠看到界面了) 1.依賴 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> 2.在application.properties中增長配置 #監控管理actuator # 加載全部的端點/默認只加載了 info / health management.endpoints.web.exposure.include=* #描述信息 info.blog-url=www.test.com info.author=mk info.version=v1.0.0 3.測試入口:http://localhost:8080/actuator/info 或 http://localhost:8080/actuator Actuator訪問路徑 經過actuator/+端點名就能夠獲取相應的信息,如 /actuator/beans 顯示應用程序中全部Spring bean的完整列表。 /actuator/configprops 顯示全部配置信息。 /actuator/env 陳列全部的環境變量。 /actuator/mappings 顯示全部@RequestMapping的url整理列表。 /actuator/health 顯示應用程序運行情況信息 up表示成功 down失敗 /actuator/info 查看自定義應用信息 4.自定義starter 在學習SpringBoot的過程當中,不論是集成redis仍是RabbitMQ,甚至是前面集成mybatis已經學習了不少starter,這些starter都是springboot爲咱們提供的一些封裝,這些starter能很是方便快捷的增長功能,並不須要不少配置,即便須要配置也就在application.properties稍微配置下就能夠了。 那麼接下來就學習下怎麼建立屬於本身的starter,如搭建本身的redis-starter。詳見springboot-starter 1.新建空的父項目 springboot-starter 2.新建本身項目 my-redis-starter,只引入spring-boot-starter包,不須要引入spring-boot-starter-web包 1.依賴 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <!-- redis --> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.6.1</version> </dependency> 2.新建屬性配置類MyRedisProperties 3.新建配置類MyRedisConf 4.依次新建resources目錄,META-INF目錄,spring.factories文件,內容以下 #配置自定義Starter的自動化配置 org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.suns.redis.MyRedisConf 3.新建測試項目 my-redis-starter-test 1.依賴,引入my-redis-starter <dependency> <groupId>com.suns</groupId> <artifactId>my-redis-starter</artifactId> <version>1.0</version> </dependency> 2.配置本身的屬性 #引入自定義的redis myredis.host=47.107.146.57 myredis.port=6379 3.測試 詳見RedisTest 原理:經過啓動類的註解@SpringBootApplication,到@EnableAutoConfiguration,到@Import(AutoConfigurationImportSelector.class) 而AutoConfigurationImportSelector實現了ImportSelector接口,重寫selectImports方法,最終是加載META-INF/spring.factories配置文件中的類 在META-INF/spring.factories中能夠自定義本身的配置類,而後經過配置類來初始化本身的組件(@Configuration ,@Bean等),如redis,mybaits等 接着只要引入該jar包就能夠直接使用裏面的組件了,如@Autowired private Jedis jedis @SpringBootApplication @EnableAutoConfiguration @Import(AutoConfigurationImportSelector.class) 實現了ImportSelector接口,重寫selectImports方法 public String[] selectImports(AnnotationMetadata annotationMetadata) {} AutoConfigurationEntry autoConfigurationEntry = getAutoConfigurationEntry(autoConfigurationMetadata, annotationMetadata); List<String> configurations = getCandidateConfigurations(annotationMetadata,attributes); List<String> configurations = SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(), getBeanClassLoader()); classLoader.getResources(FACTORIES_RESOURCE_LOCATION);//FACTORIES_RESOURCE_LOCATION = "META-INF/spring.factories";