Spring、Springmvc、Spring boot 相關筆記整理

基礎掃盲

       Beans(這裏特指Spring Beans):由Spring IoC Container管理的的對象,IoC Container負責對象的實例化和裝載,Beans本身和Bean與Bean之間的依賴關係,由IoC容器的配置元數據來描述 ;Spring beans支持管理的對象,需要有構造方法,但不一定要滿足JavaBean規範,也就是不是一定需要set、get方法;
       IoC容器:通過配置元數據來負責Beans的實例化(instantiating), 配置(configuring)和裝載,配置元數據可通過xml,grovvy文件(傳統方式),註解(推薦),或Java代碼提供 ;

       IOC : 控制反轉
       DI : 依賴注入
       基於構造器的DI constructor-based(推薦必須依賴,可保證初始化狀態,注入後不可改變,代碼可讀性不佳)
       基於Set方法的DI setter-based DI(推薦用於可選依賴,可重複注入)

       通過依賴(實例與實例之前的依賴)注入的方式實現控制反轉

https://docs.spring.io/spring/docs/current/spring-framework-reference/

       aspectj 面向切面編程

       auto-configuration、starters、cli、actuator

Spring Beans

Beans的註冊和命名(名稱作爲注入時的選擇bean的依據)
## xml方式定義一個id多個name,甚至起一個別名  
<bean id="aa" name="bean1;alias01;alias02;alias03" class="com.cetiti.HelloImpl"></bean>    
<alias name="bean3" alias="alias21"/>

       xml形式定義

xml中的beanid
 
  class, Bean的本質是一個class,因爲必須有這個屬性    
  id  id需要唯一,如無id定義,則以第一個name爲id
  name name可以有多個, 如無id定義,則以第一個name爲id,其他name爲真正的name
  如果id和name均無定義,如無顯式定義,則全限定類名#編號爲id
  
  如果以上流程最終name爲空,則name爲空,且不會自動添加
  
  最終bean name爲xml的bean id

       註解形式定義

  由AnnotationBeanNameGenerator對象決定    
  內部規則爲  
    如果@Controller @Service @Repository @Component定義的Bean,則由Bean的value屬性作爲bean name  
    如果是由其他註解定義,則根據class全名及生成規則生成

https://blog.csdn.net/a_842297171/article/details/79756077

Beans的實例化

       反射模式,構造器(在xml中配置類的全名)
       靜態工廠(工廠方法模式, Static Factory Method), 通常用於單例

# XML方式, 處理給出類名,還應給出工廠方法
<bean id="stage" class="com.cetiti.staticfactory.Stage" factory-method="getInstance"></bean>

       實例工廠(Instance Factory Method, FactoryBean模式)

<bean id="bean" factory-bean="factorybean" factory-method="getBean"></bean> 
特殊bean
  1. 實現BeanPostProcessor接口的bean(spring-shiro框架使用此方法將filter加入)

       內部包含兩個接口,作用域爲IoC容器,會在所有bean的初始化階段調用
       postProcessBeforeInitialization
       postProcessAfterInitialization

https://blog.csdn.net/w_linux/article/details/80063062

Aware通知接口

       實現通知的接口的bean可以在適當的時機得到其它組件的通知(其實也是回調),並可以在通知中存儲對應的數據接口的能力,例如

BeanNameAware  得到beanname
ServletContextAware 得到Servlet  
EnvironmentAware    得到服務器環境

1、 Spring Framework(IoC Container and BeanFactory)

IoC container(實現org.springframework.context.ApplicationContext接口)
在Spring內部Beans的元數據以BeanDefinition數據結構存儲

1.1、 Bean的元數據(BeanDefinition, 描述Bean實例)

  • 通過xml配置
  • 通過annotation配置
  • 無元數據定義, 直接通過BeanFactory生產

1.2、 Bean的註冊和存儲(xxxRegistry, 存儲BeanDefinition)

