0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

剖析Spring中最常用的扩展点(上)

jf_78858299 来源:苏三说技术 作者:苏三说技术 2023-02-15 16:06 次阅读

我们一说到spring,可能第一个想到的是 IOC(控制反转) 和 AOP(面向切面编程)。

没错,它们是spring的基石,得益于它们的优秀设计,使得spring能够从众多优秀框架中脱颖而出。

除此之外,我们在使用spring的过程中,有没有发现它的扩展能力非常强。由于这个优势的存在,让spring拥有强大的包容能力,让很多第三方应用能够轻松投入spring的怀抱。比如:rocketmq、mybatis、redis等。

今天跟大家一起聊聊,在Spring中最常用的11个扩展点。图片

1.自定义拦截器

spring mvc拦截器根spring拦截器相比,它里面能够获取HttpServletRequestHttpServletResponse等web对象实例。

spring mvc拦截器的顶层接口是:HandlerInterceptor,包含三个方法:

  • preHandle 目标方法执行前执行
  • postHandle 目标方法执行后执行
  • afterCompletion 请求完成时执行

为了方便我们一般情况会用HandlerInterceptor接口的实现类HandlerInterceptorAdapter类。

假如有权限认证、日志、统计的场景,可以使用该拦截器。

第一步,继承HandlerInterceptorAdapter类定义拦截器:

public class AuthInterceptor extends HandlerInterceptorAdapter {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        String requestUrl = request.getRequestURI();
        if (checkAuth(requestUrl)) {
            return true;
        }

        return false;
    }

    private boolean checkAuth(String requestUrl) {
        System.out.println("===权限校验===");
        return true;
    }
}

第二步,将该拦截器注册到spring容器:

@Configuration
public class WebAuthConfig extends WebMvcConfigurerAdapter {
 
    @Bean
    public AuthInterceptor getAuthInterceptor() {
        return new AuthInterceptor();
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new AuthInterceptor());
    }
}

第三步,在请求接口时spring mvc通过该拦截器,能够自动拦截该接口,并且校验权限。

2.获取Spring容器对象

在我们日常开发中,经常需要从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 "成功";
    }
}

如果不做任何处理请求add接口结果直接报错:

图片

what?用户能直接看到错误信息

这种交互方式给用户的体验非常差,为了解决这个问题,我们通常会在接口中捕获异常:

@GetMapping("/add")
public String add() {
    String result = "成功";
    try {
        int a = 10 / 0;
    } catch (Exception e) {
        result = "数据异常";
    }
    return result;
}

接口改造后,出现异常时会提示:“数据异常”,对用户来说更友好。

看起来挺不错的,但是有问题。。。

如果只是一个接口还好,但是如果项目中有成百上千个接口,都要加上异常捕获代码吗?

答案是否定的,这时全局异常处理就派上用场了:RestControllerAdvice

@RestControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(Exception.class)
    public String handleException(Exception e) {
        if (e instanceof ArithmeticException) {
            return "数据异常";
        }
        if (e instanceof Exception) {
            return "服务器内部异常";
        }
        retur nnull;
    }
}

只需在handleException方法中处理异常情况,业务接口中可以放心使用,不再需要捕获异常(有人统一处理了)。真是爽歪歪。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • spring
    +关注

    关注

    0

    文章

    340

    浏览量

    14343
  • AOP
    AOP
    +关注

    关注

    0

    文章

    40

    浏览量

    11102
  • IOC
    IOC
    +关注

    关注

    0

    文章

    28

    浏览量

    10101
