[SpringBoot]SpringBoot詳細 原理加應用

SpringBoot-all

github

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中)

事件流程

  1. 自定義事件,一般是繼承ApplicationEvent抽象類

  2. 定義事件監聽器,一般是實現ApplicationListener接口

  3. 啓動事件,需要把監聽器加入到spring容器中

      1.添加事件監聽器app.addApplicationListener(new MyApplicationListener());
      2.使用@Component將事件監聽器加入到spring容器中
      3.通過全局配置的方式context.listener.classes=com.springboot.study.course5.listener.MyApplicationListener
      4.自定義事件處理器,類似於代碼中的MyEventHandle
    
  4. 發佈事件 app.publishEvent(new MyApplicationEvent(new Object()));

源碼分析

  1. DelegatingApplicationListener,查看這個類,閱讀源碼,配置方式的源碼
  2. EventListenerMethodProcessor,事件處理器方式源碼,其核心實現根據@EventListener來處理監聽事件

course7 課程7 Spring Boot 擴展分析ApplicationContextInitializer、CommandLineRunner、ApplicationRunner、ApplicationArguments

1.ApplicationContextInitializer 接口是在Spring容器執行refreshed之前的一個回調
使用步驟:

  1. 寫一個類,實現ApplicationContextInitializer接口
  2. 註冊ApplicationContextInitializer

註冊方法:

  1. ApplicationContextInitializer.addInitializers

  2. 通過配置文件配置:context.initializer.classes指定,需要指定多個請看course7代碼配置文件

  3. 通過METE/INF中的spring.factorties文件中指定(也可以註冊監聽器)

  4. CommandLineRunner是Spring容器啓動成功後的最後一步回調 (步驟參考ServerSuccessReport代碼)
    使用步驟

  5. 寫一個類實現CommandLineRunner接口

  6. 通過@Component將它交給容器管理

通過@Order(param)來控制多個CommandLineRunner實現類的執行順序,param參數數字最大,最早執行。
3. CommandLineRunner,ApplicationRunner區別:

  區別在於方法的參數不一樣
    CommandLineRunner的參數是最原始的參數,沒有做任何處理
    ApplicationRunner的參數是ApplicationArguments 是對原始參數進一步的封裝
  1. 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

  1. 在resources添加自己的banner.txt替換系統的banner
  2. 也可以關閉banner
  3. 支持圖片格式banner,支持jpg,png,gif
  4. 修改全局配置文件
    banner.location=my.txt
    banner.charset=GBK
    banner.image.location=my.jpg

course9 課程9 Spring Boot 運行流程分析

  1. 倆種方法創建SpringBoot啓動類
    第一種調用方式: SpringApplication app=new SpringApplication(Course7Application.class); app.run(args); 第二種調用方式: SpringApplication.run(Course7Application.class, args);
  2. 運行流程
    1. 判斷是不是Web環境
    2. 加載所有classpath下面的META-INF/spring.factorties ApplicationContextInitializer
    3. 加載所有classpath下面的META-INF/spring.factorties ApplicationListener
    4. 推斷main方法所在的類
    5. 開始執行run方法
    6. 設置java.awt.headless系統變量
    7. 加載所有classpath下面的META-INF/spring.factorties SpringApplicationRunnerListener
    8. 執行所有SpringApplicationRunnerListener的started方法
    9. 實例化ApplicationArguments對象
    10. 創建environment
    11. 配置environment,主要是把run方法的參數配置到environment中
    12. 執行所有SpringApplicationRunnerListener的environmentPrepared方法
    13. 如果不是web環境,但是是web的environment,則把這個web的environment轉換長標準的environment
    14. 打印banner
    15. 初始化applicationContext,如果是web環境,則實例化AnnotationConfigEmbeddedWebApplicationContext對象,否則實例化AnnotationConfigApplicationContext對象
    16. 如果beanNameGenerator不爲空,就把beanNameGenerator對象注入到applicationContext裏面去
    17. 回調所有的ApplicationContextInitializer方法
    18. 執行所有SpringApplicationRunnerListener的contextPrepared方法
    19. 依次往spring容器中注入:ApplicationArguments,Banner
    20. 加載所有的源到applicationContext裏面去
    21. 執行所有SpringApplicationRunnerListener的contextLoaded方法
    22. 執行applicationContext的refresh方法,並且調用applicationContext的registerShutdownHook方法
    23. 回調,獲取容器中所有的ApplicationRunner,CommandLineRunner接口,然後排序,依次調用
    24. 執行所有SpringApplicationRunnerListener的finished方法