|-AliasRegistry
|-SimpleAliasRegistry(實現)
|-BeanDefinitionRegistry
|-SingletonBeanRegistry
|-DefaultSingletonBeanRegistry(實現)
|-AnnotationConfigRegistry

1.3、 Bean的實例化與依賴注入(BeanFactory&註解解析)

  • 通過annotation注入
    • 業務代碼中的annotation
    • spring-boot autoconfigure 配置文件注入
  • bean生產時直接實例化並注入

1.4、 IoC容器接口定義

BeanFactory
|-HierarchicalBeanFactory
  |-ApplicationContext(spring-context) 規範id、applicationName、displayName、startupDate、parent 等IoC容器的描述性屬性的get方法
    |-ConfigurableApplicationContext (spring-context) [增加容納bean的能力] 規範描述性屬性的set方法,增加environment屬性的set、get方法,增加refresh方法(從持久化存儲加載或刷新配置)、BeanFactory、BeanFactoryPostProcessor、ApplicationListene、ProtocolResolver、ShutdownHook
      |-ConfigurableWebApplicationContext 增加ServletContext set方法 和 ServletConfig、namespace、configLocations的get、set方法
    |-WebApplicationContext (spring-web) [Servlet能力] 增加ServletContext的get方法        
      |-ConfigurableWebApplicationContext 增加servletContext、namespace及configLocations讀寫接口
## 通常使用  
ConfigurableApplicationContext     非Web項目
ConfigurableWebApplicationContext  Web項目

常用IoC容器的實現

|-AbstractApplicationContext(ConfigurableApplicationContext)
  |-AbstractRefreshableApplicationContext(spring-context)
    |-AbstractRefreshableConfigApplicationContext(spring-context)
      |-AbstractXmlApplicationContext(spring-context)
        |-ClassPathXmlApplicationContext(spring-context)   (通過Classpath中的xml文件實例化IoC容器)  
        |-FileSystemXmlApplicationContext(spring-context)  (通過文件系統中的xml文件實例化IoC容器)    
      |-AbstractRefreshableWebApplicationContext(spring-web)
        |-XmlWebApplicationContext(spring-web) 
        |-AnnotationConfigWebApplicationContext(spring-web)  
        |-AnnotationConfigServletWebServerApplicationContext(spring-web 5+)
  |-GenericApplicationContext(spring-context)
    |-GenericGroovyApplicationContext(spring-context)
    |-AnnotationConfigApplicationContext(spring-context)             (Springboot常規應用默認使用) DEFAULT_CONTEXT_CLASS
    |-GenericWebApplicationContext(spring-web)
      |-EmbeddedWebApplicationContext(spring-boot)
        |-AnnotationConfigEmbeddedWebApplicationContext(spring-boot) (SpringbootWeb應用默認使用)  DEFAULT_WEB_CONTEXT_CLASS
        |-XmlEmbeddedWebApplicationContext(spring-boot)

https://blog.csdn.net/dm_vincent/article/details/77619780

1.4.1、IoC容器的初始化

IoC容器可由ApplicationContextInitializer進行初始化,一個容器可以使用多個初始化器在多個不同的角度進行初始化

ApplicationContextInitializer(spring-context 接口)
|-ParentContextApplicationContextInitializer(spring-boot)
|-ServerPortInfoApplicationContextInitializer(spring-boot)
|-DelegatingApplicationContextInitializer(spring-boot)
|-ContextIdApplicationContextInitializer(spring-boot)
|-ConfigurationWarningsApplicationContextInitializer(spring-boot)

1.4.2、IoC容器的監聽器

ApplicationListener(spring-context 接口)
|-

1.5、Bean的生命週期

obtainFreshBeanFactory
prepareBeanFactory
postProcessBeanFactory
invokeBeanFactoryPostProcessors
registerBeanPostProcessors

BeanDefinitionRegistryPostProcessor
BeanFactoryPostProcessor

