【革命启示录】Spring框架:Java开发的“核聚变”能量源!

Hello,我是阿佑,今天给大家整的活是 《Java开发的“核聚变”能量源》

文章目录

  • Spring框架原理详解
    • 一、引言
      • 简介
      • 目的
      • 特点
      • 例子
    • 二、背景介绍
      • 问题
      • 解决方案
      • 例子
    • 三、核心概念
      • 3.1 控制反转(Inversion of Control, IoC)
        • 定义
        • 实现
        • 例子与代码
      • 3.2 面向切面编程(Aspect-Oriented Programming, AOP)
        • 定义
        • 组件
        • 例子与代码
      • 3.3 依赖注入(Dependency Injection, DI)
        • 方式
        • 目的
        • 例子与代码
    • 四、Spring架构与模块
      • 核心容器(Core Container)
        • BeanFactory
        • ApplicationContext
        • 例子与代码
      • AOP模块
        • 例子
      • 数据访问/集成(Data Access/Integration)
        • JDBC
        • ORM
      • Web模块
        • Spring MVC
        • 例子与代码
      • 测试模块
        • 例子与代码
      • Spring框架的国际化和本地化
        • 本地化消息支持
        • 国际化日期和数字格式
        • 地区敏感信息处理
        • 集成第三方库
        • 测试国际化和本地化

在这里插入图片描述

Spring框架原理详解

一、引言

想象一下,如果你是一位厨师,你的厨房里堆满了食材和工具,但它们都是乱七八糟的。你需要花费大量的时间去寻找一把刀或者一个锅,这无疑会降低你的工作效率。在软件开发的世界里,Spring框架就像是那个帮你整理厨房的助手,它将所有的食材(组件)和工具(服务)都井井有条地放好,让你可以快速地找到你需要的东西,专注于烹饪出美味的“软件大餐”。

简介

Spring是一个开源的、轻量级的Java开发框架,它就像是那个神奇的魔法棒,轻轻一挥,就能让复杂的企业级应用开发变得简单而高效。

目的

Spring的使命是简化企业级应用开发的复杂性,它通过一系列创新的设计模式和编程范式,让开发者能够更加专注于业务逻辑,而不是被底层的复杂性所困扰。

特点

Spring的三大法宝是分层架构、控制反转(IoC)和面向切面编程(AOP)。

  • 分层架构:就像一个精美的蛋糕,每一层都有其独特的风味和作用,Spring的分层架构保证了系统的清晰和模块化。
  • 控制反转(IoC):这是一种设计模式,它让对象的创建和依赖关系管理变得自动化,就像是有一个隐形的服务员,在你点菜后,自动为你准备好所有需要的食材。
  • 面向切面编程(AOP):这是一种编程范式,它允许你将那些与业务逻辑无关的横切关注点(如日志记录、安全性等)从业务逻辑中分离出来,就像是在厨房里安装了一个自动洗碗机,让你可以专注于烹饪,而不用担心清洗工作。

例子

让我们以一个餐厅点餐系统为例。在这个系统中,顾客(用户)可以通过菜单(界面)选择他们想要的菜品(功能)。在没有Spring的情况下,顾客可能需要直接与厨师(开发者)沟通,告诉他们需要什么菜品,然后厨师再去寻找食材和工具来制作菜品。这个过程不仅效率低下,而且如果厨师很忙,顾客可能就需要等待很长时间。

而有了Spring,这个过程就变得完全不同了。顾客只需要通过菜单选择他们想要的菜品,然后后厨(Spring容器)就会自动为他们准备好一切。厨师只需要专注于烹饪,而不需要担心其他的事情。这样,不仅提高了效率,而且也让整个餐厅的运营变得更加流畅。

接下来,我们将深入探讨Spring的背景介绍,看看它是如何一步步解决传统J2EE应用开发中遇到的问题的。

二、背景介绍

在Spring框架出现之前,Java企业级应用开发就像是在没有GPS导航的情况下开车穿越一座迷宫城市。开发者需要手动处理各种复杂的配置和依赖关系,就像是在没有地图的情况下寻找目的地,既费时又容易迷路。

问题

传统的J2EE应用开发面临的问题主要包括:

  • 复杂性高:企业级应用通常包含大量的组件和服务,这些组件之间的依赖关系错综复杂,导致整个系统的管理和维护变得非常困难。
  • 耦合度大:在传统的开发模式下,组件之间的依赖关系通常是硬编码的,这就意味着一旦某个组件发生变化,所有依赖它的组件都可能受到影响,从而导致整个系统的稳定性和可维护性大大降低。

