SpringMVC Day 11 : 零 xml 配置

前言

欢迎来到《Spring MVC Day 11: 零XML配置》!在之前的学习中,我们已经掌握了如何使用Spring MVC框架构建灵活、高效的Web应用程序。然而,我们可能还记得那些繁琐的XML配置文件,它们是我们在过去几天中使用的方式。

好消息是,今天我们将告别这种繁琐的XML配置文件!在本文中,我们将介绍如何在Spring MVC中实现零XML配置,通过使用全注解和Java配置类来代替传统的XML配置文件。这将使我们的代码更加简洁、可读性更强,并且更加符合现代化的开发模式。

我们将逐步学习如何使用注解来替代XML配置文件的各个方面,包括控制器、请求映射、视图解析器等。通过这种新的方式,你会发现编写和维护Spring MVC应用程序将变得更加轻松和高效。

一、前期准备

1、新建项目,结构如下

2、导入依赖
    <dependencies>
    
        <!-- springmvc 依赖,会将spring的核心包一并添加进来 -->
        <!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.3.23</version>
        </dependency>
     
 
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.30</version>
        </dependency>
 
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>1.4.5</version>
        </dependency>

          <!-- 集成 hibernata bean 验证器 -->
        <dependency>
            <groupId>org.hibernate.validator</groupId>
            <artifactId>hibernate-validator</artifactId>
            <version>6.0.13.Final</version>
        </dependency>

         <!-- 上传组件 -->
        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.3.1</version>
        </dependency>
 
 
 
    </dependencies>
3、在 resources 包下新建一个 message.properties 
user.username = 请输入用户名
user.password = 请输入密码

 用于表单验证,非空判断的信息。

4、新建一个 User 类
@Data
public class User {

    @NotEmpty(message = "{user.userName}")
    private String userName;
    @NotEmpty(message = "{user.password}")
    private String password;

}

该类使用了@Data注解,这个注解是Lombok库中的一个注解,它自动为类生成了一些通用的方法,如equals()hashCode()toString()等。

此外,User类中还有两个成员变量userNamepassword,它们都使用了@NotEmpty注解。@NotEmpty注解是Hibernate Validator库中的一个注解,用于验证字符串不能为空。在这个例子中,如果userNamepassword为空,将会抛出一个包含特定错误消息的异常。

总体而言,这段代码定义了一个简单的用户类,在进行数据校验时,要求用户名和密码均不能为空。通过使用@Data@NotEmpty注解,我们可以简化代码,并且在需要验证用户输入时提供了方便的方式。

5、编写一个登录拦截器 LoginInterceptor

@Slf4j
public class LoginInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        log.info("执行拦截器的 preHandle 方法");
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        log.info("执行拦截器的 postHandle 方法");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
       log.info("执行拦截器的 afterCompletion 方法");
    }

}

在拦截器的postHandle方法中,通过重写postHandle方法,你可以在请求处理之后、渲染视图之前执行一些操作。在这个例子中,拦截器又打印了一条日志信息,表示正在执行postHandle方法。

在拦截器的afterCompletion方法中,通过重写afterCompletion方法,你可以在请求完成之后执行一些操作。在这个例子中,拦截器同样打印了一条日志信息,表示正在执行afterCompletion方法。

需要注意的是,拦截器需要注册到Spring MVC的配置中才能生效。你可以通过配置WebMvcConfigurer或者使用@Configuration注解的配置类来注册拦截器。

在实际应用中,你可以根据具体需求在拦截器的各个方法中编写自己的业务逻辑,例如登录验证、权限控制等。拦截器是一种强大的工具,可以用于在请求处理过程中进行预处理和后处理操作。

6、编写一个 Controler 
@RestController
public class UserController {

    @PostMapping("/add")
    public Integer add(@Valid User user){
        return HttpStatus.OK.value();
    }

}

 在方法上,使用了@PostMapping("/add")注解来指定对应的请求路径和请求类型。同时,你还使用了@Valid注解,表示需要对User对象进行数据校验。

如果User对象中的userNamepassword为空,将会抛出包含特定错误消息的异常。如果数据校验成功,add方法将返回HTTP状态码200,表示请求处理成功。

 二、创建 MvcConfig、WebConfig 配置类