總結如下:

  • 實例化
  • 設置屬性值
  • 檢查Aware相關接口並設置相關依賴
  • BeanPostProcessor前置處理 //調用BeanPostProcessor的預初始化方法
  • 檢查是否實現InitializingBean接口,以確定是否調用afterPropertiesSet方法
  • 檢查是否有配置自定義的init-method
  • BeanPostProcessor後置處理
  • 註冊必要的Destruction相關回調接口
  • -----使用----
  • 是否實現DisposableBean接口,若有,則執行destroy方法
  • 是否配置有自定義的destroy方法,有則調用配置文件中用destroy-method定義的方法

1.6、Spring的擴展機制SpringFactory (spring-core)

參考Service Provider Interface(SPI, Java的擴展機制)實現
SpringFactory(Spring的擴展機制)
SpringFactoriesLoader,檢索META-INF/spring.factories文件,並獲取指定接口的配置的功能

http://baijiahao.baidu.com/s?id=1596142370737680470&wfr=spider&for=pc

2、Spring WebMVC(MVC:DispatcherServlet and ViewResolver)

2.1、Controller層

1、DispatcherServlet前端控制器接收發過來的請求,交給HandlerMapping處理器映射器 doDispatch方法實現核心邏輯
2、HandlerMapping處理器映射器,根據請求路徑找到相應的HandlerAdapter處理器適配器(處理器適配器就是那些攔截器或Controller)

## 遍歷所有bean,如果bean實現帶有註解@Controller或者@RequestMapping 則進一步調用detectHandlerMethods處理,處理邏輯大致就是根據@RequestMapping配置的信息,構建RequestMappingInfo,然後註冊到MappingRegistry中
## 最重要的**HandlerMapping**
RequestMappingHandlerMapping (spring-webmvc)
註解形式定義的映射處理器
BeanNameUrlHandlerMapping    (spring-webmvc)
使用beanname作爲url映射參數的映射處理器(通常用於xml文件中定義bean)
SimpleUrlHandlerMapping      (spring-webmvc)
在SimpleUrlHandlerMapping實現bean的屬性中直接定義url與Controller bean的映射規則
EndpointHandlerMapping.getHandle
EndpointHandlerMapping       (spring-boot-actuator)
固定映射actuator地址到spring actuator
ZuulHandlerMapping           (spring-cloud-netflix-core)
映射全體url到ZuulController

由Request映射到具體的Controller中的處理方法,具體的處理方法爲Object handler  

3、HandlerAdapter處理器適配器,處理一些功能請求,返回一個ModelAndView對象(包括模型數據、邏輯視圖名)

HandlerAdapter(定義supports方法和handle方法)
|-AbstractHandlerMethodAdapter(進行了部分實現,比如檢查是否是HandleMethod方法,提供supportsInternal及handleInternal方法)
  |-RequestMappingHandlerMadapter (封裝invokeHandlerMethod方法,setHandlerMethodArgumentResolvers) 內部調用HandlerMethodArgumentResolver處理方法 並處理MessageConverter

2.2、View層

1、ViewResolver視圖解析器,先根據ModelAndView中設置的View解析具體視圖

2.3、Model層

1、然後再將Model模型中的數據渲染到View上

內置Controller

|-ErrorController(interface spring-boot-autoconfigure)  
  |-AbstractErrorController(spring-boot-autoconfigure)
    |-BasicErrorController(spring-boot-autoconfigure spring內置的默認RrrorController)  默認掛載到/error路徑下    