解决方案

Spring框架的出现,就像是为这座迷宫城市带来了GPS导航系统,它通过引入新的设计模式和编程范式,为开发者提供了一种更加清晰和高效的开发方式。

  • 控制反转(IoC):Spring通过IoC机制,将对象的创建和依赖关系的管理从程序代码中分离出来,交由框架的容器来管理。这样,开发者就不需要再手动创建和管理对象,只需要通过简单的配置,就可以让容器自动为他们创建和管理对象,从而大大简化了开发过程。
  • 面向切面编程(AOP):Spring通过AOP机制,允许开发者将那些与业务逻辑无关的横切关注点(如日志记录、安全性等)从业务逻辑中分离出来,封装成独立的模块。这样,就可以在不修改业务逻辑代码的情况下,灵活地添加或修改这些横切关注点,从而提高了系统的模块化和可维护性。

例子

让我们继续以餐厅点餐系统为例。在传统的开发模式下,如果餐厅想要增加一个新的菜品,厨师可能需要手动修改整个点餐系统的代码,以添加这个新菜品。这个过程不仅繁琐,而且如果修改不当,还可能影响到其他菜品的制作。

而有了Spring,这个过程就变得非常简单了。厨师只需要定义一个新的菜品(Bean),然后通过简单的配置,就可以让Spring容器自动为这个新菜品创建和管理所需的食材和工具。这样,厨师就可以专注于烹饪,而不需要担心系统的复杂性。

通过引入IoC和AOP,Spring为Java企业级应用开发带来了革命性的变化,它极大地简化了开发过程,提高了系统的模块化和可维护性。在下一章中,我们将深入探讨Spring的核心概念,包括控制反转(IoC)、面向切面编程(AOP)和依赖注入(DI),看看这些概念是如何在Spring中发挥作用的。
在这里插入图片描述

三、核心概念

Spring框架的核心概念是构建Java企业级应用的基石。下面我们来一一探讨。

3.1 控制反转(Inversion of Control, IoC)

控制反转是一种设计原则,它将传统编程中由程序代码直接管理对象创建和依赖关系的方式,转变为由外部容器(如Spring IoC容器)来管理。

定义

在IoC中,对象不是由程序代码创建的,而是由容器在运行时动态创建和注入的。

实现

Spring通过BeanFactoryApplicationContext接口来实现IoC,使用BeanDefinition来描述Bean的配置信息。

例子与代码

假设我们有一个简单的MessageService接口和它的实现ConsoleMessageService

// 定义一个简单的服务接口
public interface MessageService {void showMessage(String message);
}// 实现这个接口
public class ConsoleMessageService implements MessageService {public void showMessage(String message) {System.out.println(message);}
}

在Spring配置文件中,我们可以这样定义Bean:

<!-- Spring配置文件 -->
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><!-- 定义一个MessageService的Bean --><bean id="messageService" class="com.example.ConsoleMessageService"/>
</beans>