1、MvcConfig 配置类
1)静态资源处理,方式一
// 声明为配置类
@Configuration
// 启用包扫描
@ComponentScan(basePackages = "edu.nf.ch11")
// 启用 mvc 注解驱动(等效于<mvc:annotation-driven/>)
@EnableWebMvc
// 实现 WebMvcConfigurer 接口用于覆盖默认的配置
public class MvcConfig implements WebMvcConfigurer {
    /**
     *  配置类支持依赖注入,配置类也是容器管理的
     */
//    @Autowired
//    private LoginInterceptor loginInterceptor;

    /**
     * 静态资源处理方式一:使用容器默认的 servlet 来处理
     * 注意:重写 WebMvcConfig 接口方法时不需要使用 @Bean
     *      注解来装配
     */
    @Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
        // enable() 方法表示启用容器默认 servlet 处理静态资源
        configurer.enable();
    }
}

这段代码是Spring MVC的配置类,具体功能和作用如下:

  1. @Configuration注解表示这是一个配置类,会被Spring容器扫描并进行管理。

  2. @ComponentScan注解启用包扫描,指定要扫描的基础包路径为"edu.nf.ch11"。这个注解让Spring自动扫描并注入带有特定注解的组件,使得它们能够被容器管理。

  3. @EnableWebMvc注解启用MVC注解驱动,相当于XML配置文件中的<mvc:annotation-driven/>标签。这个注解会自动注册一些默认的组件,例如处理器映射、参数解析器和视图解析器等,以支持使用注解来简化开发。

  4. 实现WebMvcConfigurer接口用于覆盖默认的配置。通过实现这个接口,可以对Spring MVC的配置进行个性化定制。

  5. configureDefaultServletHandling方法重写了WebMvcConfigurer接口的方法,通过调用configurer.enable()启用容器默认的servlet来处理静态资源。这样,不需要再额外配置静态资源的处理,容器会自动处理静态资源的访问请求。

  6. 注释掉了@Autowiredprivate LoginInterceptor loginInterceptor部分代码。这部分代码可能是用于注入并配置一个登录拦截器,但在这个配置类中被注释掉了,可能是因为其他原因。

总之,这段代码是Spring MVC的配置类,用于配置和定制Spring MVC的行为和功能,包括启用包扫描、启用MVC注解驱动以及处理静态资源等。可以根据具体需求进行个性化配置和定制。

 2)静态资源处理,方式二
    /**
     * 静态资源处理方式二:由 springmvc 处理静态资源
     * 页面上以 page 开头的页面都放到 static 管理
     * @param registry
     */
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/page/**")
                .addResourceLocations("/static/");
    }

具体功能和作用如下:

  1. 创建一个ResourceHandlerRegistry对象实例,该类是Spring MVC提供的静态资源处理注册器,用于注册和配置静态资源的处理方式。

  2. 使用.addResourceHandler("/page/**")设置映射的URL路径模式,即当请求路径符合/page/**的格式时,将会被映射到静态资源处理器进行处理。

  3. 使用.addResourceLocations("/static/")设置静态资源的存放位置,即指定静态资源文件所在的目录。在这个例子中,将会把以/page/开头的请求映射到/static/目录下的对应静态资源文件。

通过这种方式,可以方便地处理和管理静态资源,使得在页面上以/page/开头的请求能够正常访问对应的静态资源文件。

 

3)装配 Bean 验证器
 /**
     * 装配 Bean 验证器
     */
    @Override
    public Validator getValidator() {
        LocalValidatorFactoryBean factoryBean = new LocalValidatorFactoryBean();
        // 使用 Hibernate 框架提供的 Bean 验证器
        factoryBean.setProviderClass(HibernateValidator.class);
        // 指定资源文件
        ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
        messageSource.setBasename("classpath:message");
        messageSource.setDefaultEncoding("UTF-8");
        // 装配给 factoryBean
        factoryBean.setValidationMessageSource(messageSource);
        return factoryBean;
    }

 具体功能和作用如下:

  1. 创建一个LocalValidatorFactoryBean实例,该类是Spring提供的验证器工厂类,用于创建验证器对象。

  2. 使用factoryBean.setProviderClass(HibernateValidator.class)设置验证器的提供者为Hibernate Validator。Hibernate Validator是一个基于Hibernate框架的验证器实现,提供了丰富的验证规则和错误消息。

  3. 创建一个ReloadableResourceBundleMessageSource实例,用于指定验证器的错误消息资源文件。setBasename("classpath:message")指定了资源文件的路径为"classpath:message",即在classpath下的message.properties文件中查找错误消息。

  4. 使用setDefaultEncoding("UTF-8")设置资源文件的编码格式为UTF-8,确保正确读取错误消息中的中文字符。

  5. 将上述创建的messageSource对象通过factoryBean.setValidationMessageSource(messageSource)方法装配给factoryBean,将资源文件配置到验证器中。

  6. 最后返回factoryBean,即返回了一个已经配置好的Hibernate Validator作为Bean验证器。

