【记录版】SpringBoot框架中Request请求获取方式及源码解读

HttpServletRequest在Spring中的获取和注入 @Autowired注入Request 在最近一次团队review代码时,团队成员发现有将HttpServletRequest 直接通过@Autowired注入的情况,于是大家产生了一个疑问,HttpServletRequest并非Spring中的类,且在没有手动通过@Bean的方式注入,Spring是怎么做到帮开发者完成注入的?同时,我们知道ioc容器中默认注入的Bean是单例,而每个请求都是独立的,这样不会出问题吗?为了研究明白为什么,我找了些资料,同时写了个简单的demo研究了下。 阅读详情

SpringBoot + HttpServletRequest

背景: 我们现在有很多WEB项目基于SpringBoot开发,其中接口管理是必不可少的,接口中Request对象是核心内容,我们对参数、属性、header等等元数据的获取和配置都离不开它,常用的Filter、拦截器等操作类也都有它的身影。本篇在此基础上,从源码角度讨论获取Request的三种方式:

方式一、接口方法或全局异常处理方法参数注入
通常在开发简单POST接口时,请求参数或Header等信息都可以用*@RequestBody、@RequestParam、@PathVariable或@RequestHeader*注解直接取值,部分场景下当接口方法参数名和请求体参数名值和类型一致时,也可以赋值,如下所示:
在这里插入图片描述
当然最原始的也可用Request实例对象,即在此接口上配置HttpServletRequest参数获取,这是最简单也是最直接的方式。(PS: 接口方法也可设置HttpSession参数控制session逻辑)
源码一、方法参数解析入口类

package org.springframework.web.method.support;
public class InvocableHandlerMethod extends HandlerMethod {
    @Nullable
    public Object invokeForRequest(NativeWebRequest request, @Nullable ModelAndViewContainer mavContainer, Object... providedArgs) throws Exception {
    	// 解析方法所有参数,并将其传给最终的反射方法对象执行invoke操作
        Object[] args = this.getMethodArgumentValues(request, mavContainer, providedArgs);
        return this.doInvoke(args);
    }
}

源码二、方法参数解析类(选一:RequestResponseBodyMethodProcessor)

// 方法参数解析接口
public interface HandlerMethodArgumentResolver {
    boolean supportsParameter(MethodParameter parameter);

    @Nullable
    Object resolveArgument(MethodParameter parameter, @Nullable ModelAndViewContainer mavContainer, NativeWebRequest webRequest, @Nullable WebDataBinderFactory binderFactory) throws Exception;
}
package org.springframework.web.servlet.mvc.method.annotation;
public class RequestResponseBodyMethodProcessor extends AbstractMessageConverterMethodProcessor {
	......省略......
	public Object resolveArgument(MethodParameter parameter, @Nullable ModelAndViewContainer mavContainer, NativeWebRequest webRequest, @Nullable WebDataBinderFactory binderFactory) throws Exception {
        parameter = parameter.nestedIfOptional();
        // 通过转换器将Request中请求流数据转换为对应的实体
        Object arg = this.readWithMessageConverters(webRequest, parameter, parameter.getNestedGenericParameterType());
        String name = Conventions.getVariableNameForParameter(parameter);
        if (binderFactory != null) {
            WebDataBinder binder = binderFactory.createBinder(webRequest, arg, name);
            if (arg != null) {
            	// 参数校验
                this.validateIfApplicable(binder, parameter);
                if (binder.getBindingResult().hasErrors() && this.isBindExceptionRequired(binder, parameter)) {
                    throw new MethodArgumentNotValidException(parameter, binder.getBindingResult());
                }
            }

            if (mavContainer != null) {
                mavContainer.addAttribute(BindingResult.MODEL_KEY_PREFIX + name, binder.getBindingResult());
            }
        }

        return this.adaptArgumentIfNecessary(arg, parameter);
    }
	
	// 参数校验
	protected void validateIfApplicable(WebDataBinder binder, MethodParameter parameter) {
		// 获取参数所有注解,下面将判断是否包含校验类注解
        Annotation[] annotations = parameter.getParameterAnnotations();
        Annotation[] var4 = annotations;
        int var5 = annotations.length;

        for(int var6 = 0; var6 < var5; ++var6) {
            Annotation ann = var4[var6];
            // 此处获取@Valid等校验注解,如果有,binder执行校验并获取校验结果
            Object[] validationHints = ValidationAnnotationUtils.determineValidationHints(ann);
            if (validationHints != null) {
                binder.validate(validationHints);
                break;
            }
        }

    }
......省略......
}