现在,我们不需要在代码中创建ConsoleMessageService的实例,而是通过Spring容器来获取:

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class Client {public static void main(String[] args) {ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");MessageService messageService = context.getBean("messageService", MessageService.class);messageService.showMessage("Hello, Spring IoC!");}
}

3.2 面向切面编程(Aspect-Oriented Programming, AOP)

面向切面编程是一种编程范式,它允许将横切关注点(如日志、事务管理等)与业务逻辑分离。

定义

AOP通过将这些横切关注点模块化,可以对它们进行单独的管理和维护。

组件
  • Joinpoint:程序执行的特定点,如方法的调用或异常的处理。
  • Pointcut:定义一个或多个Joinpoint的表达式。
  • Advice:在Joinpoint处执行的代码,分为前置、后置、环绕和异常处理等类型。
  • Aspect:一个或多个Advice的集合,它可以根据Pointcut表达式应用到Joinpoint上。
例子与代码

假设我们想要在调用MessageService时添加日志记录功能。

// 定义一个日志切面
public class LoggingAspect {public void beforeAdvice(Method method, Object[] args) {System.out.println("Before the method: " + method.getName());}public void afterAdvice(Method method) {System.out.println("After the method: " + method.getName());}
}

在Spring配置文件中,我们可以这样定义切面:

<!-- 定义一个切面 -->
<bean id="loggingAspect" class="com.example.LoggingAspect"/><!-- 定义一个切入点 -->
<bean id="loggingPointcut" class="org.springframework.aop.aspectj.AspectJExpressionPointcut"><property name="expression" value="execution(* com.example.MessageService.*(..))"/>
</bean><!-- 将Advice应用到切入点 -->
<aop:config><aop:aspect id="loggingAspectBean" ref="loggingAspect"><aop:before method="beforeAdvice" pointcut-ref="loggingPointcut"/><aop:after method="afterAdvice" pointcut-ref="loggingPointcut"/></aop:aspect>
</aop:config>

3.3 依赖注入(Dependency Injection, DI)

依赖注入是一种实现IoC的技术,它允许容器动态地将依赖关系注入到需要它们的组件中。

方式
  • 构造器注入:通过构造器参数来注入依赖。
  • Setter方法注入:通过公共的Setter方法来注入依赖。
  • 字段注入:直接在字段上注入依赖(不推荐,因为会丧失灵活性)。
目的

降低组件之间的耦合,提高代码的可测试性和可维护性。

例子与代码

假设ConsoleMessageService需要一个NotificationService来发送通知。

public class NotificationService {public void sendNotification(String message) {System.out.println("Notification: " + message);}
}

我们可以通过构造器注入来提供这个依赖:

public class ConsoleMessageService implements MessageService {private NotificationService notificationService;// 通过构造器注入NotificationServicepublic ConsoleMessageService(NotificationService notificationService) {this.notificationService = notificationService;}public void showMessage(String message) {System.out.println(message);notificationService.sendNotification(message);}
}

在Spring配置文件中,我们可以这样定义这个Bean,并注入依赖:

<bean id="messageService" class="com.example.ConsoleMessageService"><constructor-arg ref="notificationService"/>
</bean><bean id="notificationService" class="com.example.NotificationService"/>

通过这些核心概念,Spring提供了一种强大而灵活的方式来构建和管理复杂的Java企业级应用。接下来,我们将探讨Spring的架构与模块,了解它们是如何协同工作的。
在这里插入图片描述

四、Spring架构与模块

Spring框架的架构设计非常灵活,它由多个模块组成,每个模块都负责特定的功能,这些模块可以独立使用,也可以组合使用以构建更复杂的应用。

核心容器(Core Container)

核心容器是Spring框架的核心,它提供了基本的IoC容器功能,以及对DI的支持。

BeanFactory

BeanFactory是Spring框架中最基本的IoC容器,它负责管理Bean的生命周期和依赖关系。BeanFactory是延迟初始化的,只有在第一次请求一个Bean时,它才会被创建和初始化。

ApplicationContext

ApplicationContextBeanFactory的子接口,它提供了更多的高级功能,如事件发布和监听、国际化消息支持等。ApplicationContext通常用于应用程序的整个生命周期。

例子与代码

以下是如何使用ApplicationContext来获取一个Bean的示例:

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class ApplicationContextExample {public static void main(String[] args) {ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");MessageService messageService = context.getBean(MessageService.class);messageService.showMessage("Hello, Spring ApplicationContext!");}
}

AOP模块

AOP模块提供了面向切面编程的支持,允许开发者将横切关注点与业务逻辑分离。

例子

假设我们有一个UserService,我们希望在执行每个方法之前记录日志:

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;@Aspect
public class UserServiceLoggingAspect {@Before("execution(* com.example.UserService.*(..))")public void logBefore(JoinPoint joinPoint) {System.out.println("Before method: " + joinPoint.getSignature().getName());}
}

数据访问/集成(Data Access/Integration)

数据访问/集成模块提供了对各种数据访问技术的集成,如JDBC、ORM(对象关系映射)和事务管理。

JDBC

Spring的JDBC模块简化了JDBC的使用,通过使用JdbcTemplate,可以减少样板代码,提高数据访问层的可维护性。

ORM

Spring支持多种ORM框架,如Hibernate、JPA等,提供了事务管理的支持。

Web模块

Web模块提供了构建Web应用的支持,包括MVC模型和其他Web集成特性。

Spring MVC

Spring MVC是一个基于模型-视图-控制器的Web应用框架,它通过注解或XML配置来简化Web应用的开发。

例子与代码

以下是使用Spring MVC的控制器示例:

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;@Controller
public class MyController {@GetMapping("/hello")public String sayHello() {return "hello"; // 返回视图的名称}
}

测试模块

测试模块提供了对JUnit等测试框架的集成支持,使得编写单元测试和集成测试变得更加容易。

例子与代码

以下是使用Spring的测试模块进行单元测试的示例:

import org.springframework.beans.factory.annotation.Autowired;
import org.junit.jupiter.api.Test;
import static org.mockito.Mockito.*;
import static org.junit.jupiter.api.Assertions.*;class UserServiceTest {@Autowiredprivate UserService userService;@Testvoid testFindUser() {// 创建模拟的用户User user = new User("John");// 配置模拟对象返回特定的用户when(userService.findUser(1L)).thenReturn(user);// 调用方法并断言结果User result = userService.findUser(1L);assertEquals(user, result);}
}

通过这些模块的协同工作,Spring框架为开发者提供了一个强大而灵活的平台,用于构建各种类型的Java应用。

Spring框架的国际化和本地化

在全球化的软件开发背景下,国际化(Internationalization,通常缩写为 I18N)和本地化(Localization,通常缩写为 L10N)变得越来越重要。国际化是指设计和开发能够无障碍地适应不同文化和语言环境的产品的过程。本地化则是指将国际化的产品调整、翻译和适应特定地区的过程。

本地化消息支持

在Spring框架中,可以使用MessageSource接口来支持本地化消息。这通常涉及到在应用程序中使用键值对来存储消息,并根据用户的地区设置从相应的属性文件中检索翻译后的文本。

示例代码:使用MessageSource

@Controller
public class MessageController {@Autowiredprivate MessageSource messageSource;@GetMapping("/message")public String showMessage(@RequestParam String code, Model model) {model.addAttribute("message", messageSource.getMessage(code, null, null));return "message";}
}

在资源文件(例如:messages.properties 用于默认区域设置,messages_es.properties 用于西班牙语区域设置)中,消息被定义如下:

# messages.properties
message.welcome=Welcome to our store!
# messages_es.properties
message.welcome=¡Bienvenido a nuestra tienda!
国际化日期和数字格式

Spring框架支持国际化的日期和数字格式,这通常是通过Java的Locale类和java.text包来实现的。

示例代码:国际化日期格式

@GetMapping("/format-date")
public String formatDate(@RequestHeader(value = "Accept-Language", required = false) String lang,Model model) {Locale locale = lang != null ? new Locale(lang.split("-", 2)[0]) : Locale.getDefault();DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale);model.addAttribute("currentDate", dateFormat.format(new Date()));return "date";
}
地区敏感信息处理

在处理与地区相关的信息时,如货币、地址格式等,Spring框架可以与Java的国际化库一起使用,以确保正确地格式化和解析这些信息。

示例代码:地区敏感的货币格式化

public String getFormattedCurrency(double amount, String countryCode) {Locale locale = new Locale("", countryCode);NumberFormat currencyFormat = NumberFormat.getCurrencyInstance(locale);return currencyFormat.format(amount);
}
集成第三方库

Spring框架可以与许多第三方库集成,如Apache Commons Lang和Java Internationalization API,以支持更复杂的国际化和本地化需求。

示例代码:使用Apache Commons Lang进行地区感知的排序

public List<String> sortCountries(Locale locale, List<String> countries) {Collator collator = Collator.getInstance(locale);collator.setStrength(Collator.PRIMARY);Collections.sort(countries, collator);return countries;
}
测试国际化和本地化

在测试国际化和本地化功能时,需要确保应用程序在不同的区域设置下表现一致。

示例代码:使用JMockit进行国际化测试

@Test
public void testLocalizedMessage(@Mocked final LocaleService mockLocaleService,@Mocked final MessageSource mockMessageSource) {new Expectations() {{mockLocaleService.getLocale();result = Locale.FRENCH;mockMessageSource.getMessage("message.welcome", null, Locale.FRENCH);result = "Bienvenue sur notre site!";}};// 测试代码
}

通过这些策略,Spring框架支持开发者构建出既国际化又本地化的应用,满足全球用户的多样化需求。如果您需要更具体的示例或有其他问题,请继续提问。

接下来,我们将探讨Bean的生命周期,了解Spring是如何管理Bean的生命周期的。
在这里插入图片描述
通过这四个部分的介绍,我们对Spring框架的基本原理和核心概念有了全面的了解。Spring框架通过其分层架构和模块化设计,提供了强大的功能来简化企业级应用的开发。

下一篇,阿佑准备和大家进一步探讨Spring框架的其他方面,如Bean的生命周期管理、事务管理、与其他技术的集成等。欢迎持续关注!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Sarcasm detection论文解析 |基于情感背景和个人表达习惯的有效讽刺检测方法

论文地址 论文地址&#xff1a;https://link.springer.com/article/10.1007/s12559-021-09832-x#/ 论文首页 笔记框架 基于情感背景和个人表达习惯的有效讽刺检测方法 &#x1f4c5;出版年份:2022 &#x1f4d6;出版期刊:Cognitive Computation &#x1f4c8;影响因子:5.4 &…

【python】基础语法

目录 一.注释和常见规则 二.变量及类型 1.数据类型 2.Numbers数字数据类型 3. 字符串类型 &#xff08;1&#xff09;字符串访问 &#xff08;2&#xff09;字符串拼接 4.List&#xff08;列表&#xff09;类型 &#xff08;1&#xff09; 定义 &#xff08;2&#…

【Linux】yum

&#x1f389;博主首页&#xff1a; 有趣的中国人 &#x1f389;专栏首页&#xff1a; Linux &#x1f389;其它专栏&#xff1a; C初阶 | C进阶 | 初阶数据结构 觉得本片文章写的还不错的可以&#x1f44d;点赞&#x1f44d;、&#x1f31f;收藏&#x1f31f;、&#x1f4dd;…

Golang | Leetcode Golang题解之第71题简化路径

题目&#xff1a; 题解&#xff1a; func simplifyPath(path string) string {stack : []string{}for _, name : range strings.Split(path, "/") {if name ".." {if len(stack) > 0 {stack stack[:len(stack)-1]}} else if name ! "" &am…

在uniapp里面使用 mp-html 并且开启 latex 功能

在uniapp里面使用 mp-html 并且开启 latex 功能 默认情况下 mp-html 是不会开启 latex 功能的, 如果需要开启 latex 功能是需要到代码操作拉取代码自行打包的。 这里说一下 mp-html 里面的 latex 功能是由 https://github.com/rojer95/katex-mini 提供的技术实现&#xff0c;…

计算机系列之数据库技术

13、数据库技术&#xff08;重点、考点&#xff09; 1、三级模式-两级映像&#xff08;考点&#xff09; 内模式&#xff1a;管理如何存储物理的数据&#xff0c;对应具体物理存储文件。 **模式&#xff1a;**又称为概念模式&#xff0c;就是我们通常使用的基本表&#xff0c…

每日算法-java

题目来自蓝桥云 // 这是一个Java程序&#xff0c;用于解决最长不下降子序列问题。 // 问题描述&#xff1a;给定一个整数序列&#xff0c;找到最长的子序列&#xff0c;使得这个子序列是不下降的&#xff08;即相邻的元素不严格递减&#xff09;。 // 程序使用了动态规划的方法…

【C语言】整数,浮点数数据在内存中的存储

Tiny Spark get dazzling some day. 目录 1. 整数在内存中的存储1.1 原码、反码、补码1.1 大小端存储1.2.1 字节序分类1.2.2 判断字节序 2. 浮点数在内存中的存储2.1 浮点数的存储形式2.2 浮点数的 “ 存 ”2.2.1 S2.2.2 E2.2.3 F 2.3 浮点数的 “ 取 ”2.3.1 S2.3.2 E、F 3. 浮…

读取打包到JAR中的文件:常见问题与解决方案(文件在但是报错not find)

读取打包到JAR中的文件&#xff1a;常见问题与解决方案 喝淡酒的时候&#xff0c;宜读李清照&#xff1b;喝甜酒时&#xff0c;宜读柳永&#xff1b;喝烈酒则大歌东坡词。其他如辛弃疾&#xff0c;应饮高梁小口&#xff1b;读放翁&#xff0c;应大口喝大曲&#xff1b;读李后主…

学习c#第26天 面向对象基础之类与对象

1.类 1.什么是类? 俗话说&#xff0c;“物以类聚&#xff0c;人以群分”。意思是同类的东西经常聚在一起&#xff0c;志同道合 的人相聚成群。前者说物&#xff0c;后者说人。这里以物来进行举例说明[见图]&#xff1a; 水果超市&#xff0c;所有同类的水果摆放在一起&#xf…

PHP 框架安全:ThinkPHP 序列 漏洞测试.

什么是 ThinkPHP 框架. ThinkPHP 是一个流行的国内 PHP 框架&#xff0c;它提供了一套完整的安全措施来帮助开发者构建安全可靠的 web 应用程序。ThinkPHP 本身不断更新和改进&#xff0c;以应对新的安全威胁和漏洞。 ThinkPHP 框架的安全特性&#xff1a; (1) 输入过滤和验证…

【go项目01_学习记录05】

学习记录 1 依赖管理 Go Modules1.1 弃用 $GOPATH1.2 Go Modules 日常使用1.2.1 初始化生成go.mod文件1.2.2 Go Proxy代理1.2.3 go.mod文件查看1.2.4 go.sum文件查看1.2.5 indirect 含义1.2.6 go mod tidy 命令1.2.7 清空 Go Modules 缓存1.2.8 下载依赖1.2.9 所有 Go Modules …

[qnx] 通过zcu104 SD卡更新qnx镜像的步骤

0. 概述 本文演示如果给Xlinx zcu104开发板刷入自定义的qnx镜像 1.将拨码开关设置为SD卡启动 如下图所示&#xff0c;将1拨到On,2,3,4拨到Off&#xff0c;即为通过SD启动。 2.准备SD卡中的内容 首先需要将SD格式化为FAT32的&#xff08;如果已经是FAT32格式&#xff0c;则…

网络安全之OSI七层模型详解

OSI七层模型分为控制层&#xff08;前三层&#xff09;和数据层&#xff08;后四层&#xff09;。从第七层到一层为&#xff1b; 应用层&#xff08;7&#xff09;接收数据 表示层&#xff08;6&#xff09;将数据翻译为机器语言 会话层&#xff08;5&#xff09;建立虚连接…

C++证道之路第十八章探讨C++新标准

一、复习前面介绍过的C11新功能 1、新类型 C11新增了类型long long 和unsigned long long 新增了类型char16_t 和char32_t 2、统一的初始化 C11扩大了用大括号括起的列表&#xff08;初始化列表&#xff09;的使用范围&#xff0c;使其可以用于所有内置类型和用户定义的类…

可编程 IP 新星 Story Protocol 何以引领链上文艺复兴浪潮?

当前&#xff0c;随着 Web3 行业发展进入全新阶段&#xff0c;与生成式人工智能&#xff08;AIGC&#xff09;技术融合正在创造潜力新星项目。也是目前的互联网生态下&#xff0c;任何普通民众都有权利创作高质量的音乐、艺术、散文和视频内容&#xff0c;带来了用户生成内容&a…

算法(C++

题目&#xff1a;螺旋矩阵&#xff08;59. 螺旋矩阵 II - 力扣&#xff08;LeetCode&#xff09;&#xff09; 给你一个正整数 n &#xff0c;生成一个包含 1 到 n2 所有元素&#xff0c;且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。 示例 1&#xff1a; 输入&am…

Vue进阶之Vue项目实战(二)

Vue项目实战 构建基础框架路由 项目&#xff08; v1.0,base-app-layer&#xff09;导航 router物料编排选型 插件化插件化平时写代码场景 配置器开发 构建基础框架 路由 路由分类&#xff1a; memoryHistory&#xff1a;内存路由&#xff0c;路由信息记录在内存中&#xff0…

解决github的remote rejected|git存储库的推送保护

前言 git存储库的推送保护。当你试图推送代码到GitHub仓库时&#xff0c;由于存在与主分支&#xff08;master&#xff09;相关的仓库规则违规行为&#xff0c;推送会被拒绝了。这种保护机制帮助确保只有经过授权和符合规定的代码才能被合并到主分支&#xff0c;从而保护了主分…

Unreal Engine插件打包技巧

打开UE工程&#xff0c;点击编辑&#xff0c;选择插件&#xff0c;点击"打包"按钮&#xff0c;选择输出目录UE4.26版本打包提示需要VS2017问题解决 1&#xff09;用记事本打开文件【UE4对应版本安装目录\Epic Games\UE_4.26\Engine\Build\BatchFiles\RunUAT.bat】 2&…