Spring
Spring的两种依赖注入方式:setter方法注入与构造方法注入
Spring生命周期
BeanPostProcessor.postProcessBeforeInitialization
,BeanPostProcessorpostProcessAfterInitialization
相当于夹在InitializingBean
,init_method
两端使用- BeanFactory级Bean生命周期接口与Bean级生命周期接口的区别在于BeanFactory级Bean的方法用在所有bean上,每一个bean创立时都会调用该方法,而Bean级别是针对其中一个bean而写的。注意,他们的参数都是bean
- BeanFactoryPostProcessor:工厂后处理器。容器级接口,仅在应用上下文初始化时调用一次,其目的是完成一些配置文件的加工处理工作,属于ApplicationContext的Bean生命周期。
Spring http序列化与反序列化
定制化json序列化Converter
@Bean
public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() {
MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
ObjectMapper objectMapper = converter.getObjectMapper();
//可以setDateFormat设置时间序列化格式
objectMapper.setSerializationInclusion(Include.ALWAYS);
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
converter.setObjectMapper(objectMapper);
return converter;
}
后端服务而言大多数都是使用UTC时区,只是在序列化与反序列时,将时间按照用户的时区,转换到对应的时区时间。
一般而言,用户中心的用户信息中都会存有时区字段,我们可以在时间序列化器中添加用户登录信息,将时区字段添加到SimpleDateForma:sdf.setTimeZone(tz);
。
时间序列化器 StdDateFormat
自定义时间序列化器,需要extends StdDateFormat
。
最重要是重写下两个方法。重写两个方法,将时区字段添加到sdf中,最后方法再调用sdf.parse(dateStr, pos);
, sdf.format(date, toAppendTo, fieldPosition);
,我们只需要关注特制化,而不需要关心序列化本身。
//反序列化
public Date parse(String dateStr);
//序列化
public StringBuffer format(Date date, StringBuffer toAppendTo,
FieldPosition fieldPosition);
//SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX");返回全部的时间信息给前端,让前端自行选择。
我们经常在字段上添加注解@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
,来控制时间序列化格式与时区。但是假如添加了此注解,那么就不会走上文的全局自定义时间序列化器。假如时区敏感、用户信息中含有时区信息的系统,请勿使用@JsonFormat
,让所有的时间字段通过全局序列化器,否则会造成时区信息错误。