HandlerMethodArgumentResolver默认有31种,覆盖绝大部分类型参数的解析,使我们从Request的API的操作中解放出来,从而关注业务逻辑的开发和管理,以下仅列出核心解析器:
1、RequestResponseBodyMethodProcessor // 支持@RequestBody注解参数解析
2、ServletRequestMethodArgumentResolver //支持ServletRequest、MultipartRequest及HttpSession等参数解析
3、RequestHeaderMethodArgumentResolver // 支持Header参数解析

方法二:方法体内通过RequestContextHolder全局持久化类获取

HttpServletRequest holderRequest = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();

在SpringBoot项目中,有两处地方进行了上下文保存动作:
1、OrderedRequestContextFilter extends RequestContextFilter implements OrderedFilter 设置

public class RequestContextFilter extends OncePerRequestFilter {
	// 是否线程间传递,适用于后端存在异步线程池场景,需手工开启
    private boolean threadContextInheritable = false;
    
    public void setThreadContextInheritable(boolean threadContextInheritable) {
        this.threadContextInheritable = threadContextInheritable;
    }
    
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
    	// 请求与响应封装体
        ServletRequestAttributes attributes = new ServletRequestAttributes(request, response);
        // 内存保存
        this.initContextHolders(request, attributes);

        try {
            filterChain.doFilter(request, response);
        } finally {
            // 清除
            LocaleContextHolder.resetLocaleContext();
        	RequestContextHolder.resetRequestAttributes();
            attributes.requestCompleted();
        }
    }
	
	// 请求&响应上下文具体保存逻辑-核心为ThreadLocal
    private void initContextHolders(HttpServletRequest request, ServletRequestAttributes requestAttributes) {
        LocaleContextHolder.setLocale(request.getLocale(), this.threadContextInheritable);
        RequestContextHolder.setRequestAttributes(requestAttributes, this.threadContextInheritable);
    }
}

OrderedRequestContextFilter是通过SpringBoot自动配置,只要是Web项目都不用手工设置,自动配置源码:

@AutoConfiguration(
    after = {DispatcherServletAutoConfiguration.class, TaskExecutionAutoConfiguration.class, ValidationAutoConfiguration.class}
)
@ConditionalOnWebApplication(
    type = Type.SERVLET
)
@ConditionalOnClass({Servlet.class, DispatcherServlet.class, WebMvcConfigurer.class})
@ConditionalOnMissingBean({WebMvcConfigurationSupport.class})
@AutoConfigureOrder(-2147483638)
public class WebMvcAutoConfiguration {
    @Configuration(
        proxyBeanMethods = false
    )
    @Import({EnableWebMvcConfiguration.class})
    @EnableConfigurationProperties({WebMvcProperties.class, WebProperties.class})
    @Order(0)
    public static class WebMvcAutoConfigurationAdapter implements WebMvcConfigurer, ServletContextAware {
        @Bean
        @ConditionalOnMissingBean({RequestContextListener.class, RequestContextFilter.class})
        @ConditionalOnMissingFilterBean({RequestContextFilter.class})
        public static RequestContextFilter requestContextFilter() {
            return new OrderedRequestContextFilter();
        }
    }
}

二、DispatcherServlet执行时设置

public class DispatcherServlet extends FrameworkServlet {
    private void initContextHolders(HttpServletRequest request, @Nullable LocaleContext localeContext, @Nullable RequestAttributes requestAttributes) {
        if (localeContext != null) {
            LocaleContextHolder.setLocaleContext(localeContext, this.threadContextInheritable);
        }
        if (requestAttributes != null) {
            RequestContextHolder.setRequestAttributes(requestAttributes, this.threadContextInheritable);
        }
    }
}

三、定义HttpServletRequest类实例变量,通过Spring容器注入,如@Autowired注解修饰
在这里插入图片描述
这种方式比较少见,但既然能够使用,说明此时我们看到的request对象,不再是前面方法里获取的Request对象,而是披了一层羊皮的代理对象,这样每个接口获取时才能找到自己的上下文,那它是怎么实现的呢?

