SpringBootWeb应用源码解析:遗失的web.xmI

RustDesk网页端远程控制实战:如何用Web Client替代传统客户端(附安全配置建议) 本文详细介绍了RustDesk网页端远程控制的实战应用,包括其核心优势、配置流程及安全加固方案。通过Web Client替代传统客户端,用户可实现跨平台无缝体验和企业级管理效率,特别适合临时协作和移动设备使用。文章还提供了JWT身份验证、LDAP集成等安全配置建议,确保网页端访问的安全性。 阅读详情

SpringBootWeb应用源码解析

在 Spring 及 Spring Boot 的使用过程中,应用最广泛的当属 Web 应用,而 Web 应用又往往部署在像 Tomcat 这样的 Servlet 容器中。

本章将带领大家学习 Spring Boot 中 Web 应用的整合以及在此过程中与直接使用 Spring 的差别。

遗失的web.xmI

提到 Spring 的 Web 应用,我们首先想到的可能是 Spring MVC 框架和 web.xmI 等配置文件。而 Spring MVC 又是围绕 DispatcherServlet 这个核心类来展开的。

Spring Boot 当前是基于 Spring 5.2.x 版本,和传统的 Spring 启动有所不同。以前是通过在web.xml 中 配 置 Servlet 来 完 成 Spring MVC 的 启 动 , 但 在 Spring Boot 中 是 通 过Dispatch-erServletAutoConfiguration 来完成初始化工作的。在此过程中,web.xml 遗失了。

我们先回顾一下 Servlet 3.0 之前版本的操作。当我们创建一个 web 项目时,往往会在resources/WEB-INF 目录下创建一个 web.xml 文件, 该文件内配置了 Servlet 和 Filter 等功能。当 Spring MVC 出现后,web.xml 中 便有了 DispatcherServlet 的配置。

随着 Java EE 6 的发布,Servlet 3.0 作为 Java EE 6 规范体系的一员,也被慢慢推广并被用户接受。 Servlet 3.0 在 Servlet 25 的基础. 上提供了一些简化 Web 应用的开发和部署的新特性,无 xml 配置便是其中一项。

Servlet 3.0 提供了@WebServlet、@WebFilter 等注解, 可以使用注解来声明 Servlet 和Filter,这便有了抛弃 web.xml 的基础。同时,它还提供了可以在运行时动态注册 Servlet、Filter、 Listener 等更加强大的功能。 关于动态配置 Servlet,如果翻看 Servlet 3.0 中servlet-api 包下 ServletContext 接口定义的方法,你会看到如下方法定义。

public ServletRegistration. Dynamic addServlet(String servletName, String clas sName);

public ServletRegistration . Dynamic addServlet(String servletName, Servlet s

ervlet);

public ServletRegistration . Dynamic addServlet(String servletName,Class <? e

xtends Servlet> servletClass);public <T extends Servlet> T createServlet(Class<T> clazz)throws ServletExc

eption;

public ServletRegistration getServletRegistration(String servletName);

public Map<String, ? extends ServletRegistration> getServletRegistrations

();

}

在 Servlet 3.0 中还新增了 ServletContainerlnitializer 接口,在容器启动时使用 JAR 服务 API来发现其实现类,并将容器 WEB-INF/ib 目录下 jar 包中的类都交由该类的 onStartup 方法来处理。而 Servlet 和 Filter 在 Web 应用启动时可借助该接口的实现类和 Java 的 SPI 机制完成加载。

在Spring中 提 供 了ServletContainerlnitializer接 口 的 实 现 类SpringServletContainerlni-tializer, 该 类 在 其 onStartup 方 法 中 会 调 用 所 有WebApplicationInitializer 实现类的 onStartup 方法,将相关组件注册到容器中。而 Servlet和 Filter 也是 通过 WebApplicationitializer 的实现类完成创建和加载的。

基于以上新特性和演变,当我们使用 Spring Boot 时,Spring Boot 已经不知不觉地开始使用这些新特性了。至此,我们从发展的角度了解了 web.xml 消失的过程,在后面的章节我会详细讲解 Spring Boot 是如何进行 Web 应用的自动配置的。

SpringBootWeb应用源码解析:遗失的web.xmI

Web应用的自动配置

在 Spring Boot 项目中引入 spring-boot-starter-web 的依赖,Spring Boot 的自动配置机制便会加载并初始化其相关组件。整个自动配置原理在前面章节已经讲过,这里针对 Web 应用再进行一-次梳理。