|-Controller(interface spring-webmvc定義了一個返回ModelAndView的handleRequest)
  |-AbstractController(spring-webmvc) 擴展WebContentGenerator能力,實現handleRequest支持web請求緩存,定義了handleRequestInternal抽象結構
    |-ServletWrappingController(spring-webmvc)   將當前應用中的某個Servlet直接包裝爲一個Controller, 請求實際上是由它內部所包裝的這個Servlet來處理的,不是真正的http協議轉發,內部實現是直接調用了另外一個servlet的.service函數
      |-ZuulController 簡單的將serlvet固定包裝爲使用ZuulServlet來處理
    |-ServletForwardingController(spring-webmvc) 將所有的HTTP請求轉發給一個在web.xml中定義的Servlet,是真的轉發一個http請求,內部使用RequestDispatcher進行請求派遣

https://www.cnblogs.com/hujiapeng/p/5765636.html

3、Spring Boot(CoC: SpringApplication and Autoconfigure)

3.1、 什麼是SpringApplication

Springboot本質上是SpringApplication應用對象的啓動, Boot啓動的就是SpringApplication,其主要使用

  • SpringFramework內核(spring-context+spring-core)IoC Container的Bean管理能力(控制反轉的體現)
  • Spring WebMVC中DispatcherServlet對Servlet的一系列處理能力(MVC設計模式的體現)
  • SpringBoot(spring-boot-autoconfigure)對環境和依賴自動發現和配置能力(約定優於配置的體現)

3.2、如何創建SpringApplication

  • 使用構造器創建(推薦)
    SpringApplicationBuilder
  • 靜態方法運行時自動創建
    SpringApplication.run()
  • 使用new方法創建
    new SpringApplication()

3.3、如何啓動SpringApplication

SpringBootServletInitializer(實現WebApplicationInitializer接口) 傳統WAR包方式運行SpringApplication
SpringApplicationBuilder.run

3.4、監聽器

SpringApplicationRunListener

3.5 大量註解的含義

組合註解 composed-annotations(被多個元註解註解形成的註解)
元註解 meta-annotations(用於註解其他註解的註解)
模式註解 stereotype-annotations(在整個結構設計中,用於特定模式(功能)的註解,註解本身可以認爲是一種語義化註解,但這種語義化可能在某個架構層面被實現)

https://www.merriam-webster.com/dictionary/stereotype stereotye取第二個名詞意思,直譯爲固定的形式,我認爲這裏可以翻譯成模式

stereotype noun
Definition of stereotype (Entry 2 of 2)
1 : a plate cast from a printing surface
2 : something conforming to a fixed or general pattern
especially : a standardized mental picture that is held in common by members of a group and that represents an oversimplified opinion, prejudiced attitude, or uncritical judgment
## 註冊class爲bean, 針對受控代碼,可以在代碼級別加註解
@ComponentScan (spring-context) 
  作用: ComponentScan使得以@Component註解的class被註冊爲bean,使得ApplicationContext實例化的時候,無需在構造函數顯示指明配置文件或類,但掃描的到的bean無法在xml中定義bean的依賴,但可在代碼中藉助註解定義依賴
  解析類: ConfigurationClassParser.doProcessConfigurationClass ConfigurationWarningsApplicationContextInitializer.addComponentScanningPackages
  生產類: 無
  注入點: 無
@Component (spring-context)     註冊類爲bean(隱式定義,通過ComponentScan方式自動識別):使得此bean被spring ioc容器管理,不推薦直接使用,自動掃描是提供@bean註解支持
  @TestComponent(spring-boot-test)  只在單元測試有才有效的bean
    @TestConfiguration(spring-boot-test)
  @Controller (spring-context)  內部@bean爲lite mode,lite mode的bean只支持對象創建,不支持依賴管理,所以通常@bean註解建議放在@Configuration註解內部
    spring-webmvc賦予語義 
    作用: 配合spring-webmvc的DispatcherServlet使用, 原理:RequestMappingHandlerMapping.afterPropertiesSet.initHandlerMethods.detectHandlerMethods方法將其註冊到mappingRegistry  
    註解定義: spring-context
    語義賦予: spring-webmvc: RequestMappingHandlerMapping
    Bean生產: SpringBean:  Bean的類, Bean名稱, 實例化時機, 注入方式: 語義賦予類直接實例化並注入
  @Service (spring-context)   內部@bean爲lite mode
    spring-webmvc賦予語義
  @Repository (spring-context) 內部@bean爲lite mode
    spring-webmvc賦予語義
  @Configuration (spring-context)   內部@bean爲full mode
    spring-context自身賦予語義 用於表示對象作爲bean definitions源碼,也就是xml中的<bean/>部分,@bean註解的顯式形式需要@Configuration註解配合    
    @SpringBootConfiguration (spring-boot)   