通过这种方式,可以使用Hibernate Validator作为验证器,并配置自定义的错误消息资源文件,从而实现对请求参数进行校验,并返回相应的错误信息。

4) 装配 commons-upload 上传解析器
  /**
     * 装配 commons-upload 上传解析器
     */
    @Bean
    public CommonsMultipartResolver multipartResolver(){
        CommonsMultipartResolver resolver = new CommonsMultipartResolver();
        // 设置文件上传的大小
        resolver.setMaxUploadSize(104857600);
        // 设置编码
        resolver.setDefaultEncoding("UTF-8");
        return resolver;
    }

具体功能和作用如下:

  1. 创建一个CommonsMultipartResolver对象实例,该类是Spring提供的文件上传解析器,用于解析客户端传来的Multipart请求,即包含文件流的请求。

  2. 使用setMaxUploadSize(104857600)设置最大上传文件的大小,单位为字节。在这个例子中,最大允许上传100MB的文件。

  3. 使用setDefaultEncoding("UTF-8")设置编码格式为UTF-8,确保正确解析文件名和文件内容中的中文字符。

  4. 将创建好的resolver对象返回,作为配置好的上传解析器Bean。

通过这种方式,可以方便地配置和管理文件上传解析器,以便处理文件上传相关的请求。

5)装配拦截器
/**
     * 装配拦截器
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new LoginInterceptor())
                .addPathPatterns("/**")
                .excludePathPatterns("/static/login.html",
                                     "/static/js/**",
                                     "/static/css/**",
                                     "/login");
    }

 具体功能和作用如下:

  1. 创建一个InterceptorRegistry对象实例,该类是Spring提供的拦截器注册器,用于注册拦截器。

  2. 使用registry.addInterceptor(new LoginInterceptor())将自定义的LoginInterceptor拦截器添加到拦截器注册器中。

  3. 使用.addPathPatterns("/**")设置需要拦截的请求路径,即所有请求都需要被该拦截器拦截。

  4. 使用.excludePathPatterns()设置不需要拦截的请求路径,即在该拦截器之外的请求,这里排除了静态资源文件和登录页面等请求。

  5. 最后的效果是,当有请求时,会先进入LoginInterceptor拦截器,进行判断是否已经登录。如果未登录,则将请求转发到登录页面进行登录;如果已经登录,则放行请求继续处理。

通过这种方式,可以方便地配置和管理拦截器,以便对请求进行统一处理和验证。

6)跨域配置
/**
     * 跨域配置
     */
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedOrigins("*")
                .allowedMethods("*")
                .allowedHeaders("*")
                .exposedHeaders("*");
                // 跨域时时候允许传递 cookie,默认是不允许的
                //.allowCredentials(true);
    }