在上一节中我们已经提到,Servlet3.0 中新增了ServletContainerlnitializer 接 口 , 而 在 Spring 中 又 提 供 了 其 实 现 类SpringServletContainerlnitializer 来 初 始 化 Servlet 。 但 在 Spring Boot 中 , 当 引 入spring-boot-starter-web 的依赖之后,Spring Boot 并未完全遵守 Servlet 3.0 的规范,也没有使用 Spring 中提供的 SpringServletContainerlnitializer 类,而是完全选择另外一套初始化流程。下面, 我们看一下初始化流程的源码。

根据自动配置的原理,我们在 spring-boot-autoconfigure 包中的 META-INF/spring.factories配置文件中找到了针对 Servlet 自动配置的 EnableAutoConfiguration。

#自动配置

org. springframework . boot . autoconfigure . EnableAutoConfiguration=\

org. springframework. boot . autoconfigure . web. servlet . DispatcherServletAutoCon下面对 EnableAutoConfiguration 类中的自动配置项目进行逐步分析。

DispatcherServlet 自动配置

DispatcherServlet 自动配置位于 DispatcherServletAutoConfiguration 类中。下面我们通过DispatcherServletAutoConfiguration 的源码来 了解其自动配置的过程。

首先来看 DispatcherServletAutoConfiguration 上面的注解。

@Configuration(proxyBeanMethods = false)

@ConditionalOnWebApplication(type = Type . SERVLET)

@ConditionalOnClass(DispatcherServlet. class)

@AutoConfigureAfter(ServletwWebServerFactoryAutoConfiguration. class)

public class DispatcherServletAutoConfiguration {}

这些注解的基本功能在前面章节已经提到过,我们再来温习一下。

  • @AutoConfigureOrder:指定自动配置加载的顺序。
  • @Configuration:指定该类为配置类,交给 Spring 容器管理,默认指定不使用代理。
  • .@ConditionalOmWebApplication:表示只有 Web 应用才会加载此类。
  • @ConditionalOnClass:表示只有存在 DispatcherServlet 类的情况下才会加载此类。
  • . @AutoConfigureAfter : ServletWebServerFactoryAutoConfiguration 加载完成之后才会加此 类。

关于 ServletWebServerFactoryAutoConfiguration 的加载会在下一章中详细讲解。

从整体上来看,在 DispatcherServletAutoConfiguration 内部主要提供 了 4 个静态内部类。

  • :DispatcherServletConfiguration:主 要用来初始化 DispatcherServlet。
  • :DispatcherServletRegistrationConfiguration :主要用来将 DispatcherServlet 注册到系统中。
  • :DefaultDispatcherServletCondition :主要针对容器中 DispatcherServlet 进行一些逻辑判断。
  • :DispatcherServletRegistrationCondition :

主要针对注册 DispatcherServlet 进行一些逻辑判断。

针对以上概述,下面来看具体的源代码实现。首先是内部类 DispatcherServletConfiguration的源码及功能。

@Configuration(proxyBeanMethods = false)

//实例化配置类

@Conditional (DefaultDispatcherServletCondition.class) //实例化条件:通过该

@ConditionalOnClass (ServletRegistration. class)

//存在指定的 ServletRe

gistration 类//加裁 HttpProperties 和 webMvcProperties

@EnableConfigurationProperties({ HttpProperties. class, WebMvcProperties .cla

s })