熟悉Spring框架的话,就会知道容器在实例化外部控制器实例时,会在BeanPostProcessor等处优先处理需要注入的实例,当需要注入实例到Request变量时,BeanFactory会自动处理:
在这里插入图片描述

// Bean实例化时会执行
public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFactory implements ConfigurableListableBeanFactory, BeanDefinitionRegistry, Serializable {
 // beanName为外部类名称,requiredType为HttpServletRequest.class
 protected Map<String, Object> findAutowireCandidates(@Nullable String beanName, Class<?> requiredType, DependencyDescriptor descriptor) {
        String[] candidateNames = BeanFactoryUtils.beanNamesForTypeIncludingAncestors(this, requiredType, true, descriptor.isEager());
        Map<String, Object> result = CollectionUtils.newLinkedHashMap(candidateNames.length);
        // BeanFactory所有缓存的resolvableDependencies,具体见如上截图中8个依赖
        Iterator var6 = this.resolvableDependencies.entrySet().iterator();

        while(var6.hasNext()) {
            Map.Entry<Class<?>, Object> classObjectEntry = (Map.Entry)var6.next();
            Class<?> autowiringType = (Class)classObjectEntry.getKey();
            if (autowiringType.isAssignableFrom(requiredType)) {
                Object autowiringValue = classObjectEntry.getValue();
                // 此处根据变量类型,获取对应的ObjectFactory工厂,再生成对应的Proxy
                autowiringValue = AutowireUtils.resolveAutowiringValue(autowiringValue, requiredType);
                if (requiredType.isInstance(autowiringValue)) {
                    result.put(ObjectUtils.identityToString(autowiringValue), autowiringValue);
                    break;
                }
            }
        }
        ..........		
	}
}
abstract class AutowireUtils {
	public static Object resolveAutowiringValue(Object autowiringValue, Class<?> requiredType) {
    	if (autowiringValue instanceof ObjectFactory && !requiredType.isInstance(autowiringValue)) {
        	ObjectFactory<?> factory = (ObjectFactory)autowiringValue;
        	if (!(autowiringValue instanceof Serializable) || !requiredType.isInterface()) {
        	    return factory.getObject();
        	}
			
			// 此处使用JDK动态代理
        	autowiringValue = Proxy.newProxyInstance(requiredType.getClassLoader(), new Class[]{requiredType}, new ObjectFactoryDelegatingInvocationHandler(factory));
    		}

   	 		return autowiringValue;
		}
	}
	// 私有静态内部类封装InvocationHandler具体的反射调用内容,配合JDK动态代理生成代理类
	private static class ObjectFactoryDelegatingInvocationHandler implements InvocationHandler, Serializable {
        private final ObjectFactory<?> objectFactory;

        ObjectFactoryDelegatingInvocationHandler(ObjectFactory<?> objectFactory) {
            this.objectFactory = objectFactory;
        }

        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            switch (method.getName()) {
                case "equals":
                    return proxy == args[0];
                case "hashCode":
                    return System.identityHashCode(proxy);
                case "toString":
                    return this.objectFactory.toString();
                default:
                    try {
                        return method.invoke(this.objectFactory.getObject(), args);
                    } catch (InvocationTargetException var6) {
                        throw var6.getTargetException();
                    }
            }
        }
    }
}

ObjectFactoryDelegatingInvocationHandler是处理封装类,具体逻辑为ObjectFactory实现类提供

public abstract class WebApplicationContextUtils {
    public static void registerWebApplicationScopes(ConfigurableListableBeanFactory beanFactory, @Nullable ServletContext sc) {
        beanFactory.registerScope("request", new RequestScope());
        beanFactory.registerScope("session", new SessionScope());
        if (sc != null) {
            ServletContextScope appScope = new ServletContextScope(sc);
            beanFactory.registerScope("application", appScope);
            sc.setAttribute(ServletContextScope.class.getName(), appScope);
        }
		// 此处注册Request执行的工厂类
        beanFactory.registerResolvableDependency(ServletRequest.class, new RequestObjectFactory());
        beanFactory.registerResolvableDependency(ServletResponse.class, new ResponseObjectFactory());
        beanFactory.registerResolvableDependency(HttpSession.class, new SessionObjectFactory());
        beanFactory.registerResolvableDependency(WebRequest.class, new WebRequestObjectFactory());
        if (jsfPresent) {
            WebApplicationContextUtils.FacesDependencyRegistrar.registerFacesDependencies(beanFactory);
        }
    }
}

