实习记录2023/7/19

实习记录2023/7/18

2023/7/17的学习总结




提示:以下是本篇文章正文内容,下面案例可供参考

一、springBoot中handlerMappings的RequestMappingHandlerMapping,WelcomePageHandlerMapping,BeanNameUrlHardlerMapping,RouterFunctionMapping,SimpleHandlerMapping 分别处理什么请求呢?

在这里插入图片描述

  • 在 Spring Boot 中,不同的 HandlerMappings 用于处理不同类型的请求。以下是各个 HandlerMappings 的作用和处理的请求类型:
  1. RequestMappingHandlerMapping:

    • 处理使用注解 @RequestMapping 或其他注解(如 @GetMapping、@PostMapping 等)标记的请求处理方法。
    • 用于处理基于注解的请求映射,将请求映射到相应的处理方法。
  2. WelcomePageHandlerMapping:

    • 处理欢迎页请求,即根路径 / 的请求。
    • 用于将根路径的请求映射到欢迎页,例如 index.html 或其他自定义的欢迎页。
  3. BeanNameUrlHandlerMapping:

    • 处理基于 Bean 名称的请求映射。
    • 用于将请求映射到具有特定 Bean 名称的处理器(Controller)。
  4. RouterFunctionMapping:

    • 处理基于函数式编程风格的请求映射。
    • 用于使用函数式编程风格定义请求路由和处理逻辑,通常与 WebFlux 模块一起使用。
  5. SimpleUrlHandlerMapping:

    • 处理基于 URL 的请求映射。
    • 用于将请求映射到指定的 URL,可以通过配置文件或代码进行配置。
    • 需要注意的是,RequestMappingHandlerMapping 是最常用的 HandlerMapping,用于处理大部分基于注解的请求映射。其他的 HandlerMappings 则用于处理特定类型的请求映射,例如欢迎页请求、基于 Bean 名称的请求映射、函数式编程风格的请求映射等。

在 Spring Boot 应用程序中,这些 HandlerMappings 会根据优先级进行顺序匹配,以确定哪个 HandlerMapping 将处理特定的请求。默认情况下,RequestMappingHandlerMapping 的优先级最高,因此它通常是最常用的 HandlerMapping。
在这里插入图片描述

二、请求的过程

在这里插入图片描述
** SpringMVC功能分析都从 org.springframework.web.servlet.DispatcherServlet-》doDispatch()
**

三、springBoot 处理 HTTP 请求的核心组件

DispatcherServlet

  • DispatcherServlet 是 Spring Boot 中用于处理 HTTP 请求的核心组件之一。
  • 它负责将 HTTP 请求分发给相应的处理器(Controller)和处理方法,并执行相应的处理逻辑。
  • DispatcherServlet 还负责处理异常、拦截器、视图解析器等,以及将处理结果转换为 HTTP 响应。

HandlerMapping

  • HandlerMapping 是 Spring Boot 中用于处理 HTTP 请求的另一个核心组件。
  • 它负责将 HTTP 请求映射到相应的处理器(Controller)和处理方法,并返回相应的处理器和处理方法。
  • HandlerMapping 可以根据请求的 URL、请求参数、请求头等信息进行映射,以确定哪个处理器和处理方法将处理特定的 HTTP 请求。

HandlerAdapter

  • HandlerAdapter 是 Spring Boot 中用于处理 HTTP 请求的另一个核心组件。
  • 它负责将 HTTP 请求交给相应的处理器(Controller)和处理方法进行处理,并将处理结果返回给客户端。
  • HandlerAdapter 还负责执行处理器的处理逻辑,并将处理结果转换为 HTTP 响应。

ViewResolver

  • ViewResolver 是 Spring Boot 中用于处理 HTTP 响应的核心组件之一。
  • 它负责将处理结果转换为视图(View),并将视图渲染为 HTTP 响应。
  • ViewResolver 可以根据处理结果的类型、请求的 Accept 头等信息进行视图解析,以确定哪个视图将渲染处理结果。