protected static class DispatcherServletConfiguration {

@Bean(name = DEFAULT DISPATCHER_ SERVLET_ BEAN NAME)

public DispatcherServlet dispatcherServlet (HttpProperties httpProperties ,

WebMvcProperties webMvcProperties) {

//创建 DispatcherServlet

DispatcherServlet dispatcherServlet = new DispatcherServlet();

//初始化 DispatcherServlet 各项配置

dispatcherServlet . setDispatchOptionsRequest (webMvcProperties . isDispatch

OptionsRequest());

dispatcherServlet . setDispatchTraceRequest (webMvcProperties . isDispatch-

TraceRequest());

dispatcherServlet. setThrowExceptionI fNoHandlerFound(webMvcProperties. is

ThrowExcept ionIfNoHandlerFound();

di spatcherServlet . setPublishEvents (webMvcProperties . isPublishRequestHan

dledEvents());

dispatcherServlet . setEnableLoggingReques tDetails (httpProperties. isLog-

RequestDetails());

return dispatcherServlet;

//初始化上传文件的解析器

@Bean

@ConditionalOnBean(MultipartResolver . class)

@ConditionalOnMissingBean(name = DispatcherServlet . MULTIPART_ RESOLVER_

BEA

NAME)

public MultipartResolver multipartResolver(MultipartResolver resolver) {

//检测用户是否创建了 MultipartResolver, 但命名不正确

return resolver;

}

}

通过以上源码可以看出,当满足指定的条件后,会对 DispatcherServletConfiguration 进行实例化,而该类内部通过@Bean 注解的方法会被实例化,生成 Bean 并注入 Spring 容器中。

其中,在 DispatcherServlet 方法中完成 了 DispatcherServlet 的实例化和基本设置。这里既没有用到 SPI 机制,也没用到 Spring 提供的 SpringServletContainerlnitializer 和 Servlet3.0 的 ServletContainerlnitializer 接口,从而验证了 6.2 节提到的说法。

DispatcherServlet 方法将 DispatcherServlet 实例化的 Bean 注入 Spring 容器中,并且指定Bean 的 name 为 dispatcherServlet。该名称默认会被映射到根 URL 的/访问路径。

DispatcherServlet 作为前端控制器设计模式的实现,提供了 Spring WebMVC 的集中访问点,负责职责的分派,与 Spring loc 容器无缝集成,可以获得 Spring 的所有好处。它的主要作用包括:文件上传解析、请求映射到处理器、通过 ViewResolver 解析逻辑视图名到具体视图实现、本地化解析、渲染具体视图等。

在未使用 Spring Boot 时,通常 DispatcherServlet 类的配置需要开发人员在 web.xml 当中进行配置。这里 Spring Boot 通过自动配置完成了 DispatcherServlet 类的配置和初始化,并 在 此 过 程 中 设 置 了 一 些 初 始 化 的 参 数 。 这 些 参 数 通 过 HttpProperties 和WebMvcProperties 获得。

DispatcherServletConfiguration 中还定义了上传文件的解析器 MultipartResolver 的 Bean初始化操作,准确来说是 Bean 名称转化的操作。通过条件注解判断,当 MultipartResolver的 Bean 存在,但 Bean 的名称不为“multipartResolver”时,将其重命名为“multipartResolver'我们再回到 DispatcherServletConfiguration 的注解部分,@Conditional 指定的限定条件类为 DefaultDispatcherServletCondition,该类是 DispatcherServletAutoConfiguration 的另外一个内部类,代码如下。

@Order (Ordered. LOWEST_ PRECEDENCE- 10)

private static class DefaultDispatcherServletCondition extends SpringBootCo

ndition {

@Override

public ConditionOutcome getMatchOutcome (ConditionContext context ,

AnnotatedTypeMetadata metadata) {

ConditionMessage . Builder message = ConditionMessage

. forCondition("Default DispatcherServlet");

ConfigurablelistableBeanFactory beanFactory = context. getBeanFactory();

//获取类型为 Di spatcherServlet 的 Bean 名称列表

List<String> dispatchServletBeans = Arrays . asList(beanFactory

. getBeanNamesForType

(DispatcherServlet.class, false, false));

//如果 Bean 名称列表中包含 dispatcherServlet,则返回不匹配

if (dispatchServletBeans. contains (DEFAULT_ DISPATCHER_ SERVLET_ BEAN_ NAM

E)) {

return ConditionOutcome . noMatch (message . found("dispatcher servlet bea

n")

. items (DEFAULT_ DISPATCHER_ SERVLET_ BEAN_ NAME));

// 如果 beanFactory 中包含名称为 Di spatcherServlet 的 Bean, 则返回不匹配

if (beanFactory. containsBean(DEFAULT_ DISPATCHER_ SERVLET_ BEAN NAME)) {

return ConditionOutcome

. noMatch(message . found("non dispatcher servlet bean")

. items (DEFAULT_ DISPATCHER_ SERVLET_ BEAN_ NAME));

//如果 Bean 名称列表为空,则返回匹配

if (dispatchServletBeans . isEmpty()) {

return ConditionOutcome

. match(message . didNotFind(”dispatcher servlet beans").atAll());

//其他情况则返回匹配

return ConditionOutcome . match(message

. found("dispatcher servlet bean", "dispat

cher servlet beans")

. items (Style . QUOTE, dispatchServletBeans)

. append("and none is named ”+ DEFAULT_ DI

SPATCHER_ SERVLET_ BEAN_

NAME));

}

}

DefaultDispatcherServletCondition 的最核心业务逻辑只做了一件事,那就是:防止重复生成DispatcherServlet。具体实现流程为:从上下文中获得 beanFactory, 然后通过 beanFactory获取类型为 DispatcherServlet 的 Bean 的 name 列表,然后分别 判断 name 列表和beanFactory 中是否包含名称为“dispatcherServlet"的字符串或 Bean,如果包含则返回不匹配(已经存在,不匹配则不会重复实例化),否则返回匹配。

DispatcherServletConfiguration 类中还有-个注解@EnableConfigurationProperties,该注解指定了两个配置类:

HttpProperties 和 WebMvcProperties。这两个配置类正是上面初始化 DispatcherServlet 时用于初始化的参数值,查看这两个类的源代码就会发现,它们分别对应加载了以“spring.http"和"spring.mvc"为前缀的配置项,可以在 application properties 文件中进行配置。

@ConfigurationProperties(prefix = "spring . http" )

public class HttpProperties {}

@ConfigurationProperties(prefix = "spring . mvc")

public class WebMvcProperties {}

SpringBootWeb应用源码解析:遗失的web.xmI

DispatcherServletRegistrationBean 自动配置

下面我们再来看用于注册的 DispatcherServletRegistrationConfiguration 类。关于该类的注解功能可以参考 DispatcherServletConfiguration 的说明,我们主要看:业务逻辑处理。

@Configuration( proxyBeanMethods = false)

@Conditional (DispatcherServletRegistrationCondition. class)

@ConditionalOnClass (ServletRegistration. class)

@EnableConfigurationProperties (WebMvcProperties .class)

@Import (DispatcherServletConfiguration.class)

protected static class DispatcherServletRegistrationConfiguration {

@Bean(name = DEFAULT_ DISPATCHER_ SERVLET_ REGISTRATION_ BEAN AME)

@ConditionalOnBean(value=

DispatcherServlet.class,

name=DEFAULT_

DISPATCHER_

SERVLET_ BEAN_ NAME)

public

DispatcherServletRegistrationBean

di

spatcherServletRegistration(DispatcherServlet dispatcherServlet,

n We

bMvcProperties webMvcProperties, objectProvider<MultipartConfigElement> ul

tipartConfig) {

//通过 ServletRegistrat ionBean 将 dispatcherServlet 注册为 Servlet,这样 serv

Let 才会生效

Di spatcherServletRegistrationBean registration = new DispatcherServletR

egistrationBean( dispatcherServlet ,

webMvcProperties . getServlet(). getPath());

//设置名称为 di spatcherServlet

registration. setName(DEFAULT_ DISPATCHER_ SERVLET_ BEAN NAME);

// 没 置 加 载 优 先 级 , 没 置 值 默 认 为 -1 , 存 在 FwebMvcProperties 类 中 registration.

setLoadOnStartup(webMvcProperties . getServlet(). getLoadOn-Startup());

multipartConfig. ifAvailable(registration::setMultipartConfig);

return registration;

}

}

DispatcherServletRegistrationConfiguration 类的核心功能就是注册 dispatcherServlet,使其生效并设置一一些初始化的参数。

其 中 DispatcherServletRegistrationBean 继 承 自 ServletRegistrationBean , 主 要 为DispatcherServlet 提供服务。

DispatcherServletRegistrationBean 和 DispatcherServlet 都提 供了注 册 Servlet 并公开DispatcherServletPath 信息的功能。

在 dispatcherServletRegistration 方 法 中 直 接 通 过 new 来 创 建DispatcherServletRegistrationBean,第一个 参数为 DispatcherServlet,第二个参数为application 配置文件中配置的 path 值,相关代码如下。

public class DispatcherServletRegistrationBean extends ServletRegistratiomB

ean<DispatcherServlet> implements Di spatcherServletPath {

private final String path;

//根据指定的 DispatcherServlet 和给定的 path 创建 DispatcherServletRegistratio

nBean

public DispatcherServletRegistrationBean(DispatcherServlet servlet, Strin3 path) {

super(servlet);

Assert . notNull(path, "Path must not be null");

this.path = path;

super . addUrlMappings (getServletUrlMapping());

/重写父类的方法,但抛出异常,相当于禁用该操作

@Override

public void setUrlMappings (Collection<String> urlMappings) {

throw new UnsupportedOperationException("URL Mapping cannot be changed

on a DispatcherServlet registration");

//重写父类的方法,但抛出异常,相当于禁用该操作

@verride

public void addUrlMappings(String... urlMappings) {

throw new UnsupportedOperationException("URL Mapping cannot be changed

on a DispatcherServlet registration");

}

}

在 DispatcherServletRegistrationBean 中实现了 setUrlMappings 和 addlUrlManninas 两种方法,但均直接抛出异常,这相当于禁用了该子类中这两项操作。而在构造方法中除了成员变 量 赋 值 之 外 , 还 调 用 了 父 类 ServletRegistrationBean 的 构 造 方 法ServletRegistrationBean(Tservlet,String...urlMappings)和addUrlMappings(String...urlMappings)方法。

关于 ServletRegistrationBean 的构造方法和 addUrlMappings 只是进行成员变量的赋值和设 置 , 我 们 重 点 看 DispatcherServletRegistrationBean 在 构 造 方 法 中 调 用 的getServletUrlMapping 方法。顾名思义,该方法的功能是获取 Servlet 的 URL 的匹配。该方法具体在 DispatcherServletRegistrationBean 实现的接口 DispatcherServletPath 中定义。

DispatcherServletPath 的 主 要 功 能 是 提 供 自 动 配 置 所 需 的 path 信 息 , 而DispatcherServletRegistrationBean 中的 path 信息正是构造方法传入的。

下面我们来看 DispatcherServletPath 中 getServletUrlMapping 方法的具体实现。

@FunctionalInterface

public interface DispatcherServletPath {

//返回一个 URL 匹配表达式,用 FServletRegistrat ionBean 映射对应的 DispatcherSe

rvlet

default String getServletUrlMapping() {

if (getPath(). equals("") || getPath(). equals("/")) {

return "/";

if (getPath(). contains("*")) {

return getPath();

if (getPath(). endsWith("/")) {

return getPath() + *";

return getPath() + "/*";

}

}

getServletUrlMapping 方法为接口的默认实现方法,返回一个用于 ServletRegistrationBean映射 DispatcherServlet 的 URL 表达式。判断逻辑比较简单:如果获得的 path 为空或“/”,则返回“/”; 如果 path 中包含“”,则直接返回 path;如果 path 以“/"结尾,则对 path 后追加“”;其他 情 况 下 , path 后 面 追 加 关 于 dispatcherServletRegistration 方 法 中 对DispatcherServletRegistrationBean 其他属性的简单赋值操作就不再赘述了。

我们再回到针对 DispatcherServletRegistrationConfiguration 的注解@Conditional 指定的限定条件类 DispatcherServletRegistrationCondition,该限定条件类主要用来判断进行dis-patcherServlet 和 dispatcherServletRegistration 是否存在等。

DispatcherServletRegistrationCondition 中判断条件及代码较多,这里只展示顶层判断方法的源代码。

@Order (Ordered. LOWEST_ PRECEDENCE - 10)

private static class DispatcherServletRegistrationCondition extends SpringBoot-Condition

{

@Override

public ConditionOutcome getMatchOutcome(ConditionContext context, Annotated-

TypeMetadata metadata) {

ConfigurableListableBeanFactory beanFactory = context . getBeanFactory();

//判断是否重复存在 dispatcherServlet

ConditionOutcome outcome = checkDefaultDispatcherName (beanFactory);

if (!outcome . isMatch()) {

return outcome ;//判断是否重复存在 dispatcherServletRegistration

return checkServletRegistration(beanFactory);

}

DispatcherServletRegistrationCondition 的 getMatchOutcome 方 法 中 分 别 判 断 了dispatcherServlet 和 dispatcherServletRegistration 是否已经存在对应的 Bean。具体判断方法基本与上节讲到的 DefaultDispatcherServletCondition 的判断方法一致。

至此,在该自动配置类中,DispatcherServlet 的创建、 简单初始化和注册已经完成。当第一次接收到网络请求时,DispatcherServlet 内部会进行一 系列的初始化操作,这些更多属于 Spring 的内容,就不再展开了。

SpringBootWeb应用源码解析:遗失的web.xmI

本文给大家讲解的内容是SpringBootWeb应用源码解析:遗失的web.xmI和Web应用的自动配置

  1. 下篇文章给大家讲解的是SpringBootWeb应用源码解析:Spring MVC 的自动配置;
  2. 觉得文章不错的朋友可以转发此文关注小编;
  3. 感谢大家的支持!
用大白话讲解Carplay(原创) 用大白话讲解Carplay: Carplay是美国苹果公司开发的一套服务,用户通过这套服务可以将iPhone与车载系统连接,然后在车载大屏上操作使用iPhone手机。个人理解,Carplay不能叫车载系统,不是操作系统,只能算一种服务。让你在车上的大屏上使用iPhone,这样用起来更方便,不需要在手机小屏幕上操作。基于这一点,有些人也说Carplay就是个投屏的功能,将手机屏幕投屏到了车机大屏上。可以简单这么理解,但是并不只是投屏这么简单,如果只是投屏的话,车子只是起到了一个显示器的功能,其实不止,手机和 阅读详情

相关推荐

算法笔记 经典取石子游戏总结 博弈论

经典取石子游戏总结 1.巴什博弈 有一堆石子共n个,A和B轮流取,A先取。每次最少取1个,最多取m个,先取完者获胜(即没有石子取的人失败)。A与B都足够聪明,问A能否获胜。 结论:当n%(m+1)!=0时A必胜,否则必败。 2.斐波那契博弈 有一堆石子共n个,A和B轮流取,A先取。每次最少取1个。第一次不能取完。从第二次开始,每个人取的石子数至少为1,至多为前一个人取的石子数的2倍。先取完者获胜。...

CraigMC的博客 2938

Springboot中怎么没有web.xml

一、web.xml的作用 当浏览器有一个request请求时,首先到达web容器,然后web容器会查询web.xml寻找对应的servlet文件。所以说,web.xml其实就是web应用给web容器的一个说明书。二、springboot的机制 springboot作为一个快速开发框架,其本身并不能代替web.xml配置,但是它比较仇视xml文件,于是就求助于servlet。servlet包中有一个 ServletContainerInitializer接口,在servlet容器启动时,会获取该接口的所有实现

weixin_48045037的博客 2327

BMW Trojan 样本分析

仅用于链接已经删却但是需要方便查阅的原文http://blog.csdn.net/zirconsdu/article/details/7997470 转载请注明出处http://blog.csdn.net/zirconsdu/article/details/8153813。 一些具体数据结构和具体路径隐去。   BMW木马样本分析 摘要 2011年底和某Hunter的谈话涉及到当时新检

zirconsdu的专栏 3912

SpringBoot为什么没有web.xml了

SpringBoot为什么没有web.xml了 今天我们来放松下心情,不聊分布式,云原生,来聊一聊初学者接触的最多的 java web 基础。几乎所有人都是从 servlet,jsp,filter 开始编写自己的第一个 hello world 工程。那时,还离不开 web.xml 的配置,在 xml 文件中编写繁琐的 servlet 和 filter 的配置。随着 spring 的普及,配置逐渐演变成了两种方式—java configuration 和 xml 配置共存。现如今,springboot 的普及

我的博客 3728

数字滤波器应用介绍

线性滤波器FIR ,会引起恒定延迟,通过补零的方式补偿非线性滤波器IIR,会引起频率相关的延迟,通过零相位延迟filtfilt补偿从信号中去除不需要的频谱时,通过滤波和补偿实现。如果需要去除的频率与采样率相差甚远,比如4kHz 与100Hz, 可通过 低通滤波->补偿->降采样–> 滤波 补偿 -->上采样还原的方法。*降采样前一定要先低通滤波为了防止混叠。

weixin_39107270的博客 275

Apifox接口测试+自动化测试

Apifox 接口测试+自动化测试快速入门!

程序员小杨哥的博客 1万+

深入Spring Boot :web.xml去哪了

至此,我们已经了解了web.xml是如何被替换的,我们也发现框架封装的东西越来越多,集成度也越来越高,框架虽好,如果我们不了解来龙去脉,只做一个工具的使用者,时间久了,我们也就是一个工具人,所以,研究一下why、what和how很有必要。

dyuan134的博客 1003

Python 爬虫实战:爬取 BOSS 直聘职位,实现岗位要求关键词提取

摘要:本文基于BOSS直聘数据分析师岗位信息,采用Python爬虫技术获取职位数据,通过文本分析和可视化方法研究岗位技能需求特征。研究首先设计爬虫程序获取职位基本信息和岗位要求文本,经数据清洗后运用jieba分词和词频统计提取关键词。结果显示SQL、Python为最核心技能,不同级别岗位需求差异明显:初级重基础数据处理,高级需建模和管理能力;行业间亦存在差异,互联网关注用户增长,金融侧重风控。研究为求职者技能提升提供了数据支持,同时展示了从非结构化文本中挖掘有价值信息的完整流程。

2503_91057718的博客 1768

springboot 无web.xml代码精华

Java configuration registers and initializes theDispatcherServlet public class MyWebApplicationInitializer implements WebApplicationInitializer { @Override public void onStartup(ServletContext servletCxt) { // Load Spring web applicat..

yaobo2816的专栏 264

Open-Sora代码详细解读(2):时空3D VAE

目前开源的DiT视频生成模型不是很多,Open-Sora是开发者生态最好的一个,涵盖了DiT、时空DiT、3D VAE、Rectified Flow、因果卷积等Diffusion视频生成的经典知识点。本篇博客从Open-Sora的代码出发,深入解读背后的原理。

沉迷单车的追风少年 2054

Mac安装Claude Code的3种方式及5类报错解决方案

介绍在Mac上安装Claude Code的3种实测可行方式(官方dmg、Homebrew+ARM原生构建、Docker容器化),并针对Gatekeeper签名验证失败、Rosetta 2内存对齐崩溃、Python ABI兼容性冲突等5类高频报错提供根因分析与可复现解决方案,覆盖M1–M3及Intel

weixin_28728443的博客 365

spring boot没有web.xml,如何向嵌入式的servlet容器中注册servlet组件

1. Spring boot默认使用Tomcat作为嵌入式的servlet容器,只要引入spring-boot-starter-web依赖,就会默认用Tomcat作为servlet容器。 2. Spring boot默认以jar包的方式启动嵌入式的servlet容器,来启动spring boot的web应用,没有web.xml 3. 以往要注册servlet组件都是在web.xml文件中配置,现在没有了web.xml,该如何注册。 4. spring boot提供ServletRegistration

想好了就去做吧 即便失败了 至少这条路上留下了你的脚印 880

游戏玩家和排行数据抓取:使用 Python 爬虫抓取游戏中的玩家排名、角色数据和战绩

对于游戏开发者、分析师和玩家本身来说,抓取游戏中的玩家排名、角色数据和战绩信息是一项至关重要的任务。Python提供了强大的爬虫库和数据处理工具,可以帮助我们高效地抓取和分析游戏数据,为游戏分析师、开发者以及玩家本身提供有价值的数据支持。通过本篇博客,我们学习了如何使用Python爬虫技术抓取游戏中的玩家排名、角色数据和战绩。本篇博客将详细介绍如何使用Python编写爬虫来抓取游戏中的玩家排名、角色数据和战绩,并结合最新的技术来实现高效的数据抓取与处理。为了方便后续的数据处理,我们将抓取的数据保存到。

2201_76125261的博客 946

spring boot web_SpringBootWeb应用源码解析:遗失的web.xmI

SpringBootWeb应用源码解析在 Spring 及 Spring Boot 的使用过程中,应用最广泛的当属 Web 应用,而 Web 应用又往往部署在像 Tomcat 这样的 Servlet 容器中。本章将带领大家学习 Spring Boot 中 Web 应用的整合以及在此过程中与直接使用 Spring 的差别。遗失的web.xmI提到 Spring 的 Web 应用,我们首先想到的可能是...

weixin_39678525的博客 196

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

贝叶斯统计 [韦来生编]

贝叶斯(Bayes)统计是近几十年来迅速发展起来的数理统计的一个重要分支。贝叶斯方法与经典统计方法的主要不同之处是进行统计推断时除了利用样本信息外,还要利用参数的先验信息,因此可以提高统计推断或统计决策的效果。它在经济、金融、生物、医学、自然科学和社会科学等许多领域具有广泛的应用。贝叶斯方法的研究已渗透到了统计学的几乎所有领域。作者在给中国科学技术大学概率论与数理统计专业本科生开设的“数理统计”课程中有一章专门讲授“贝叶斯方法和统计决策理论”,近十年来也给中国科学技术大学概率统计专业研究生开设过几次“贝叶斯分析”课。本书是在对过去讲稿的内容作了适当的增减和调整的基础上完成的。  本书共分六章。第1章是绪论,介绍了贝叶斯统计的若干基本概念,同时对必要的数理统计的基础知识有重点地作了回顾。第二章介绍了确定先验分布的若干可供选择的方法。第三章介绍了几类常见统计模型参数的后验分布的主要结果和计算方法。第四章和第五章分别介绍了“贝叶斯统计推断”和“贝叶斯统计决策”的内容。第六章介绍了贝叶斯统计计算的若干方法,包括蒙特卡洛方法和马尔可夫链蒙特卡洛(MCMC)方法以及相关统计软件的简介。本书的每一章附右大量的例题和习题,书末附有常用的几个表格和部分习题解答供读者查用。  大约可在54学时内讲授本书的第1章至第六章的主要内容,教师可根据学时需要选讲本书第1章至第六章的部分内容。书中标“*”号的章节可略去不讲,留给读者作为阅读材料。第六章例题中的R代码和部分例题的数据文件等可从作者个人主页下载。  作者在编写本书的过程中参考了J.O.Berger教授的《统计决策论及贝叶斯分析》和茆诗松教授编写的《贝叶斯统计》等书中的一些内容,以及《贝叶斯分析》一书中由张伟平博士编写的有关贝叶斯统计计算的一些内容。在此表示衷心感谢。  本书编写准备过程中,中国科学技术大学统计与金融系的几个研究生帮助完成了本书部分中文的录入和排版,作者对他们的辛勤工作表示真诚的感谢。高等教育出版社为本书的出版给予了大力支持。在此一并致谢。

【springboot 】web.xml去哪了 1 (SpringServletContainerInitializer接口、WebApplicationInitializer接口)

文章目录前言1:web.xml是怎么没的?1.1:Servlet3.0之前1.2:Servlet3.02. 项目实战3. springMVC如何集成servlet3.03.1 WebApplicationInitializer接口源码3.2 WebApplicationInitializer接口实战4. springboot如何集成spring MVC4.1:通过servlet3注解+@ServletComponentScan参考 相关文章: Spring MVC的web.xml配置详解(ContextLo

m0_45406092的博客 1132

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Spring Boot 对传统 Spring MVC 配置的简化处理

传统 Spring MVCSpring Boot 方式web.xml自动配置,嵌入式容器WebMvcConfigurer + 自动配置手动组件扫描@ComponentScan 自动生效显式视图解析器配置spring.mvc.view.* 属性配置手动事务管理配置Spring Boot 通过自动配置和约定大于配置的原则,让开发者只需关注业务代码,而无需处理繁琐的 XML 配置。

JiFeng12138的博客 880

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

SpringBoot为什么没有web.xml了(转)- 深度好文

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33834679的博客 3600

springboot是如何在没有web.xml的情况下在外部tomcat启动的

springboot是如何在没有web.xml的情况下在外部tomcat启动的 最近在公司部署测试环境的时候遇到了问题,本地用springboot内嵌tomcat启动没有问题,部署到测试环境的外部tomcat就不加载,在咨询了同事之后在启动类上继承了SpringBootServletInitializer之后就没有了问题,但并没有深入去想。由于servlet的规范是要配置web.xml的,包括Struts2和spring都是要在web.xml配置的,有一天在服务器上看编译后的目标文件中居然没有web.xm

老王的博客 2534

SpringBoot消失的Web.xml

Filter 过滤器作为web.xml中重要的一部分,有着相当高的出场率,SpringBoot会默认注册几个Filter ApplicationContextHeaderFilter CharacterEncodingFilter 如果添加了Security依赖的话会加入SpringSecurityFilterChain 如果加入Actuator依赖的话就会加入Web

wang11234ilike的博客 2万+

SpringBoot 配置 web.xml

首先我们先配置welcomefile-list 我们先声明一个类继承WebMvcConfigurerAdapter 重写如下方法即可 注解不能忘 @Configuration @EnableWebMvc @ComponentScan(basePackages = @Override public void addViewControllers(ViewControllerRe

confoo的专栏 2万+

springboot 、spring web中 为什么没有 web.xml(链接)

springboot 为什么没有 web.xml 了 spring web 项目为什么没有了 web.xml

猎人在吃肉 1002

IDEA Springboot项目 怎么自动生成webapp和下面的xml文件(详细)

简介 springboot 创建项目之后是没有webapp的,今天讲讲idea怎么生成和下面的xml     我的路径:     C:\Mytool\Test\springboot\springboot_demo02\src\main\webapp\WEB-INF\web.xml                     C:\Mytool\Test\springboot\...

qq_37415950的博客 2万+

关于spring boot的web.xml

spring boot项目为什么没有web.xml servlet3.0规范中,可以通过java配置(注解等)代替web.xml,spring boot就是使用java代替了web.xml。 其中javax.servlet.ServletContainerInitializer负责web容器启动阶段被回调,在onStartup方法里注册servlet、filter、listener等。 sprin......

生而为人我很抱歉 2万+

web.xml文件详解(JavaWeb)

web.xml文件是Java Web应用中必不可少的配置文件,它包含了Java Web应用的所有配置信息。本文详细介绍了web.xml文件的语法、配置组件、配置参数、继承关系以及ServletContext的使用方法。希望读者可以通过本文了解到更多关于web.xml文件的知识。

互联说 3074

Spring boot之ServletContextInitializer

Spring Boot提供的在Servlet 3.0+环境中用于程序化配置ServletContext的接口。该接口 ServletContextInitializer主要被RegistrationBean实现用于往ServletContext容器中注册Servlet,Filter或者EventListener。这样设计的目的主要是旨在降低用于在war包中第三方库可能破坏spring boot 应用的风险,同时也方便spring容器管理这些beans。这些ServletContextInitializer实

bearboy80的专栏 3025
上一篇: 20年IT老民工苦心编撰成超大流量分布式系统架构解决方案文档
下一篇: SpringBoot外化配置源码解析:Profile处理实现
爱玛士
博客等级 码龄7年 720粉丝 253原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值