Request代理类真实执行逻辑:

public abstract class WebApplicationContextUtils {
    private static class RequestObjectFactory implements ObjectFactory<ServletRequest>, Serializable {
        // ObjectFactory核心就是getObject方法,封装实例创建的过程
        public ServletRequest getObject() {
        	// 实际获取的还是RequestContextHolder缓存的Request对象
            return WebApplicationContextUtils.currentRequestAttributes().getRequest();
        }
    }
}

总结:
1、一般需求场景,直接在接口方法上标注HttpServletRequest对象即可
2、如果需要在任意场景使用HttpServletRequest对象,方法二和方法三都可,方法三使用更加简洁
3、方法二和方法三底层都依赖ThreadLocal,如果后台使用异步线程池,需要手工设置inheritable属性为true
4、从方法一中,我们可以学到接口方法可以定义多个我们需要的上下文参数,如HttpSession;从方法三中我们可以学习到全局使用Request、Response、Session等8个对象。
5、方法三虽然涉及Bean生命周期、JDK动态代理等底层知识,但实际内容还是围绕RequestContextHolder做的封装,使用时更加方便,全局场景推荐使用此方式。
6、全局注入场景,ObjectProvider类也有类似的能力,具体可见这里。

SpringBoot+Vue3前后端分离项目实战:从零搭建美食网站 在软件开发领域,前后端分离架构已成为现代Web应用的主流模式,其核心原理是将用户界面与业务逻辑解耦,通过API接口进行数据交互。这种架构模式的技术价值在于提升了开发效率、实现了团队并行协作,并增强了系统的可维护性和可扩展性。在工程实践中,SpringBoot作为后端快速开发框架,与Vue3前端框架的结合,是构建此类应用的典型技术选型。它们共同支撑了从用户管理、数据展示到业务处理的全链路开发,广泛应用于电商、内容管理、OA系统等场景。本文以“美食网站”这一具体项目为载体,深入剖析了如何基于SpringBoot 阅读详情

相关推荐

SpringBoot+Vue实战:学生宿舍报修系统开发全流程解析

在软件开发领域,前后端分离架构已成为构建现代Web应用的主流范式。其核心原理在于将应用的前端展示层与后端业务逻辑层解耦,后端通过RESTful API提供数据服务,前端则专注于用户交互与界面渲染。这种架构模式的技术价值在于提升了开发效率、增强了系统可维护性,并支持团队并行协作。它广泛应用于各类管理后台、电商平台及企业级应用。本文聚焦于一个典型应用场景——学生宿舍报修管理系统,深入剖析如何运用SpringBoot与Vue技术栈实现一个功能闭环、开箱即用的实战项目。通过拆解其环境搭建、代码结构及核心模块,特别是

weixin_33805992的博客 494

SpringBoot--获取request(HttpServletRequest)的方法

本文介绍SpringBoot获取request(HttpServletRequest)的方法

IT利刃出鞘的博客 6115

半小时搭建SpringBoot+Vue3博客系统:全栈开发实战指南

在Web开发领域,前后端分离架构已成为主流范式,其核心在于通过RESTful API实现前后端解耦与高效协作。SpringBoot凭借其“约定大于配置”的理念,极大地简化了Java后端服务的开发与部署,而Vue3则以其响应式系统和组合式API引领了现代前端开发。这种技术组合的价值在于能够快速构建可维护、可扩展的企业级应用,广泛应用于内容管理、电商平台、后台管理系统等场景。本文聚焦于一个具体的博客管理系统项目,它精准地解决了初学者寻找完整、可运行练手项目的普遍痛点。该项目采用SpringBoot + Vue3

weixin_33727510的博客 445

Spring Boot当中获取request的三种方式

本篇博客主要记录request相关知识,也是开发当中经常遇到的,感兴趣的跟小编一起学习吧!

怪咖@的博客 9639

Kunpeng框架插件开发实战:从零构建Spring Boot Actuator漏洞检测插件

