Spring提供的拓展点

Bean生命周期提供的拓展点

  1. BeanFactoryPostProcessor - 处理所有Bean前,对BeanFactory预处理,也可以注册自定义Bean

  2. BeanDefinitionRegistryPostProcessor - 注册自定义Bean

  3. BeanPostProcessor - Bean初始化前后,对Bean进行加工

  4. InitializingBean - 所有Bean创建完成所有属性注入完成之后执行

  5. DisposableBean - Bean销毁之前执行

  6. ApplicaitonContextAware - 在Spring容器初始化完成后,获取ApplicationContext

  7. BeanFactoryAware - 获取BeanFactory

  8. EnvironmentAware - 获取Environment

  9. ResourceLoaderAware - 获取ResourceLoader

  10. BeanClassLoaderAware - 获取BeanClassLoader

  11. ApplicationContextInitializer - ApplicationContext初始化之前执行,获取ApplicationContext

  12. SmartInitializingSingleton - 所有单例Bean初始化完成后执行

  13. AutoConfigurationImportFilter - 过滤掉不需要的自动配置类。

  14. ApplicationRunner - Spring容器启动完成后执行,用于在应用启动后执行一些初始化操作。ApplicationRunner 接收 ApplicationArguments 对象作为参数,该对象提供了对原始命令行参数和选项的访问。在所有 CommandLineRunner 之后执行

  15. CommandLineRunner - Spring容器启动完成后。CommandLineRunner 接收 String[] 数组作为参数,该数组包含原始命令行参数,但不包含选项。在 ApplicationRunner 之前执行

对于Spring的拓展接口,都可以通过spring.factories文件来配置,比如:org.springframework.context.ApplicationContextInitializer=\com.xyuan.Xxxx

上面的拓展接口多实现执行顺序解决:可以通过Ordered接口决定执行顺序,也可以通过@Order注解来决定

SpringBoot提供的Listener

  1. ApplicationListener - 监听应用上下文的事件,

比如:ApplicationContextInitializedEvent、ApplicationStartingEvent、ApplicationEnvironmentPreparedEvent、ApplicationPreparedEvent、ApplicationReadyEvent、ApplicationFailedEvent(SpringBoot提供的)
ContextStartedEvent、ContextStoppedEvent、ContextClosedEvent、ContextRefreshedEvent(Spring提供的)

  1. 自定义事件监听
  • 实现ApplicationEvent
public class CustomMyEvent extends ApplicationEvent {

    public CustomMyEvent(Object source) {
        super(source);
    }
}

*需要监听事件的位置发布事件


@RestController
@RequestMapping("/xuyuan1")
public class MyController {

    @Autowired
    private ApplicationEventPublisher publisher;

    @Autowired
    private ObjectMapper mapper;


    @PostMapping("/register")
    public String register(@RequestParam("email") String email) {
        ObjectNode objectNode = mapper.createObjectNode();
        objectNode.put("email", email);
        objectNode.put("message", "欢迎注册我们的平台!");
        // 用户注册逻辑
        publisher.publishEvent(new CustomMyEvent(objectNode));
        return "注册成功";
    }
}
  • 监听事件

@Component
public class EventManager {
    @Autowired
    private ObjectMapper mapper;

    @EventListener(CustomMyEvent.class)
    public void onCustomMyEvent(CustomMyEvent event) {
        JsonNode jsonNode = mapper.convertValue(event.getSource(), JsonNode.class);
        System.out.println(jsonNode.get("email").asText() + jsonNode.get("message").asText());
    }
}