需要注意的是,Spring Boot 中还有其他用于处理 HTTP 请求的组件,如拦截器、过滤器、参数解析器等。这些组件可以扩展和定制 Spring Boot 的 HTTP 请求处理流程,以满足不同的需求。

总之,Spring Boot 中用于处理 HTTP 请求的核心组件包括 DispatcherServlet、HandlerMapping、HandlerAdapter 和 ViewResolver。这些组件负责将 HTTP 请求分发给相应的处理器和处理方法,并将处理结果转换为 HTTP 响应。开发者可以根据需要扩展和定制这些组件,以满足不同的需求。

四、springBoot有哪些核心组件

Spring Boot 是一个基于 Spring 框架的快速开发框架,它提供了一系列核心组件,用于构建 Web 应用程序、数据访问、安全性、测试等方面。以下是 Spring Boot 的一些核心组件及其功能:

Spring MVC:

  • Spring MVC 是 Spring Boot 中用于构建 Web 应用程序的核心组件之一。
  • 它提供了一组基于注解的 API,用于定义控制器、请求映射、视图解析器等,以及处理 HTTP 请求和响应。

Spring Data:

  • Spring Data 是 Spring Boot 中用于访问数据的核心组件之一。
  • 它提供了一组通用的数据访问 API,用于访问关系型数据库、NoSQL 数据库、搜索引擎等,以及实现数据访问的常见功能,如分页、排序、查询等。

Spring Security:

  • Spring Security 是 Spring Boot 中用于实现安全性的核心组件之一。
  • 它提供了一组 API,用于实现身份验证、授权、加密、防止 CSRF 攻击等安全性功能。

Spring Test:

  • Spring Test 是 Spring Boot 中用于测试的核心组件之一。
  • 它提供了一组 API,用于编写单元测试、集成测试、端到端测试等,以及支持常见的测试框架,如 JUnit、Mockito、RestAssured 等。

Spring Boot Actuator:

  • Spring Boot Actuator 是 Spring Boot 中用于监控和管理应用程序的核心组件之一。
  • 它提供了一组 API,用于监控应用程序的运行状况、性能指标、日志等,以及管理应用程序的健康状态、配置信息、线程池等。

Spring Boot Autoconfigure:

  • Spring Boot Autoconfigure 是 Spring Boot 中用于自动配置的核心组件之一。
  • 它提供了一组自动配置机制,用于根据应用程序的依赖关系和配置信息,自动配置 Spring Boot 应用程序的各个组件,以简化应用程序的配置和部署。

需要注意的是,Spring Boot 的核心组件不仅限于上述几个,还包括其他组件,如 Spring Integration、Spring Batch、Spring Cloud 等。这些组件提供了丰富的功能和 API,可以帮助开发者快速构建高质量的应用程序。

三、springBoot 中的过滤器(Filter)和拦截器(Interceptor)

过滤器(Filter)

  • 过滤器是基于 Servlet 规范的一种组件,用于对 HTTP 请求和响应进行预处理和后处理。
  • 过滤器可以在请求到达 Servlet 之前进行预处理,也可以在响应返回给客户端之前进行后处理。
  • 过滤器可以对请求进行修改、验证、记录日志等操作,也可以对响应进行修改、压缩、加密等操作。
  • 过滤器在 Spring Boot 中通过实现 javax.servlet.Filter 接口来定义,并通过配置类或注解进行注册和配置。

拦截器(Interceptor)

  • 拦截器是 Spring MVC 框架提供的一种组件,用于对请求进行拦截和处理。
  • 拦截器可以在请求到达控制器之前进行预处理,也可以在控制器处理完请求后进行后处理。
  • 拦截器可以对请求进行权限验证、日志记录、性能监控等操作,也可以对响应进行修改、包装等操作。
  • 拦截器在 Spring Boot 中通过实现 org.springframework.web.servlet.HandlerInterceptor 接口来定义,并通过配置类或注解进行注册和配置。