在网络安全领域,插件化框架是实现自动化漏洞检测的核心技术。其原理是通过模块化设计,将安全专家的经验固化为可复用的检测脚本,从而提升安全评估效率。这种技术价值在于能够将复杂的手工验证过程转化为标准化、可批量执行的自动化流程,广泛应用于企业内部安全巡检、红队评估等场景。以Kunpeng框架为例,其插件机制围绕POCBase基类展开,开发者通过实现_verify方法,将针对特定漏洞的检测逻辑,如Spring Boot Actuator未授权访问,封装成独立的插件。本文聚焦于Kunpeng框架的二次开发,详细拆解了

weixin_30701575的博客 371

SpringBoot+Vue3健身房管理系统:集成DeepSeek AI的全栈项目实战

前后端分离架构是现代Web应用开发的主流模式,通过将前端展示层与后端业务逻辑层解耦,实现了技术栈的灵活选择和团队的高效协作。其核心原理在于前端通过HTTP API与后端通信,后端专注于数据处理和业务逻辑,前端负责用户交互和界面渲染。这种架构模式的技术价值在于提升了系统的可维护性、可扩展性和开发效率。在实际应用场景中,结合SpringBoot后端框架和Vue3前端框架,可以快速构建企业级管理系统。本文以健身房管理系统为例,深入探讨如何将AI能力集成到传统业务系统中,通过接入DeepSeek API实现智能客服

weixin_30292745的博客 397

你了解 SpringBoot 在一次 http 请求中耗费了多少内存吗?

???? 这是一个或许对你有用的社群???? 一对一交流/面试小册/简历优化/求职解惑,欢迎加入「芋道快速开发平台」知识星球。下面是星球提供的部分资料:《项目实战(视频)》:从书中学,往事上“练”《互联网高频面试题》:面朝简历学习,春暖花开《架构 x 系统设计》:摧枯拉朽,掌控面试高频场景题《精进 Java 学习指南》:系统学习,互联网主流技术栈《必读 Java 源码专栏》:知其然,知其所以然????这是一个或许...

芋艿V 112

SpringBoot+Vue前后端分离项目实战:从零构建大学生心理咨询平台

前后端分离架构是现代Web应用开发的主流模式,其核心原理是将应用的用户界面(前端)与业务逻辑和数据(后端)解耦,通过API接口进行通信。这种模式的技术价值在于实现了关注点分离,提升了开发效率和系统可维护性,使得团队能够并行开发,并轻松支持多端适配。在工程实践中,SpringBoot作为后端框架,以其简化配置和快速启动的特性,结合MyBatis-Plus高效操作数据库,成为构建RESTful API的利器;而Vue.js作为前端框架,通过数据驱动视图和组件化开发,极大地提升了用户界面的开发体验。这类技术组合广

weixin_34194359的博客 347

(开源)体育商品推荐系统 全栈开发实录 采用 Java + SpringBoot + Vue + MySQL

本文详解一套基于 Java+SpringBoot+Vue+MySQL 的体育商品推荐系统,采用前后端分离架构,核心模块涵盖用户管理、商家管理、商品信息管理、抽奖活动管理、抽奖记录管理、论坛交流等。文章从项目简介、技术栈、环境配置、快速部署到核心代码解读(Entity/Mapper/Service/Controller)层层拆解,并附完整业务流程演示、踩坑复盘与源码下载地址,适合毕业设计、课程设计及 Java 全栈开发学习参考。

2601_96413875的博客 327

1小时搭建SpringBoot+Vue2超市管理系统:课程设计实战指南

期末大作业、课程设计、毕业设计,这些词对计算机专业的学生来说,往往意味着连续数周的熬夜、无尽的Bug和令人焦虑的Deadline。尤其是当任务要求是“开发一个完整的管理系统”时,很多同学会陷入一个误区:试图从零开始,一行行代码去构建,结果在环境配置、框架整合、前后端联调这些前期环节就耗费了大量时间,真正核心的业务逻辑反而没时间深入。 如果你正面临这样的困境,这篇文章就是为你准备的。我们不谈空洞的理论,不搞复杂的架构,直接聚焦一个最实际的目标: 如何在最短时间内,搭建一个能跑起来、功能完整、代码清晰、可直接作

weixin_33979203的博客 400

Springboot中 使用request的几种方法。

1)直接在controller层方法中传入request对象参数:通过该方法得到的request对象是不同的,是线程安全。 (2)自动注入::通过该方法得到的request对象是不同的,是线程安全。 (3)通过在controller基类中进行自动注入::通过该方法得到的request对象是不同的,是线程安全。 (4)手动调用生成::通过该方法得到的re...