## 註冊方法範圍值爲bean(需要先通過以class註冊的bean找到對應的方法),針對非受控代碼,不可以修改源碼,通常出現在spring第三方配置
@Bean(spring-context)           註冊方法的返回值爲bean(顯式定義):使得此bean被spring ioc容器管理,因爲@Configuration註解內部的@bean纔是full mode,一般應放在@Configuration內部,@Bean用於註冊確定的類,可以相當於@bean註解的是bean的構造方法,屬於利用工廠模式來定義一個bean 
@Import(spring-context)         引入其他Configuration  
  直接引入:以class方式在一個@Configuration(spring-context 3.0)中引入其他bean definitions源碼
  條件引入:ImportSelector(spring-context 3.1),實現ImportSelector接口,通常通常判斷另外一個註解的值,其返回值爲Configuration類名的字符串數據
  條件引入不確定的類:ImportBeanDefinitionRegistrar(spring-context 3.1) ,一般用於第三方包,使用registerBeanDefinitions接口利用bean註冊接口註冊bean,最爲靈活
  導入普通類(4.2+)
  @EnableAsync(spring-context) = @Import(AsyncConfigurationSelector.class)  (ImportSelector類型)
  @EnableBatchProcessing(spring-batch-core) = @Import({BatchConfigurationSelector.class})  (ImportSelector類型)
  @EnableScheduling(spring-context) = @Import(SchedulingConfiguration.class)       (@Configuration類型)
  @EnableCaching(spring-context) = @Import(CachingConfigurationSelector.class)     (ImportSelector類型)
  @EnableMBeanExport(spring-context) =  @Import(MBeanExportConfiguration.class)    (@Configuration類型)
  @EnableWebMvc(spring-webmvc) = @Import(DelegatingWebMvcConfiguration.class)      (@Configuration類型)
  @EnableConfigurationProperties(spring-boot)  = @Import(EnableConfigurationPropertiesImportSelector.class)  (ImportSelector類型)  bean的值與prioerties文件綁定 支持@ConfigurationProperties註解
  @ServletComponentScan(spring-boot) = @Import(ServletComponentScanRegistrar.class)  (ImportBeanDefinitionRegistrar類型)
  @AutoConfigurationPackage(spring-boot-autoconfigure) = @Import(AutoConfigurationPackages.Registrar.class)  (ImportBeanDefinitionRegistrar類型)
  @ImportAutoConfiguration(spring-boot-autoconfigure) = @Import(ImportAutoConfigurationImportSelector.class) (ImportSelector類型)
  @EnableAutoConfiguration(spring-boot-autoconfigure) = @Import(EnableAutoConfigurationImportSelector.class) (ImportSelector類型) + @AutoConfigurationPackage
    通過讀取classpath下的lib/*.jar/META-INF/spring.factories文件的org.springframework.boot.autoconfigure.EnableAutoConfiguration屬性註冊bean,並通過spring-autoconfigure-metadata.properties獲得自動配置規則
  @EnableDiscoveryClient(spring-cloud-commons) = @Import(EnableDiscoveryClientImportSelector.class) 使能自動服務發現機制,根據classpath決定使用eureka、consul、zookeeper中的一種
@ImportResource(spring-context) 以資源文件方式(xml,grovvy)在一個@Configuration中引入其他bean definitions源碼

## spring-boot-autoconfigure 自動配置的一些條件及依賴關係(由EnableAutoConfiguration註冊的bean支持)
#### 條件關係
@Conditional(spring-context)  滿足特定條件時纔會註冊,class文件爲實現Condition接口的類,類內的match函數實現匹配條件
  @Profile(spring-context) = @Conditional(ProfileCondition.class) bean的默寫值被設置爲特定的值
  @ConditionalOnBean(spring-boot-autoconfigure) = @Conditional(OnBeanCondition.class)   判斷指定bean是否存在再加載
  @ConditionalOnMissingBean(spring-boot-autoconfigure) = @Conditional(OnBeanCondition.class) 上一條的反面
  @ConditionalOnProperty(spring-boot-autoconfigure) = @Conditional(OnPropertyCondition.class) 判斷環境屬性來決定指定bean是否加載
  @ConditionalOnClass(spring-boot-autoconfigure) = @Conditional(OnClassCondition.class) 
  @ConditionalOnWebApplication(spring-boot-autoconfigure) = @Conditional(OnWebApplicationCondition.class)
#### 順序關係
@Order(spring-core)     指明類註冊時的優先級,會在加載bean definitions列表後,先根據優先級排序,在依次註冊,效果可體現在@Configration類的加載順序,@Autowired註解與Set時的內部bean順序
@AutoConfigureOrder(spring-boot-autoconfigure)  autoconfigure時@AutoConfigureOrder的優先級高於@Order
@AutoConfigureBefore(spring-boot-autoconfigure) 保證bean在其它bean之前註冊
@AutoConfigureAfter(spring-boot-autoconfigure) 保證bean在其它bean之後註冊  
#### bean的值
@ConfigurationProperties(spring-boot)   bean的值與prioerties文件綁定
@Value(spring-beans)     自動加載properties配置文件, 設置默認值
@Role(spring-context)

@Async(spring-context)
@Aspect (AspectJ)
#### 使用bean,依賴注入相關,用來裝配bean
@Resource(JSR-250.javax) 語義化註解,spring賦予新含義,用於變量的實例注入, 默認按byName自動注入,既注入的成員變量的名稱與bean name一致
@Autowired 用於變量的實例注入, 默認按byType自動注入,及注入的成員變量的類型與bean的class一致,建議按byType注入
@Qualifier 與@Autowired配合使用,當@Autowired的類型包含多個bean實現的時候,用於限定要注入的bean的名稱  
@WebServlet(javax servlet3.0+)  Servlet理解與聲明週期 https://git.d.com/liuzhaoqi/doc/blob/master/後端設計與框架/網絡編程.md
@WebListener(javax servlet3.0+)
@WebFilter(javax servlet3.0+)
@PostConstruct 注入的執行流程 Constructor(對象自身的構造) >> @Autowired(自動注入的成員變量的實例化) >> @PostConstruct(注入後要進行的操作) => InitializingBean(afterPropertiesSet方法) => xml中bean中的bean-init屬性定義的方法 & @bean中的initMethod屬性
@PreDestroy  @PreDestroy--DisposableBean(destroy方法)-->xml中bean中的destroy-method屬性定義的方法 & @bean中的destoryMethod屬性

## spring-web 請求分發處理相關注解
@RestController (【簡寫形式】spring-web 4.0+ 相當於@ResponseBody + @Controller兩個註解)      
@Mapping(spring-web)
  @RequestMapping(spring-web)   
    @GetMapping、@PutMapping、@PostMapping、@PutMapping、@DeleteMapping、@PatchMapping= @RequestMapping(method = RequestMethod.PUT)...
    detectHandlerMethods方法內部根據@RequestMapping生成RequestMappingInfo實例 通過registerHandlerMethod方法註冊到HandlerMethod實例,請求處理是根據HandlerMethod派發
    RequestMapping註解的函數應返回ModelAndView對象,並交由視圖解析器解析渲染,但如果同時使用了@ResponseBody,則返回對象直接寫入HttpServletResponse,跳過MVC的View層
@ResponseBody (spring-web) 見@RequestMapping註解  
@RequestBody (spring-web) 作用於參數,將http body自動轉換爲方法中的參數對象
@RequestParam (spring-web) 作用於參數,將http請求函數注入到函數參數
@RequestHeader (spring-web) 作用於參數,將http請求頭注入到函數參數  
@ControllerAdvice (spring-web)
@RestControllerAdvice (spring-web) (@ControllerAdvice+@ResponseBody)
@ExceptionHandler(spring-web) 

@EnableWebMvc
  注入類: RequestMappingHandlerMapping(使用與純SpringMVC)

## spring-boot 約定優於配置相關配置註解
@SpringBootApplication (【簡寫形式】spring-boot-autoconfigure 相當於@SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan三個註解)   
#### 自動配置相關
@ConfigurationProperties  

## 數據校驗  
@AssertTrue

## spring-cloud
@EnableEurekaClient(spring-cloud-netfix-eureka-client), 通過spring.factories中的EnableAutoConfiguration註冊bean,並以EnableEurekaClient作爲client的啓動開關  明確使用eureka做爲服務發現機制

## lombok
@Slf4j (org.projectlombok.lombok) 
@Data ()

## Mybatis  見Mybatis.md

## Swagger  
@Api
@ApiOperation 
@ApiImplicitParams
@ApiImplicitParam

## JUnit
@RunWith 定義實現JUnit Runner接口的一個實現,進行單元測試時,使用此實現代替Junit默認實現來啓動測試用例
  @RunWith(SpringRunner.class)   @RunWith(SpringJUnit4ClassRunner) SpringRunner是SpringJUnit4ClassRunner的別名,建議使用前者,SpringRunner內部會加載spring上下文
@SpringBootTest 提供spring 容器等環境的配置支持

3.5.1、 @autowired的使用

  1. 注入的時間,註解的構造器上,Set方法上,成員變量上
    註釋在構造器上,將bean注入到構造方法的參數,並執行構造器方法(推薦), 如果類只有一個構造器,那麼可以省略@Autowired,但爲了表義明確,仍然建議書寫
    註釋在成員變量上(域變量上),在執行構造器方法後,將bean注入到成員變量
    註解在setter方法或普通成員方法上,在執行構造器方法後,將bean注入方法的參數,並自動執行此方法
  2. 注入的bean範圍,註解在數據上,註解在Set或Map上

https://www.jianshu.com/p/ee456139f949

3.6、 其他工具

配置自動刷新

開發者工具
spring-boot-devtools(支持配置刷新)

監視管理結接口
spring-boot-starter-actuator

3.7、 異常處理的方法

https://www.cnblogs.com/pangguoming/p/8426776.html

4、其它web框架

Vertx 異步框架 基於netty
Jersey
JFinal(國內開發的框架,功能和集成度較高,但完善度有待提升)

5、Spring框架的參數映射

Controller 參數不加 @RequestParam 參數會自動加一個默認的@RequestParam 是的參數名與映射名相同,顯示使用@RequestParam則可以做更精細的控制,例如參數是否必須,默認值等

  1. GET請求

使用@RequestParam對URL參數列表中的參數進行映射
使用@PathVariable對URL地址模板參數進行映射
public RestResponseEntity sendSMS(@RequestParam(“param1”) String param1)

  1. POST請求

使用@RequestParam對URL參數列表中的參數進行映射
使用@PathVariable對URL地址模板參數進行映射
使用@RequestBody對POST Body中的Json參數進行映射,建議映射爲對象(便於參數校驗),少量參數(<=3)且結合語義合理時,可不映射爲對象,

public RestResponseEntity sendSMS(@RequestBody("param1") String param1, @RequestParam("param2") String param2) 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章