course10 課程10 Spring Boot Web開發

  1. 快速開發一個接口(參照代碼)
  2. 修改默認端口號 修改配置文件server.port=8181
  3. @RequestParam默認參數必須提供,修改required可以不用提供值 @RequestParam(value = “name”,required = false,defaultValue = “huangsm”)
  4. @PathVariable獲得路徑中的值,參考代碼
  5. @RestController返回Json格式給前臺
  6. 整合JSP引入依賴tomcat-embed-jasper,配置spring.mvc.view.prefix=/WEB-INF/jsp/和spring.mvc.view.suffix=.jsp(詳情參考JspController)
  7. 整合freemarker,引入spring-boot-starter-freemarker,ftl頁面放在templates中(詳細看代碼,和配置文件)
  8. 配置訪問默認前綴 server.servlet.context-path=/huangsm,默認爲/
  9. 更換web容器,首先在spring-boot-starter-web排序spring-boot-starter-tomcat的依賴,在添加spring-boot-starter-jetty的依賴(這裏就不測試了)
  10. SpringBoot訪問靜態資源,可以將靜態資源放在src/main/webapp下,springboot中將它放入static中,可以通過freemarker訪問(詳細看代碼),也可以直接訪問
    #修改默認靜態頁面路徑
    spring.resources.static-locations=classpath:/META-INF/resources/,classpath:/resources/static/,classpath:/static/,classpath:/public
  11. 方式一:如何在SpringBoot中使用servlet,詳細查看UserServlet類,需要使用@WebServlet("/user.do")表明路徑,在啓動類中開啓對Servlet的掃描@ServletComponentScan
  12. 如何在SpringBoot中使用Filter,實現Filter接口,編寫自己的業務邏輯,通過@WebFilter註解添加過濾規則(詳細參考LogFilter代碼)
  13. 如何在SpringBoot中使用Listener,實現ServletContextListener接口,實現他的倆個方法,通過@WebListener註解啓動監聽器
  14. 方式二:用配置類來使用Servlet、Filter、Listener(使用詳細查看servlet包下代碼)
    1.編寫Servlet 2.裝配相應的bean到spring容器中 servlet ->ServletRegistrationBean filter ->FilterRegistrationBean listener ->ServletListenerRegistrationBean
  15. 如何在Springboot中使用攔截器(詳細步驟參考interceptor和config中的配置即可)1.寫一個攔截器實現HandlerInterceptor接口2.在WebMvc配置類中實現addInterceptors方法即可。
  16. 配置錯誤頁面跳轉,首先排除springboot自帶的錯誤處理頁面@SpringBootApplication(exclude = ErrorMvcAutoConfiguration.class),頁面跳轉處理邏輯參考exception包下的CommonErrorPageRegistry類
  17. 全局異常處理器(詳細代碼參考exception包下的GolbalExceptionHandler類)

course11 課程11 Spring Boot 定製和優化內嵌的Tomcat

  1. tomcat: 參數的使用 accesslog: enabled: true 開啓日誌 directory: G:\logs 存放日誌的底單 address: 192.168.12.60 規定只允許訪問的ip
  2. 編碼方式定製tomcat容器,詳情看tomcat包下TomcatCustomizer類