过滤器和拦截器的主要区别在于

  • 过滤器是基于 Servlet 规范的,可以对所有的请求进行处理,包括静态资源请求。
  • 拦截器是基于 Spring MVC 框架的,只能对经过 DispatcherServlet 的请求进行处理,不包括静态资源请求。
  • 过滤器可以在请求到达 Servlet 之前进行预处理,也可以在响应返回给客户端

@EnableAspectJAutoProxy(exposeProxy = true, proxyTargetClass = true)什么含义呢?

@EnableAspectJAutoProxy 是 Spring Framework 中用于启用 AspectJ 自动代理的注解。它可以用于配置 Spring 应用程序中的切面(Aspect)和通知(Advice),以实现面向切面编程(AOP)。

@EnableAspectJAutoProxy 注解有两个可选属性:exposeProxy 和 proxyTargetClass。

  • exposeProxy:指定是否将代理对象暴露给 AOP 上下文中的其他组件。默认值为 false,表示不暴露代理对象。
  • proxyTargetClass:指定是否使用 CGLIB 代理。默认值为 false,表示使用 JDK 动态代理。
    当 proxyTargetClass 属性设置为 true 时,Spring 将使用 CGLIB 代理来创建代理对象。CGLIB 代理是一种基于继承的代理方式,可以代理非接口类型的类。如果目标对象实现了接口,则 Spring 会优先使用 JDK 动态代理。

需要注意的是,使用 CGLIB 代理可能会带来一些性能开销,因为它需要在运行时生成代理类。因此,建议只在必要时使用 CGLIB 代理。

总之,@EnableAspectJAutoProxy 是 Spring Framework 中用于启用 AspectJ 自动代理的注解。它可以用于配置 Spring 应用程序中的切面和通知,以实现面向切面编程。exposeProxy 和 proxyTargetClass 属性可以用于控制代理对象的暴露和代理方式。

@Resource与@Autowired注解有什么区别?分别用在什么地方?

@Resource 和 @Autowired 都是 Spring Framework 中用于进行依赖注入的注解,它们的作用类似,但有一些区别。

  • 来源不同:@Resource 是 Java EE 标准中定义的注解,而 @Autowired 是 Spring Framework 中定义的注解。

  • 注入方式不同:@Resource 注解可以通过名称或类型进行注入,而 @Autowired 注解只能通过类型进行注入。

  • 依赖性不同:@Resource 注解不是必须的,如果找不到对应的组件或资源,不会抛出异常;而 @Autowired 注解是必须的,如果找不到对应的组件或资源,会抛出异常。

  • 兼容性不同:@Resource 注解是 Java EE 标准中定义的注解,可以与其他 Java EE 技术(如 EJB)一起使用;而 @Autowired 注解是 Spring Framework 中定义的注解,只能与 Spring Framework 一起使用。
    使用场景如下:

  • @Resource 注解通常用于注入其他 JavaBean 组件、数据源和 Web 服务等,可以通过名称或类型进行注入。例如:

@Resource(name = "myDao")
private MyDao myDao;
  • @Autowired 注解通常用于注入其他 Spring Bean 组件,只能通过类型进行注入。例如:
@Autowired
private MyService myService;

需要注意的是,如果需要在 Spring Framework 中使用 @Resource 注解进行依赖注入,可以使用 CommonAnnotationBeanPostProcessor 来支持 @Resource 注解。例如:

<bean class="org.springframework.context.annotation.CommonAnnotationBeanPostProcessor"/>

处理跨域问题!

Java中的过滤器

@WebFilter(urlPatterns = "/*")
public class CorsFilter implements Filter {

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest httpServletRequest = (HttpServletRequest) request;
        HttpServletResponse httpServletResponse = (HttpServletResponse) response;
    
