Spring中11个最常用的扩展点,你知道几个?

简介: 在使用spring的过程中,我们有没有发现它的扩展能力很强呢? 由于这个优势的存在,使得spring具有很强的包容性,所以很多第三方应用或者框架可以很容易的投入到spring的怀抱中。今天我们主要来学习Spring中很常用的11个扩展点,你用过几个呢?

前言
在使用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类型。

  1. 获取容器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 {

private ApplicationContext applicationContext;
@Override
public void onApplicationEvent(ContextRefreshedEvent event) {
    applicationContext = event.getApplicationContext();
}

public void add() {
    Person person = (Person) applicationContext.getBean("person");
}

}
复制代码

  1. 全局异常处理

以往我们在开发界面的时候,如果出现异常,要给用户更友好的提示,例如:
@RequestMapping("/test")
@RestController
public class TestController {

@GetMapping("/add")
public String add() {
    int a = 10 / 0;
    return "su";
}

}

相关文章
|
6月前
|
前端开发 Java 开发者
Spring MVC:构建高效、可维护、可扩展的Web应用程序
Spring MVC:构建高效、可维护、可扩展的Web应用程序
51 0
|
JSON Java 数据格式
三万字盘点Spring/Boot的那些常用扩展点(下)
Spring对于每个Java后端程序员来说肯定不陌生,日常开发和面试必备的。本文就来盘点Spring/SpringBoot常见的扩展点,同时也来看看常见的开源框架是如何基于这些扩展点跟Spring/SpringBoot整合的。 话不多说,直接进入正题。
|
6月前
|
SQL Java 数据库
Spring Authorization Server 1.1 扩展实现 OAuth2 密码模式与 Spring Cloud 的整合实战(上)
Spring Authorization Server 1.1 扩展实现 OAuth2 密码模式与 Spring Cloud 的整合实战(上)
|
5月前
|
监控 Java 应用服务中间件
Spring Boot应用的部署与扩展
Spring Boot应用的部署与扩展
|
4月前
|
监控 Java 应用服务中间件
Spring Boot应用的部署与扩展
Spring Boot应用的部署与扩展
|
5月前
|
存储 Java Apache
整合Spring Boot和Pulsar实现可扩展的消息处理
整合Spring Boot和Pulsar实现可扩展的消息处理
|
6月前
|
安全 前端开发 Java
Spring Authorization Server 1.1 扩展实现 OAuth2 密码模式与 Spring Cloud 的整合实战(下)
Spring Authorization Server 1.1 扩展实现 OAuth2 密码模式与 Spring Cloud 的整合实战(下)
|
6月前
|
负载均衡 网络协议 Java
构建高效可扩展的微服务架构:利用Spring Cloud实现服务发现与负载均衡
本文将探讨如何利用Spring Cloud技术实现微服务架构中的服务发现与负载均衡,通过注册中心来管理服务的注册与发现,并通过负载均衡策略实现请求的分发,从而构建高效可扩展的微服务系统。
|
6月前
|
XML 存储 缓存
Spring缓存是如何实现的?如何扩展使其支持过期删除功能?
总之,Spring的缓存抽象提供了一种方便的方式来实现缓存功能,并且可以与各种缓存提供商集成以支持不同的过期策略。您可以根据项目的具体需求选择适合的方式来配置和扩展Spring缓存功能。
55 0