具体功能和作用如下:

  1. 创建一个CorsRegistry对象实例,该类是Spring提供的跨域配置注册器,用于注册跨域请求的配置。

  2. 使用.addMapping("/**")设置需要进行跨域配置的请求路径模式,这里使用通配符/**表示所有请求都需要跨域配置。

  3. 使用.allowedOrigins("*")设置允许的来源,即允许跨域请求的来源域名。在这个例子中,使用通配符*表示允许任何域名发起跨域请求。

  4. 使用.allowedMethods("*")设置允许的HTTP方法,即允许跨域请求的HTTP方法。在这个例子中,使用通配符*表示允许任何HTTP方法。

  5. 使用.allowedHeaders("*")设置允许的请求头,即允许跨域请求携带的请求头。在这个例子中,使用通配符*表示允许任何请求头。

  6. 使用.exposedHeaders("*")设置允许暴露的响应头,即允许跨域请求返回的响应头信息。在这个例子中,使用通配符*表示允许任何响应头。

  7. 可选的,使用.allowCredentials(true)设置是否允许跨域请求携带cookie。默认情况下,浏览器在跨域请求中是不会发送cookie的,需要显示地设置为true才能够携带cookie。

通过这种方式,可以方便地配置和管理跨域请求的相关参数,以便应对跨域请求场景。

 7)配置内部资源解析器
 /**
     * 配置内部资源视图解析器
     */
    @Bean
    public InternalResourceViewResolver viewResolver(){
        InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();

        viewResolver.setPrefix("/WEN-INF/jsp/");
        viewResolver.setSuffix(".jsp");
        return viewResolver;

    }

具体功能和作用如下:

  1. 使用@Bean注解将该方法声明为一个Spring Bean。

  2. 创建一个InternalResourceViewResolver对象实例,该类是Spring MVC提供的视图解析器,用于解析JSP视图。

  3. 使用.setPrefix("/WEN-INF/jsp/")设置JSP文件所在的目录路径,即指定模板文件的存放位置。在这个例子中,将会在/WEB-INF/jsp/目录下查找JSP文件。

  4. 使用.setSuffix(".jsp")设置JSP文件的后缀名,即指定JSP文件的文件类型。在这个例子中,将会查找后缀名为.jsp的文件。

  5. 返回InternalResourceViewResolver对象实例。

通过这种方式,可以方便地进行JSP视图解析,使得在控制器中返回的逻辑视图名能够正确解析对应的JSP视图文件。

2、配置 WebConfig
/**
 * @Date 2023-10-30
 * @Author qiu
 * webConfig 配置类,用于取代 web.xml
 * 在继承的父类中已经帮我们创建了 dispatcherServlet 并初始化
 * 只需要在重写的 getServletMappings 方法中指定映射的地址即可
 * 相当于 web.xml  中的 <url-pattern>/</url-pattern>
 */
public class WebConfig extends AbstractAnnotationConfigDispatcherServletInitializer {

    /**
     * 加载主配置类
     * @return
     */
    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class[0];
    }

    /**
     * 加载 MVC 的配置类
     * @return
     */
    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class[]{MvcConfig.class};
    }

    /**
     * 给 dispatcherServlet 配置 url-pattern
     * @return
     */
    @Override
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }

}

 具体作用和功能如下:

  1. 继承自AbstractAnnotationConfigDispatcherServletInitializer,这是Spring提供的一个抽象类,用于帮助我们进行基于注解的Spring MVC配置。

  2. 重写getRootConfigClasses()方法,用于加载主配置类。在这个例子中,返回一个空数组,表示没有额外的根配置类需要加载。

  3. 重写getServletConfigClasses()方法,用于加载MVC的配置类。在这个例子中,返回一个包含MvcConfig类的数组,表示加载MvcConfig类作为MVC的配置类。

  4. 重写getServletMappings()方法,用于给dispatcherServlet配置URL映射。在这个例子中,返回一个包含"/"的字符串数组,表示将所有请求都映射到dispatcherServlet上。

通过这种方式,可以在Java代码中灵活配置Spring MVC,取代传统的使用web.xml进行配置的方式。这样可以更方便地管理和维护项目的配置,并且提高了代码的可读性和可维护性。

三、使用配置类配置 springMvc 有什么好处 

使用配置类来配置Spring MVC有以下好处:

  1. 基于JavaConfig,无需XML:使用配置类可以完全基于Java代码来完成Spring MVC的配置,不再需要使用XML文件来进行配置。

  2. 可以使用更加面向对象的方式:通过配置类,可以使用更加面向对象的方式来进行配置,而不是XML中的标签式配置,这样更加符合Java开发者的习惯和编码风格。

  3. 代码结构清晰:使用配置类可以将不同功能的配置分离到不同的类中,使得代码结构更加清晰,易于维护和扩展。

  4. 更加灵活:使用配置类可以方便地实现条件化配置、根据环境变量或系统属性动态调整配置等功能,从而让配置更加灵活。

  5. 与其他Spring特性集成:使用配置类可以方便地与其他Spring特性如Spring Boot、Actuator、Security等集成,从而让整个应用程序更加协调和一致。