        String header = httpServletRequest.getHeader(HttpHeaders.ORIGIN);
        httpServletResponse.setHeader(HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN, ObjectUtil.defaultIfNull(header, "*"));
        httpServletResponse.setHeader(HttpHeaders.ACCESS_CONTROL_ALLOW_HEADERS, "Origin, X-Requested-With, Content-Type, Accept, zfile-token, axios-request");
        httpServletResponse.setHeader(HttpHeaders.ACCESS_CONTROL_ALLOW_METHODS, "GET, POST, PUT, DELETE, OPTIONS");
        httpServletResponse.setHeader(HttpHeaders.ACCESS_CONTROL_ALLOW_CREDENTIALS, "false");
        httpServletResponse.setHeader(HttpHeaders.ACCESS_CONTROL_MAX_AGE, "600");

        if (!CorsUtils.isPreFlightRequest(httpServletRequest)) {
            chain.doFilter(httpServletRequest, httpServletResponse);
        }
    }

}

跟踪日志

MDC(Mapped Diagnostic Context)是一个线程绑定的上下文环境,用于在应用程序中跟踪和记录日志。它是日志框架(如 Logback、Log4j)提供的一个功能,用于在日志输出中包含额外的上下文信息。

MDC 的主要功能是在应用程序的执行过程中,将关键信息存储在一个地方,以便在日志记录时使用。这些信息可以是应用程序的上下文、用户会话、请求标识、跟踪ID等。通过将这些信息放入 MDC 中,可以在整个应用程序的执行过程中访问和使用这些信息。

MDC 的具体功能包括:

  • 跟踪和关联日志:通过在 MDC 中存储唯一的标识符(如跟踪ID),可以将相关的日志条目关联起来,以便在分布式系统或多线程环境中进行日志追踪和分析。

  • 上下文信息传递:MDC 可以在应用程序的不同组件或层之间传递上下文信息,如用户会话、请求标识、用户身份验证状态等。这样,在不同的组件中记录的日志可以包含相同的上下文信息,方便日志的分析和故障排查。

  • 日志过滤和输出控制:通过在日志配置文件中配置相应的输出格式,可以将 MDC 中的信息包含在日志中。这样,可以根据 MDC 中的信息对日志进行过滤、分类或输出到不同的目标(如文件、数据库、远程服务器)。

数据增强

@ControllerAdvice 是 Spring MVC 中的一个注解,用于定义全局的控制器增强器。通过在控制器增强器中实现一些特定的接口或方法,可以对所有的控制器请求进行统一的处理和增强。

在上述代码中,CommonResultControllerAdvice 类使用了 @ControllerAdvice 注解,并实现了 ResponseBodyAdvice 接口。该接口用于在控制器方法返回结果之前或之后,对返回结果进行处理和增强。

具体来说,CommonResultControllerAdvice 类实现了 supports() 和 beforeBodyWrite() 方法,用于对返回结果进行处理和增强。其中,supports() 方法用于判断当前控制器方法的返回类型是否支持增强,如果支持,则返回 true,否则返回 false。在该方法中,通过判断返回结果的转换器类型,判断是否支持增强。

beforeBodyWrite() 方法用于在控制器方法返回结果之前,对返回结果进行处理和增强。在该方法中,首先通过 getOrCreateContainer() 方法,将返回结果包装在一个 MappingJacksonValue 容器中,以便提供额外的序列化指令。然后,通过判断返回结果是否为 AjaxJson 类型,将 MDC 中的 traceId 添加到返回结果中。

需要注意的是,CommonResultControllerAdvice 类是一个示例,具体的实现和使用方式可能会根据应用程序的需求和业务逻辑而有所不同。在实际应用中,可能需要根据具体的业务需求,对返回结果进行更加细粒度的处理和增强。

总之,@ControllerAdvice 是 Spring MVC 中的一个注解,用于定义全局的控制器增强器。CommonResultControllerAdvice 类实现了 ResponseBodyAdvice 接口,用于对控制器方法的返回结果进行处理和增强。具体的实现和使用方式可能会根据应用程序的需求和业务逻辑而有所不同。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值