基础扫盲
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
- 实现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的使用
- 注入的时间,注解的构造器上,Set方法上,成员变量上
注释在构造器上,将bean注入到构造方法的参数,并执行构造器方法(推荐), 如果类只有一个构造器,那么可以省略@Autowired,但为了表义明确,仍然建议书写
注释在成员变量上(域变量上),在执行构造器方法后,将bean注入到成员变量
注解在setter方法或普通成员方法上,在执行构造器方法后,将bean注入方法的参数,并自动执行此方法 - 注入的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则可以做更精细的控制,例如参数是否必须,默认值等
- GET请求
使用@RequestParam对URL参数列表中的参数进行映射
使用@PathVariable对URL地址模板参数进行映射
public RestResponseEntity sendSMS(@RequestParam(“param1”) String param1)
- POST请求
使用@RequestParam对URL参数列表中的参数进行映射
使用@PathVariable对URL地址模板参数进行映射
使用@RequestBody对POST Body中的Json参数进行映射,建议映射为对象(便于参数校验),少量参数(<=3)且结合语义合理时,可不映射为对象,
public RestResponseEntity sendSMS(@RequestBody("param1") String param1, @RequestParam("param2") String param2)