Spring中11个最常用的扩展点,你知道几个?
2023-02-18 16:38:46 时间
前言
在使用spring的过程中,我们有没有发现它的扩展能力很强呢? 由于这个优势的存在,使得spring具有很强的包容性,所以很多第三方应用或者框架可以很容易的投入到spring的怀抱中。今天我们主要来学习Spring中很常用的11个扩展点,你用过几个呢?
1. 类型转换器
如果接口中接收参数的实体对象中,有一个字段类型为Date,但实际传递的参数是字符串类型:2022-12-15 10:20:15,该如何处理?
Spring提供了一个扩展点,类型转换器Type Converter
,具体分为3类:
Converter<S,T>
: 将类型 S 的对象转换为类型 T 的对象ConverterFactory<S, R>
: 将 S 类型对象转换为 R 类型或其子类对象GenericConverter
:它支持多种源和目标类型的转换,还提供了源和目标类型的上下文。 此上下文允许您根据注释或属性信息执行类型转换。
还是不明白的话,我们举个例子吧。
- 定义一个用户对象
@Data
public class User {
private Long id;
private String name;
private Date registerDate;
}
复制代码
- 实现
Converter
接口
public class DateConverter implements Converter<String, Date> {
private SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
@Override
public Date convert(String source) {
if (source != null && !"".equals(source)) {
try {
simpleDateFormat.parse(source);
} catch (ParseException e) {
e.printStackTrace();
}
}
return null;
}
}
复制代码
- 将新定义的类型转换器注入到Spring容器中
@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {
@Override
public void addFormatters(FormatterRegistry registry) {
registry.addConverter(new DateConverter());
}
}
复制代码
- 调用接口测试
@RequestMapping("/user")
@RestController
public class UserController {
@RequestMapping("/save")
public String save(@RequestBody User user) {
return "success";
}
}
复制代码
请求接口时,前端传入的日期字符串,会自动转换成Date类型。
2. 获取容器Bean
在我们日常开发中,经常需要从Spring容器中获取bean,但是你知道如何获取Spring容器对象吗?
2.1 BeanFactoryAware
@Service
public class PersonService implements BeanFactoryAware {
private BeanFactory beanFactory;
@Override
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
this.beanFactory = beanFactory;
}
public void add() {
Person person = (Person) beanFactory.getBean("person");
}
}
复制代码
实现BeanFactoryAware接口,然后重写setBeanFactory方法,可以从方法中获取spring容器对象。
2.2 ApplicationContextAware
@Service
public class PersonService2 implements ApplicationContextAware {
private ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
public void add() {
Person person = (Person) applicationContext.getBean("person");
}
}
复制代码
实现ApplicationContextAware
接口,然后重写setApplicationContext
方法,也可以通过该方法获取spring容器对象。
2.3 ApplicationListener
@Service
public class PersonService3 implements ApplicationListener<ContextRefreshedEvent> {
private ApplicationContext applicationContext;
@Override
public void onApplicationEvent(ContextRefreshedEvent event) {
applicationContext = event.getApplicationContext();
}
public void add() {
Person person = (Person) applicationContext.getBean("person");
}
}
复制代码
3. 全局异常处理
以往我们在开发界面的时候,如果出现异常,要给用户更友好的提示,例如:
@RequestMapping("/test")
@RestController
public class TestController {
@GetMapping("/add")
public String add() {
int a = 10 / 0;
return "su";
}
}
相关文章
- Kerberos 身份验证在 ChunJun 中的落地实践
- 如何解决前端常见的竞态问题
- Intel Sapphire Rapids CPU,吹响反攻DPU的号角
- idea 安装最新版本的时候,启动失败
- 什么?你还不会webshell免杀?(十)
- spring cloud系列教程第七篇-服务提供者集群环境搭建及负载均衡配置
- 采用java8 lambda表达式 实现 java list 交集 并集 差集 去重复并集
- 一个lock锁就可以分出低中高水平的程序员对问题的处置方式
- 5分钟了解系统架构设计(2)
- 深入理解函数式编程(上)
- Eolink神技之三、钉钉API对接
- 深入理解函数式编程(下)
- Centos7下Frp服务端后台运行以及开机自启(Frp客户端同理)
- 第十四届蓝桥杯集训——JavaC组第十二篇——while循环(循环四要素)
- 循环复杂度
- 检索式对话系统在美团客服场景的探索与实践
- 第十四届蓝桥杯集训——JavaC组第十三篇——for循环
- 数据自动录入并生成报表神器怎么玩?
- 美团高性能终端实时日志系统建设实践
- 京东,再一次选择了逆向奔赴