收藏 人收藏

    评论

    相关推荐

    Spring框架的设计理念

    Spring作为现在最优秀的框架之一,已被广泛的使用,51CTO也曾经针对Spring框架中的hqC应用做过报道。本文将从另外一个视角试图剖析Spring框架的作者设计
    发表于 07-15 08:17

    威廉希尔官方网站 中最常见到的电容使用方法

    基于电容常用功能,详细介绍各功能应用威廉希尔官方网站 中最常见到的电容使用方法
    发表于 03-17 08:08

    请问射击探测器中最常用的口径是什么?

    射击探测器中最常用的口径是什么?
    发表于 04-12 06:56

    单片机系统中最常用的三种通信协议

    UART、 I2C 和 SPI 是单片机系统中最常用的三种通信协议。1、初步介绍SPI 是一种高速的、全双工、同步通信总线,标准的 SPI 也仅仅使用 4 个引脚,常用于单片机和 EEPROM
    发表于 11-18 09:22

    开关电源中最常用的电阻有哪些呢

    一 电阻1.开关电源中最常用的电阻有贴片电阻、插件色环电阻、压敏电阻、热敏电阻等。2.贴片电阻2.1 贴片电阻:主要按封装和功率来分,常用的有0402 1/16W; 0603 1/10W; 0805
    发表于 12-29 06:14

    单片机系统中最常用的通信协议有几种

    )、MOSI(主机输出从机输入Master Output/Slave Input)和MISO(主机输入从机输出Master Input/Slave Output)。单片机系统中最常用的通信协议有三种,分...
    发表于 02-17 07:43

    单片机系统中最常用的三种通信协议是什么?

    单片机系统中最常用的三种通信协议是什么?
    发表于 02-17 06:03

    EMC问题中最常用的手段RC滤波详细资料说明

    让我们一起来看看处理 EMC 问题中最常用的手段 -RC 滤波。本文介绍了滤波的概念,并详细说明了电阻 - 电容(RC)低通滤波器的用途和特性。
    发表于 12-25 07:08 8次下载
    EMC问题<b class='flag-5'>中最常用</b>的手段RC滤波详细资料说明

    联网应用中最常用的传感器是什么?

    环境、运动、光电/图像和健康监测传感器是物联网应用中最常用的传感器类型
    的头像 发表于 08-16 11:26 992次阅读

    Spring中最常用的11个扩展

    除此之外,我们在使用spring的过程中,有没有发现它的扩展能力非常强。由于这个优势的存在,让spring拥有强大的包容能力,让很多第三方应用能够轻松投入spring的怀抱。比如:ro
    的头像 发表于 01-11 10:31 896次阅读

    剖析Spring中最常用扩展(中)

    我们一说到spring,可能第一个想到的是 `IOC`(控制反转) 和 `AOP`(面向切面编程)。 没错,它们是spring的基石,得益于它们的优秀设计,使得spring能够从众多优秀框架中脱颖而出。
    的头像 发表于 02-15 16:06 508次阅读
    <b class='flag-5'>剖析</b><b class='flag-5'>Spring</b><b class='flag-5'>中最常用</b>的<b class='flag-5'>扩展</b><b class='flag-5'>点</b>(中)

    剖析Spring中最常用扩展(下)

    我们一说到spring,可能第一个想到的是 `IOC`(控制反转) 和 `AOP`(面向切面编程)。 没错,它们是spring的基石,得益于它们的优秀设计,使得spring能够从众多优秀框架中脱颖而出。
    的头像 发表于 02-15 16:07 467次阅读

    基于spring的SPI扩展机制是如何实现的?

    基本,你一说是基于 spring 的 SPI 扩展机制,再把spring.factories文件和EnableAutoConfiguration提一下,那么这个问题就答的八九不离十了
    的头像 发表于 03-07 09:17 1053次阅读

    Spring中11个最常用扩展分享1

    在使用spring的过程中,我们有没有发现它的扩展能力很强呢?由于这个优势的存在,使得spring具有很强的包容性,所以很多第三方应用或者框架可以很容易的投入到spring的怀抱中。今
    的头像 发表于 05-11 10:48 557次阅读

    Spring中11个最常用扩展分享2

    在使用spring的过程中,我们有没有发现它的扩展能力很强呢?由于这个优势的存在,使得spring具有很强的包容性,所以很多第三方应用或者框架可以很容易的投入到spring的怀抱中。今
    的头像 发表于 05-11 10:48 396次阅读