SpringBoot提供的其他拓展机制

  1. HandlerInterceptor

    • preHandle HandlerMapping之后,HandlerAdapter之前
    • postHandle HandlerAdapter之后,ModelAndView之前
    • afterCompletion 渲染ModelAndView之后
  2. AsyncHandlerInterceptor 拓展了HandlerInterceptor,新增了一个afterConcurrentHandlingStarted,在异步请求处理开始后调用的回调方法。

  3. RequestBodyAdvice

    1. 允许在HTTP请求的请求体被反序列化为Java对象之前和之后进行拦截和修改。例如对请求体进行预处理、验证或日志记录
    • supports 判断是否要对给定的返回类型和转换器类型应用当前的 RequestBodyAdvice 实现。true 表示要应用,false表示不应用。
    • beforeBodyRead 在请求体被反序列化为Java对象之前调用,可以对传入的HttpRequestBody修改,用于修改请求体。
    • afterBodyRead 在请求体被反序列化为Java对象之后调用,可以对反序列化后的Java对象进行修改,用于修改Java对象。
    • handleEmptyBody 在请求体为空时调用,可以提供一个默认对象或处理空请求体的情况。
    1. 使用场景
    • 日志记录:记录请求体的内容,便于调试和审计。
    • 预处理:在反序列化之前对请求体进行预处理,如解密或解码。
    • 验证:在反序列化之前对请求体进行验证,如检查 JSON 结构是否正确。
    • 默认值:处理空请求体并提供默认值。
  4. ResponseBodyAdvice

    1. 允许在HTTP响应的响应体被序列化之前进行拦截和修改。例如对响应体进行加密、压缩或日志记录。
    • supports 判断是否要对给定的返回类型和转换器类型应用当前的 ResponseBodyAdvice 实现。true 表示要应用,false表示不应用。
    • beforeBodyWrite 在响应体被序列化为HTTP响应之前调用,可以对响应体进行预处理,例如加密或压缩。
  5. WebMvcConfigurer :启用的 Spring MVC 的基于 Java 的配置

    • configurePathMatch

      配置 HandlerMapping 路径匹配选项.例如是否使用解析 PathPatterns 或字符串模式匹配、
      PathMatcher是否匹配尾部斜杠等。

    • configureContentNegotiation

      配置内容协商选项

    • configureAsyncSupport

      配置异步请求处理选项

    • configureDefaultServletHandling

      配置处理程序,通过转发到 Servlet 容器的 “default” servlet 来委托未处理的请求。一个常见的用例是当 映射到 “/” 时,
      DispatcherServlet 从而覆盖 Servlet 容器对静态资源的默认处理。

    • configureMessageConverters

      使用此方法会关闭默认转换器注册。添加HttpMessageConverter配置

    • configureHandlerExceptionResolvers

      配置异常解析器

    • configureViewResolvers

      配置视图解析器

    • addFormatters

      格式化器和转换器

    • addResourceHandlers

      添加处理程序以提供静态资源

    • addInterceptors

      添加 Spring MVC 生命周期拦截器,用于控制器方法调用和资源处理程序请求的预处理和后处理。可以注册拦截器以应用于所有请求,也可以限制为
      URL 模式的子集

    • addCorsMappings

      配置 “global” 跨域请求处理。配置的 CORS 映射适用于带注释的控制器、功能端点和静态资源。

    • addViewControllers

      配置预先配置了响应状态代码和/或视图的简单自动控制器,以呈现响应正文。这在不需要自定义控制器逻辑的情况下非常有用 ——
      例如,渲染主页、执行简单的站点 URL 重定向、返回带有 HTML 内容的 404 状态、返回没有内容的 204 状态等等。

    • addArgumentResolvers

      添加解析程序以支持自定义控制器方法参数类型

    • addReturnValueHandlers

      添加处理程序以支持自定义控制器方法返回值类型。

    • extendMessageConverters

      使用default列表初始化 converter 列表后扩展或修改列表。转换器注册的顺序很重要。特别是在 Client 端接受
      org.springframework.http.MediaType.ALL Converters 的情况下,较早配置的转换器将是首选。

    • extendHandlerExceptionResolvers

      扩展或修改默认配置的异常解析程序列表。这对于插入自定义异常解析程序而不干扰默认异常解析程序非常有用。

    • getValidator

      提供自定义,而不是默认创建的自定义 Validator 。假设 JSR-303 位于 Classpath 上,则默认实现为:
      org.springframework.validation.beanvalidation.OptionalValidatorFactoryBean。将返回值 null 保留为以保持默认值。

    • getMessageCodesResolver

      提供用于从数据绑定和验证错误代码构建消息代码的自定义 MessageCodesResolver 。将返回值 null 保留为以保持默认值。

  6. WebFilter
    用于 Web 请求的拦截式链式处理的协定,可用于实现跨领域、与应用程序无关的要求,例如安全性、超时等。@Order 注解不能指定
    Filter 优先级

  7. @ControllerAdvice

  8. @ExceptionHandler

你可能感兴趣的:(Spring,spring,python,java)