1,@RequestBody 、 @ResponseBody
1,Http请求和响应报文本质上都是一串字符串。
2,java将报文封装成I/O流,从流中读取以及写入原始字符。
3,HttpMessageConverter(消息转换器)提供了转换。
(read方法)请求报文-->@RequestBody注解的对象
(write方法)@ResponseBody注解对象-->响应报文
4,spring提供了请求报文的抽象,HttpInputMessage(Represents an HTTP input message,consisting of headers and a readable body)
以及响应报文的抽象HttpOutputMessage(Represents an HTTP output message, consisting of headers and a writable body)
。
5,RequestResponseBodyMethodProcessor,处理@RequestBody注解的方法参数以及@ResponseBody方法注解的返回值。
6,HttpInputMessage和可以从servlet标准的HttpServletRequest构造,HttpOutputMessage可以从HttpServletResponse构造。
1)Request消息结构
POST /course/jzcf3e875d82d147449f3271219c0ad4b0/modifyInfo HTTP/1.1 //请求行
Host: www.shequnke.com //请求头
Connection: keep-alive
//空行
type=3&price=0.02 //请求体
2)Response消息结构
HTTP/1.1 200 OK //响应行
Server: nginx//响应头
Date: Wed, 17 May 2017 18:15:17 GMT
Content-Type: application/json;charset=UTF-8
Transfer-Encoding: chunked
Connection: keep-alive
//空行
{"uptoken":"123","success":true} //响应体
3)
使用@RequestBody,指定一个方法的参数绑定到一个web请求的body。
参数传递的时候,需要增加Content-type的请求头。
eg:设置 Header参数 Content-Type application/json
4)
Http协议中,如果不指定Content-Type,则默认传递的参数就是application/x-www-form-urlencoded类型
使用@RequestBody接受的参数是不会被Servlet转化统一放在request对象的Param参数集中,@RequestParam是可以的。
2,@bean @component
1)每个Spring Bean都有作用域,默认情况Spring应用上下文中的Bean都是单例对象,也就是说,无论给某个Bean被多少次装配给其他Bean,都是同一个实例,即Spring Bean默认的作用域为Singleton。
2)一个对象没有状态并且能够在应用中重复使用,就可以使用Singleton模式。
3)要对Bean的作用域进行配置,在使用@Component或@Bean标注的同时使用@Scope标注。
3,@Autowired和@Resource注解
1)@Autowired 根据bean 类型从spring 上线文中进行查找(
当一类型有多个bean实例时,配合@Qualifier使用
)
@Resource 允许通过bean 名称或bean 类型两种方式进行查找(name="",type=""
)。
2)@Autowired 标注作用于 Map 类型时,如果 Map 的 key 为 String 类型,Spring会将Value所有类型的Bean注入进来。key为bean的id或者name。
eg:
@Autowired
private Map<String, CollectWorker> collectWorkerMap0;//注入所有CollectWorker类型的对象。
3)@Autowired标注BeanFactory、ApplicationContext、ResourceLoader、ApplicationEventPublisher、MessageSource等,会自动注入这些实现类的实例。