默默不代表沉默 1万+

SpringBoot+Vue前后端分离实战:构建大学生心理健康测评系统

前后端分离架构已成为现代Web开发的主流范式,其核心在于将用户界面与业务逻辑解耦,通过RESTful API进行通信。这种架构模式遵循了单一职责原则,使得前端专注于交互体验与视图渲染,后端则专注于数据处理与业务规则。从技术价值看,它提升了开发效率、便于团队协作,并增强了系统的可维护性与可扩展性。在实际应用场景中,诸如管理系统、数据仪表盘等复杂交互应用广泛采用此架构。本文以大学生心理健康测评系统为具体案例,深入剖析了如何运用SpringBoot与Vue.js技术栈实现前后端分离开发,涵盖了从环境搭建、数据库设

weixin_34163553的博客 386

SpringBoot开发——获取HTTP请求头(Header)的三种方法

SpringBoot获取HTTP请求头(Header)的三种方法

bjzhang75的博客 9138

SpringBoot 3.x + Vue 3 + AI 全栈健身管理系统:毕设实战与工程化指南

在软件开发领域,前后端分离架构已成为构建现代Web应用的主流范式。其核心原理在于将用户界面(前端)与业务逻辑(后端)解耦,通过RESTful API进行数据交互,从而实现关注点分离、提升开发效率和系统可维护性。这种架构的技术价值在于支持团队并行开发、便于技术栈独立演进,并能更好地适应多端(Web、移动端)需求。典型的应用场景包括各类中后台管理系统、电商平台以及企业级应用。本文聚焦于一个融合了前沿AI能力的全栈项目实践,深入探讨如何利用SpringBoot 3.x构建稳健的后端服务,并结合Vue 3与Type

weixin_33841722的博客 516

SpringBoot无人售货机后台管理系统设计与实战源码解析

在物联网与智能零售快速融合的背景下,设备管理平台逐渐成为企业数字化运营的核心基础设施。无人售货机作为典型的智能终端,其后台管理系统需要串联设备接入、订单交易、库存同步与支付对账等关键环节,本质上是一套融合设备管理、进销存与订单交易中心的综合业务系统。本文从业务场景出发,介绍基于SpringBoot框架的智慧无人售货机后台管理系统设计方案,涵盖技术选型、架构原则、核心模块实现要点以及高并发场景下的库存扣减与支付补偿机制。通过RESTful API实现设备心跳上报与指令下发,借助RabbitMQ异步处理高频数据

weixin_33901641的博客 540

树莓派计算模块摄像头连接与配置全攻略:从硬件跳线到软件驱动

在嵌入式视觉项目中,摄像头模组的连接与驱动是图像采集和视频分析的基础。其核心原理是通过CSI-2高速串行接口协议传输图像数据,并依赖I2C总线进行传感器寄存器配置。这一技术方案的价值在于为工业控制、机器人等嵌入式设备提供了稳定、高性价比的视觉感知能力。在实际应用中,开发者常面临摄像头无法识别、I2C通信失败等挑战,尤其是在使用树莓派计算模块时,其硬件接口需要通过I/O板引出,配置过程涉及设备树参数调整等关键步骤。本文聚焦于解决这些实际问题,详细拆解了从硬件连接到软件驱动的完整流程,特别是针对CM4、CM3+

weixin_29184075的博客 336

基于SpringBoot+Vue+微信小程序的学生心理健康测评系统全栈开发实践

在信息化校园建设中,学生心理健康管理日益受到重视。传统纸质问卷存在效率低、隐私性差等痛点,而数字化测评系统则能有效解决这些问题。其核心原理在于通过前后端分离架构,将科学心理量表数字化,并利用算法模型对答题数据进行自动化分析与评估。该技术的价值在于能够实现大规模、标准化、即时反馈的心理健康筛查,为早期预警和干预提供数据支持。应用场景广泛覆盖高校、中学等教育机构的学生心理普查与日常监测。本文以热门的SpringBoot后端框架和Vue.js前端框架为基础,结合微信小程序这一高普及率移动入口,详细拆解了一个具备完

weixin_30325487的博客 324

Mac M系列芯片用户必看:UTM虚拟机跑麒麟V10安装达梦DM8全流程避坑指南