course12 課程12 Spring Boot JDBC --多種數據源的配置、JdbcTemplate、事務的處理

  1. 首先加入spring-boot-starter-jdbc依賴,然後Springboot自動裝配DataSource,在全局配置文件中配置即可,詳細參考(application.yml文件)
  2. SpringBoot會自動裝配jdbcTemplate,可以直接使用。詳細使用方式參考代碼(TestDao)
  3. spring.datasource.type可以指定具體使用哪種數據源,默認支持tomcat-jdbc,Hikari,dbcp,dbcp2,首先排除默認數據源,然後在引入對應的數據源依賴及可以使用
  4. 自定義配置DataSource,首先引入依賴,然後創建DataSource配置類,裝配一個數據源到spring容器中(詳細代碼參考DataSourceConfig代碼,注意在application.yml文件中指定DataSource的類型)
  5. Springboot中開啓事務,首先要使用@EnableTransactionManagement註解,啓用對事務的支持,然後加上@Transactional(rollbackFor = Exception.class)對全部一次都進行事務回滾,他只能標註在spring容器管理的公用方法纔會生效

course13 課程13 Spring Boot AOP(面向切面編程)

  1. 添加spring-boot-starter-aop依賴,默認就開啓了aop的支持,編寫一個切面類(詳細代碼參考aop包下的Log類),@EnableAspectJAutoProxy //啓用aop
  2. 是否啓用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的步驟

  1. 新建一個maven項目
  2. 需要一個配置類,配置類裏面需要裝配好需要提供出去的類
  3. (1)使用Enable,配合@Import註解使用 (2)或者/META-INF/spring.factories

course15 課程15 Spring Boot 日誌–演示瞭如何在Spring Boot裏面使用日誌配置,以及logback,log4j2等日誌的使用

  1. logging.level.*=debug 修改日誌信息級別 *可以是包也可以是類或者root
  2. 日誌級別有:TRACE,DEBUG,INFO,ERROR,WARN,FATAL,OFF OFF表示關閉日誌輸出
  3. logging.file=G:/logs/my.log 指定日誌文件路徑 logging.path=G:/logs制定日誌目錄(此時的日誌名字爲spring.log) 日誌文件輸出,文件大小10M之後就會分割了
  4. logging.pattern.console配置日誌在控制檯的輸出格式logging.pattern.file配置日誌在文件中的輸出格式
  5. 在classpath下放一個logback.xml,logback-spring.xml的文件,即可控制日誌文件的配置
  6. (1)使用其他日誌組件步驟,排除掉默認的日誌組件:spring-boot-starter-logging(2)加入新的日誌路徑依賴(3)把相應的配置文件放到classpath下

course16 課程16 Spring Boot 監控和度量 --Spring Boot內置的監控點、自定義的監控狀況檢查、自定義度量統計,輸出等等

  1. 添加spring-boot-starter-actuator依賴,並且在全局配置文件中開啓management.endpoints.web.exposure.include=*,訪問localhost:port/actuator就可以監控應用信息
  2. 可以在http://localhost:9000/actuator/info顯示配置文件中以info開頭的信息,會顯示git.properties中的信息
  3. SpringBoot2.0監控點詳情http://www.ityouknow.com/springboot/2018/02/06/spring-boot-actuator.html

course17 課程17 Spring Boot 測試 --實戰演示在Spring Boot裏面的測試案例,以及如何測試Controller

  1. Springboot測試步驟,直接在測試類上加如下倆個註解@RunWith(SpringRunner.class),@SpringBootTest
  2. 測試環境下配置配置類,通過@TestConfiguration,在測試類上的加上@SpringBootTest(classes = TestBeanConfig.class)就可以導入配置類中的bean
  3. Mock測試方式,詳細參考代碼UserMapperTest類
  4. 測試controller第一種方式:參考UserControllerTest代碼 第二種方式參考UserControllerTest2

course18 課程18 Spring Boot 構建微服務實戰 -一分鐘配置一個Spring boot + Mybatis的微服務環境

  1. 參考代碼

course19 課程19 Spring Boot 服務的註冊和發現

  1. 這裏使用的註冊中心是zookeeper,使用的zookeeper客戶端是curator(詳細使用方法看course18和course19代碼)
  2. 服務註冊參考course18代碼的register包下的ServiceRegister類

course20 課程20 SpringBoot的部署與打包

  1. 打包mvn clean package
  2. 將jar包部署在服務器上
  3. java -jar jar包名
  4. mvn clean package dependency:copy-dependencies
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章