总之,使用配置类配置Spring MVC可以提高代码的可读性、可维护性和可扩展性,并且可以更好地与其他Spring特性集成,是目前推荐的一种配置方式。

四、gitee 案例

地址:ch11 · qiuqiu/SpringMVC - 码云 - 开源中国 (gitee.com)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/112570.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

虚拟人运营系统介绍丨支持实时互动/直播/短视频创作,赋能元宇宙营销

2023年&#xff0c;以虚拟人为代表的元宇宙营销成为品牌营销黑马。 品牌通过虚拟人IP运营&#xff0c;形成具有一定影响力的品牌效应&#xff0c;围绕“内容持续输出——粉丝沉淀——优质运营——商业变现”的创新模式&#xff0c;打破同质化营销形式&#xff0c;利用虚拟人IP以…

chatgpt生成文本的底层工作原理是什么?

文章目录 &#x1f31f; ChatGPT生成文本的底层工作原理&#x1f34a; 一、数据预处理&#x1f34a; 二、模型结构&#x1f34a; 三、模型训练&#x1f34a; 四、文本生成&#x1f34a; 总结 &#x1f4d5;我是廖志伟&#xff0c;一名Java开发工程师、Java领域优质创作者、CSDN…

ElasticSearch搜索技术深入与聚合查询实战

ES分词器详解 基本概念 分词器官方称之为文本分析器&#xff0c;顾名思义&#xff0c;是对文本进行分析处理的一种手段&#xff0c;基本处理逻辑为按照预先制定的分词规则&#xff0c;把原始文档分割成若干更小粒度的词项&#xff0c;粒度大小取决于分词器规则。 分词发生时…

Flink1.18新特性生产环境应用的重点解读!

大家好&#xff0c;我是你们的群主王知无呀。 Flink 1.18已经于近期发布了。在这个新版本中新增了很多新的功能和特性。在这些特性中&#xff0c;有一些是生产环境非常重要的能力&#xff0c;大家在使用过程中可以重点参考和了解其中的原理。 算子级别状态保留时间TTL设置 首先…

关于嵌入式rtthread系统与单片机芯片

简介 我估计已经有很久没更新了&#xff0c;近一年都在某个国企里工作&#xff0c;我做的就是嵌入式工程师的岗位&#xff0c;最近才刚刚退出来&#xff0c;想来说说自己的工作使用的软件和系统。 本身进公司的时候&#xff0c;其实做的就是写单片机的板子的程序的工作&#x…

Git工作原理和常见问题处理方案

博客定位Git工作区域工作区域划分暂存区设计目的 Git基本操作核心操作初始化和配置指令 HEAD指针Git版本回滚指令介绍reset模式reset hard使用场景reset soft使用场景reset mixed使用场景reset使用注意事项checkout使用场景 Git分支管理什么是分支分支应用场景分支相关指令被合…

在Photoshop中如何校正倾斜的图片

在Photoshop中如何校正倾斜的图片呢&#xff1f;今天就教大家如何操作。 将需要操作的图片拉到PS软件中&#xff0c;自动形成项目。 点击上方“滤镜”中的“镜头校正”。 进入“镜头校正”窗口&#xff0c;点击左侧的“拉直工具”。文章源自设计学徒自学网-http://www.sx1c.co…

【webrtc】 对视频质量的码率控制的测试与探索