本文为Mac M系列芯片用户提供了一份详尽的UTM虚拟机安装麒麟V10并部署达梦数据库DM8的实战指南。文章深入分析了在ARM架构下选择UTM而非其他虚拟化方案的原因,并详细拆解了从系统安装、SPICE工具配置、麒麟V10深度调优到DM8安装与避坑的全流程,重点解决了ARM环境下的兼容性与配置难题,帮助开发者高效搭建国产化开发测试环境。

ss78901的博客 940

SpringBoot+Vue智能停车场管理系统实战:从零搭建到核心代码解析

在Java Web开发领域,SpringBoot以其简化配置和快速开发的特性,成为构建企业级后端服务的首选框架。其核心原理在于通过自动配置和起步依赖,极大降低了Spring应用的入门门槛。Vue.js作为一款渐进式前端框架,凭借其响应式数据绑定和组件化开发模式,显著提升了用户界面的开发效率和可维护性。将SpringBoot与Vue结合,形成前后端分离架构,是现代Web开发的主流技术范式,其技术价值在于实现了关注点分离,使得前后端可以独立开发、测试和部署,提升了团队协作效率和系统可扩展性。这种架构广泛应用于各

weixin_30814329的博客 1083

【东华大学oj】找到最大数(一维数组->中等)

一天,老师布置了一个作业,要求对一串数字各不相同的数字串进行排序,大的在前,小的在后。接着,我从数字串中的第二个数字开始往后找,找到最大的一个,然后与第二个数字交换,这样的话我就能够确定排序后数字串中的第二个数字;明明研究发现,他的这个想法中最重要的一环就是在一串数字中找到最大的那个,然后与第一个数字交换,可是明明毕竟刚刚开始学习程序设计不久,无法写出较复杂的程序,所以明明想让你这位程序设计专家帮他的忙,帮助他把这段核心程序写出来,然后明明只需模仿着写就可以了。时间限制: 1S类别: 一维数组->中等。

的博客 525

L2-028 秀恩爱分得快(测试点3说明)

古人云:秀恩爱,分得快。互联网上每天都有大量人发布大量照片,我们通过分析这些照片,可以分析人与人之间的亲密度。如果一张照片上出现了 K 个人,这些人两两间的亲密度就被定义为 1/K。任意两个人如果同时出现在若干张照片里,他们之间的亲密度就是所有这些同框照片对应的亲密度之和。下面给定一批照片,请你分析一对给定的情侣,看看他们分别有没有亲密度更高的异性朋友?

daybreak_alonely的博客 1412

SpringBoot+Vue前后端分离项目实战:大学生心理健康测评系统开发指南

前后端分离架构已成为现代Web应用开发的主流范式,其核心思想是将用户界面与业务逻辑解耦,通过API进行通信。这种架构模式基于RESTful设计原则,使得前端(如Vue.js)和后端(如SpringBoot)可以独立开发、部署和扩展,提升了开发效率和系统可维护性。在技术价值上,它支持团队并行协作,便于技术栈选型,并能更好地应对高并发和复杂业务场景。在众多应用领域中,教育管理系统是典型实践场景之一,例如构建一个功能完整的心理健康测评平台。本文聚焦于一个基于SpringBoot和Vue.js实现的**大学生心理健

weixin_30843605的博客 393

YOLOv11损失函数原理与源码解读:从调参血泪史到源码级优化

本文深入解析YOLOv11目标检测模型的损失函数设计,揭示其相比前代的关键改进。重点剖析了回归损失中动态权重的小目标优化、分类损失的带温度系数softmax、以及目标损失的自适应阈值机制等创新点。作者通过源码分析指出常见实现陷阱,如梯度回传的正确处理方式、标签分配的匹配策略等。结合实战经验,给出针对小目标检测、类别误判等典型问题的调参建议,并分享实用的调试工具代码片段。最后强调损失函数调参需结合具体任务,指出后处理对实际部署效果的重要影响。全文以工程实践为导向,为开发者提供可直接落地的优化思路。

as1225120794的博客 442
上一篇: 【个人版】SpringBoot下Spring-Security自定义落地篇【四】
下一篇: 【新姿势】SpringBoot下时间配置新方式(同文件大小)
苏南(src)
博客等级 码龄10年 363粉丝 27原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值