SpringBoot-all
course1 課程一 SpringBoot快速入門
https://start.spring.io/ Springboot項目快速構建網站
@SpringBootApplication註解
查看源碼發現它相當於SpringBootConfiguration Springboot配置類似於Configuration註解
EnableAutoConfiguration 自動注入配置
ComponentScan 掃描 這三個註解
course2 課程2 SpringBoot配置分析
默認配置文件application.properties默認的位置在classpath根目錄,或者是classpath/config目錄下
file:/,file:config/
也可以使用yaml格式,application.yml或者application.yaml
application中是自定義參數,在Courese2Application用三種方式取得配置文件中的值
1.@Value Spring註解 默認值方式爲${"hello:huangsm"}
2.Environment SpringBoot新特性,通過鍵值對的方式獲取配置值
3.通過@ConfigurationProperties(prefix = "huel") 代碼參考Huel實體類
TomcatProperties支持集合和數組的注入
2.動態的引入配置文件
自定義MyEnvironmentPostProcessor實現EnvironmentPostProcessor接口
3.各個生產環境的切換---通過配置方式
#測試環境
spring.profiles.active=dev
maven啓動參數方式切換配置文件(表示啓用多個)
--spring.profiles.active=dev,prod
4.根據不同環境注入不同的Bean
詳情查看MyConfig編碼
@Profile註解在類上或者方法上使用,代表裝配不同的Bean
course3 課程3 SpringBoot自動配置
1.Condition接口 (用來自定義條件裝配來使用)
其中有一個抽象方法matches,參數分別爲ConditionContext context, AnnotatedTypeMetadata metadata
如何這個方法返回true表示可以自動裝配,false表示不裝配
2.Conditional註解 對接口的註解封裝
基於條件的自動裝配,一般配合Condition接口一起使用,只有接口實現類返回true,才裝配,否則不裝配,
他可以用在方法上,也可以用在類上。
3. @ConditionalOnProperty(name="runable.enabled",havingValue = "true")
讀取配置文件中的runable.enabled,爲true該Bean裝配,否則不裝配
4. @ConditionalOnClass(name = "com.google.gson.Gson")
表示類路徑下存在Gson這個包的時候才裝配
5.@ConditionalOnBean(name = "user")
根據容器中是否存在某個bean來進行裝配
6.ConditionalOnMissingBean(name="user")
當容器中不存在bean時才裝配
course4 課程4 Spring Boot @Enable*註解的工作原理
1.@EnableConfigurationProperties註解
用來啓用一個特性的,這個特性就是,可以把配置文件的屬性注入到bean裏面去,和@ConfigurationProperties一起使用
2.@EnableAsync啓用異步,一般適合@Async一起使用
3.@Enable的工作原理在於引入一個或者多個配置
@Enable中做重要的註解在於@import將Bean裝配導入到spring容器,@Enable內部就是導入一個配置類
4.@import用來導入一個或者多個類(bean會被Spring容器所託管)或者配置類(配置類中的bean都會被spring容器所託管)
5.ImportSelector
其中有一個selectImports方法,方法的返回值必須是一個class(全稱),該class會被spring容器所託管起來
6.ImportBeanDefinitionRegistrar
通過實現這個接口的registerBeanDefinitions方法,調用一下代碼:
BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.rootBeanDefinition(User.class);
registry.registerBeanDefinition("user", beanDefinitionBuilder.getBeanDefinition());
course5 課程5 Spring Boot @EnableAutoConfiguration深入分析(無代碼偏理論和源碼分析,可以仔細研究這個註解的源碼)
1.@EnableAutoConfigurationchong
作用:從classpath中搜索所以META-INF/spring.factories配置文件,然後將其中
org.springframework.boot.autoconfigure.EnableAutoConfiguration key對應的配置項加載到spring容器中
只有org.springframework.boot.autoconfigure.EnableAutoConfiguration爲true時纔會生效,默認爲true
@EnableAutoConfiguratio還可以進行排除:排除方式有倆種:1.通過class來排除
2.根據類的名字來排除
2.其內部實現的關鍵點
ImportSelector 該接口的方法返回值都會被納入到Spring容器管理中
SpringFactoriesLoader 該類可以從classpath中搜索所以META-INF/spring.factories配置文件,並讀取配置
course6 課程6 Spring Boot 事件監聽 --四種方式講解如何配置事件監聽 (代碼也放在course5中)
事件流程
-
自定義事件,一般是繼承ApplicationEvent抽象類
-
定義事件監聽器,一般是實現ApplicationListener接口
-
啓動事件,需要把監聽器加入到spring容器中
1.添加事件監聽器app.addApplicationListener(new MyApplicationListener()); 2.使用@Component將事件監聽器加入到spring容器中 3.通過全局配置的方式context.listener.classes=com.springboot.study.course5.listener.MyApplicationListener 4.自定義事件處理器,類似於代碼中的MyEventHandle
-
發佈事件 app.publishEvent(new MyApplicationEvent(new Object()));
源碼分析
- DelegatingApplicationListener,查看這個類,閱讀源碼,配置方式的源碼
- EventListenerMethodProcessor,事件處理器方式源碼,其核心實現根據@EventListener來處理監聽事件
course7 課程7 Spring Boot 擴展分析ApplicationContextInitializer、CommandLineRunner、ApplicationRunner、ApplicationArguments
1.ApplicationContextInitializer 接口是在Spring容器執行refreshed之前的一個回調
使用步驟:
- 寫一個類,實現ApplicationContextInitializer接口
- 註冊ApplicationContextInitializer
註冊方法:
-
ApplicationContextInitializer.addInitializers
-
通過配置文件配置:context.initializer.classes指定,需要指定多個請看course7代碼配置文件
-
通過METE/INF中的spring.factorties文件中指定(也可以註冊監聽器)
-
CommandLineRunner是Spring容器啓動成功後的最後一步回調 (步驟參考ServerSuccessReport代碼)
使用步驟 -
寫一個類實現CommandLineRunner接口
-
通過@Component將它交給容器管理
通過@Order(param)來控制多個CommandLineRunner實現類的執行順序,param參數數字最大,最早執行。
3. CommandLineRunner,ApplicationRunner區別:
區別在於方法的參數不一樣
CommandLineRunner的參數是最原始的參數,沒有做任何處理
ApplicationRunner的參數是ApplicationArguments 是對原始參數進一步的封裝
- ApplicationArguments是對參數(main方法)進一步處理,可以解析–name=value的,我們可以通過name來獲取value
course8 課程8 Spring Boot 補充講解
@SpringBootApplication
默認掃描當前類已經子類下的所有包
1.@SpringBootApplication(exclude = ServerSuccessReport.class)
不掃描ServerSuccessReport這個類
2.@SpringBootApplication(excludeName = "com.springboot.study.course7.MyApplicationContextInitializer")
不掃描MyApplicationContextInitializer這個類
3.@SpringBootApplication(scanBasePackages = "com.springboot.study.course7")
掃描com.springboot.study.course7下的所有類
4.@SpringBootApplication(scanBasePackageClasses = MyApplicationContextInitializer.class)
掃描這個類
banner
- 在resources添加自己的banner.txt替換系統的banner
- 也可以關閉banner
- 支持圖片格式banner,支持jpg,png,gif
- 修改全局配置文件
banner.location=my.txt
banner.charset=GBK
banner.image.location=my.jpg
course9 課程9 Spring Boot 運行流程分析
- 倆種方法創建SpringBoot啓動類
第一種調用方式: SpringApplication app=new SpringApplication(Course7Application.class); app.run(args); 第二種調用方式: SpringApplication.run(Course7Application.class, args);
- 運行流程
- 判斷是不是Web環境
- 加載所有classpath下面的META-INF/spring.factorties ApplicationContextInitializer
- 加載所有classpath下面的META-INF/spring.factorties ApplicationListener
- 推斷main方法所在的類
- 開始執行run方法
- 設置java.awt.headless系統變量
- 加載所有classpath下面的META-INF/spring.factorties SpringApplicationRunnerListener
- 執行所有SpringApplicationRunnerListener的started方法
- 實例化ApplicationArguments對象
- 創建environment
- 配置environment,主要是把run方法的參數配置到environment中
- 執行所有SpringApplicationRunnerListener的environmentPrepared方法
- 如果不是web環境,但是是web的environment,則把這個web的environment轉換長標準的environment
- 打印banner
- 初始化applicationContext,如果是web環境,則實例化AnnotationConfigEmbeddedWebApplicationContext對象,否則實例化AnnotationConfigApplicationContext對象
- 如果beanNameGenerator不爲空,就把beanNameGenerator對象注入到applicationContext裏面去
- 回調所有的ApplicationContextInitializer方法
- 執行所有SpringApplicationRunnerListener的contextPrepared方法
- 依次往spring容器中注入:ApplicationArguments,Banner
- 加載所有的源到applicationContext裏面去
- 執行所有SpringApplicationRunnerListener的contextLoaded方法
- 執行applicationContext的refresh方法,並且調用applicationContext的registerShutdownHook方法
- 回調,獲取容器中所有的ApplicationRunner,CommandLineRunner接口,然後排序,依次調用
- 執行所有SpringApplicationRunnerListener的finished方法
course10 課程10 Spring Boot Web開發
- 快速開發一個接口(參照代碼)
- 修改默認端口號 修改配置文件server.port=8181
- @RequestParam默認參數必須提供,修改required可以不用提供值 @RequestParam(value = “name”,required = false,defaultValue = “huangsm”)
- @PathVariable獲得路徑中的值,參考代碼
- @RestController返回Json格式給前臺
- 整合JSP引入依賴tomcat-embed-jasper,配置spring.mvc.view.prefix=/WEB-INF/jsp/和spring.mvc.view.suffix=.jsp(詳情參考JspController)
- 整合freemarker,引入spring-boot-starter-freemarker,ftl頁面放在templates中(詳細看代碼,和配置文件)
- 配置訪問默認前綴 server.servlet.context-path=/huangsm,默認爲/
- 更換web容器,首先在spring-boot-starter-web排序spring-boot-starter-tomcat的依賴,在添加spring-boot-starter-jetty的依賴(這裏就不測試了)
- SpringBoot訪問靜態資源,可以將靜態資源放在src/main/webapp下,springboot中將它放入static中,可以通過freemarker訪問(詳細看代碼),也可以直接訪問
#修改默認靜態頁面路徑
spring.resources.static-locations=classpath:/META-INF/resources/,classpath:/resources/static/,classpath:/static/,classpath:/public
- 方式一:如何在SpringBoot中使用servlet,詳細查看UserServlet類,需要使用@WebServlet("/user.do")表明路徑,在啓動類中開啓對Servlet的掃描@ServletComponentScan
- 如何在SpringBoot中使用Filter,實現Filter接口,編寫自己的業務邏輯,通過@WebFilter註解添加過濾規則(詳細參考LogFilter代碼)
- 如何在SpringBoot中使用Listener,實現ServletContextListener接口,實現他的倆個方法,通過@WebListener註解啓動監聽器
- 方式二:用配置類來使用Servlet、Filter、Listener(使用詳細查看servlet包下代碼)
1.編寫Servlet 2.裝配相應的bean到spring容器中 servlet ->ServletRegistrationBean filter ->FilterRegistrationBean listener ->ServletListenerRegistrationBean
- 如何在Springboot中使用攔截器(詳細步驟參考interceptor和config中的配置即可)1.寫一個攔截器實現HandlerInterceptor接口2.在WebMvc配置類中實現addInterceptors方法即可。
- 配置錯誤頁面跳轉,首先排除springboot自帶的錯誤處理頁面@SpringBootApplication(exclude = ErrorMvcAutoConfiguration.class),頁面跳轉處理邏輯參考exception包下的CommonErrorPageRegistry類
- 全局異常處理器(詳細代碼參考exception包下的GolbalExceptionHandler類)
course11 課程11 Spring Boot 定製和優化內嵌的Tomcat
tomcat: 參數的使用 accesslog: enabled: true 開啓日誌 directory: G:\logs 存放日誌的底單 address: 192.168.12.60 規定只允許訪問的ip
- 編碼方式定製tomcat容器,詳情看tomcat包下TomcatCustomizer類
course12 課程12 Spring Boot JDBC --多種數據源的配置、JdbcTemplate、事務的處理
- 首先加入spring-boot-starter-jdbc依賴,然後Springboot自動裝配DataSource,在全局配置文件中配置即可,詳細參考(application.yml文件)
- SpringBoot會自動裝配jdbcTemplate,可以直接使用。詳細使用方式參考代碼(TestDao)
- spring.datasource.type可以指定具體使用哪種數據源,默認支持tomcat-jdbc,Hikari,dbcp,dbcp2,首先排除默認數據源,然後在引入對應的數據源依賴及可以使用
- 自定義配置DataSource,首先引入依賴,然後創建DataSource配置類,裝配一個數據源到spring容器中(詳細代碼參考DataSourceConfig代碼,注意在application.yml文件中指定DataSource的類型)
- Springboot中開啓事務,首先要使用@EnableTransactionManagement註解,啓用對事務的支持,然後加上@Transactional(rollbackFor = Exception.class)對全部一次都進行事務回滾,他只能標註在spring容器管理的公用方法纔會生效
course13 課程13 Spring Boot AOP(面向切面編程)
- 添加spring-boot-starter-aop依賴,默認就開啓了aop的支持,編寫一個切面類(詳細代碼參考aop包下的Log類),@EnableAspectJAutoProxy //啓用aop
- 是否啓用aop 默認爲true:spring.aop.auto=true, false-jdk動態代理,true-cglib代理方式,默認爲false:spring.aop.proxy-target-class=false,如果配置了false,切面的類沒有接口依然使用cglib
course14 課程14 Spring Boot Starter --快速構建自定義的Spring Boot Starter
自己開發一個spring boot starter的步驟
- 新建一個maven項目
- 需要一個配置類,配置類裏面需要裝配好需要提供出去的類
- (1)使用Enable,配合@Import註解使用 (2)或者/META-INF/spring.factories
course15 課程15 Spring Boot 日誌–演示瞭如何在Spring Boot裏面使用日誌配置,以及logback,log4j2等日誌的使用
- logging.level.*=debug 修改日誌信息級別 *可以是包也可以是類或者root
- 日誌級別有:TRACE,DEBUG,INFO,ERROR,WARN,FATAL,OFF OFF表示關閉日誌輸出
- logging.file=G:/logs/my.log 指定日誌文件路徑 logging.path=G:/logs制定日誌目錄(此時的日誌名字爲spring.log) 日誌文件輸出,文件大小10M之後就會分割了
- logging.pattern.console配置日誌在控制檯的輸出格式logging.pattern.file配置日誌在文件中的輸出格式
- 在classpath下放一個logback.xml,logback-spring.xml的文件,即可控制日誌文件的配置
- (1)使用其他日誌組件步驟,排除掉默認的日誌組件:spring-boot-starter-logging(2)加入新的日誌路徑依賴(3)把相應的配置文件放到classpath下
course16 課程16 Spring Boot 監控和度量 --Spring Boot內置的監控點、自定義的監控狀況檢查、自定義度量統計,輸出等等
- 添加spring-boot-starter-actuator依賴,並且在全局配置文件中開啓management.endpoints.web.exposure.include=*,訪問localhost:port/actuator就可以監控應用信息
- 可以在http://localhost:9000/actuator/info顯示配置文件中以info開頭的信息,會顯示git.properties中的信息
- SpringBoot2.0監控點詳情http://www.ityouknow.com/springboot/2018/02/06/spring-boot-actuator.html
course17 課程17 Spring Boot 測試 --實戰演示在Spring Boot裏面的測試案例,以及如何測試Controller
- Springboot測試步驟,直接在測試類上加如下倆個註解@RunWith(SpringRunner.class),@SpringBootTest
- 測試環境下配置配置類,通過@TestConfiguration,在測試類上的加上@SpringBootTest(classes = TestBeanConfig.class)就可以導入配置類中的bean
- Mock測試方式,詳細參考代碼UserMapperTest類
- 測試controller第一種方式:參考UserControllerTest代碼 第二種方式參考UserControllerTest2
course18 課程18 Spring Boot 構建微服務實戰 -一分鐘配置一個Spring boot + Mybatis的微服務環境
- 參考代碼
course19 課程19 Spring Boot 服務的註冊和發現
- 這裏使用的註冊中心是zookeeper,使用的zookeeper客戶端是curator(詳細使用方法看course18和course19代碼)
- 服務註冊參考course18代碼的register包下的ServiceRegister類
course20 課程20 SpringBoot的部署與打包
- 打包mvn clean package
- 將jar包部署在服務器上
- java -jar jar包名
- mvn clean package dependency:copy-dependencies