目录 环境设置 transport-cc goog-remb (webrtc中的两种码率算法&#xff09; 修改成remb算法 测试 效果 后续 可参考工程 环境设置 要到meshx上操作 telnet 112 然后执行factory_env show |grep meshx_ip 之后telnet meshx_ip 用户名admin 密码****.119 执行一下r…

css矩形盒子实现虚线流动边框+css实现step连接箭头

由于项目里需要手写步骤条 且实现指定状态边框虚线流动效果&#xff0c;故使用css去绘制步骤条连接箭头和绘制边框流动效果 效果&#xff1a; 1.绘制步骤条连接箭头 <ul class"process-list"><div v-for"(process, index) in processes" :key&qu…

视频列表:点击某个视频进行播放,其余视频全部暂停(同时只播放一个视频)

目录 需求实现原理实现代码页面展示 需求 视频列表&#xff1a;点击某个视频进行播放&#xff0c;其余视频全部暂停&#xff08;同时只播放一个视频&#xff09; 实现原理 在 video 标签添加 自定义属性 id (必须唯一)给每个 video 标签 添加 play 视频播放事件播放视频时&…

前端性能瓶颈崩溃项目?Webpack助力解决!

&#x1f3ac; 江城开朗的豌豆&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 &#x1f4dd; 个人网站 :《 江城开朗的豌豆&#x1fadb; 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! 目录 ⭐ 专栏简介 &#x1f4d8; 文章引言 一、背…

数据结构详细笔记——二叉树

文章目录 二叉树的定义和基本术语特殊的二叉树满二叉树完全二叉树二叉排序树平衡二叉树 二叉树的常考性质完全二叉树的常考性质二叉树的存储结构顺序存储链式存储 二叉树的先中后序遍历先序遍历&#xff08;空间复杂度&#xff1a;O&#xff08;h&#xff09;&#xff09;中序遍…

【k8s】pod进阶

一、资源限制 1、资源限制的概念 当定义 Pod 时可以选择性地为每个容器设定所需要的资源数量。 最常见的可设定资源是 CPU 和内存大小&#xff0c;以及其他类型的资源。 当为 Pod 中的容器指定了 request 资源时&#xff0c;调度器就使用该信息来决定将 Pod 调度到哪个节点上…

【高光谱与多光谱:空间-光谱双优化模型驱动】

A Spatial–Spectral Dual-Optimization Model-Driven Deep Network for Hyperspectral and Multispectral Image Fusion &#xff08;一种用于高光谱与多光谱图像融合的空间-光谱双优化模型驱动深度网络&#xff09; 深度学习&#xff0c;特别是卷积神经网络&#xff08;CNN…

【Java 进阶篇】Java Response 输出字符数据案例

在Java Web开发中&#xff0c;使用HTTP响应对象&#xff08;Response&#xff09;来向客户端发送数据是一项非常重要的任务。本篇博客将详细介绍如何使用Java中的Response对象来输出字符数据&#xff0c;并提供示例代码以帮助读者更好地理解和应用这一概念。不仅将讨论基础知识…

java 申请堆外内存吗? java如何使用堆外内存?

java 申请堆外内存吗&#xff1f; java如何使用堆外内存&#xff1f; Java堆外内存管理 JVM可以使用的内存分外2种&#xff1a;堆内存和堆外内存&#xff1a; 堆内存完全由JVM负责分配和释放&#xff0c;如果程序没有缺陷代码导致内存泄露&#xff0c;那么就不会遇到java.lan…

【5G PHY】5G SS/PBCH块介绍(二)

博主未授权任何人或组织机构转载博主任何原创文章&#xff0c;感谢各位对原创的支持&#xff01; 博主链接 本人就职于国际知名终端厂商&#xff0c;负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作&#xff0c;目前牵头6G算力网络技术标准研究。 博客…

工业4G路由器桥接多网络,提升工业环境网络覆盖

一款专为工业环境应用所设计的物联网通讯设备“工业4G路由器”&#xff0c;它具有多种功能和特性。其中之一就是桥接功能&#xff0c;在工业领域中被广泛应用并起着重要的通信作用。 桥接功能是指工业4G路由器通过无线网络的方式&#xff0c;为不同的工业设备提供网络并将其连…

【Linux】jdk、tomcat、MySQL环境搭建的配置安装,Linux更改后端端口

一、作用 工具的组合为开发者和系统管理员提供了构建和运行Java应用程序以及存储和管理数据的完整环境。 JDK&#xff08;Java Development Kit&#xff09;&#xff1a;JDK是Java开发工具包&#xff0c;它提供了开发和运行Java应用程序所需的工具和库。通过安装JDK&#xff0c…

git教程(2)---远程仓库操作

git教程---远程仓库 远程操作创建远程仓库克隆远程仓库HTTPSSSH 向远程仓库推送拉取远程仓库.gitignore文件给git指令起别名IssuesPull Requests 标签管理操作标签推送标签 多人协作场景一场景二 开发模型Git分支设计规范使用Gitee的DevOps平台体验项目开发流程 远程操作 创建…