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) 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值