当前位置: 首页 > news >正文

Spring框架面试总结

Spring基础

什么是spring框架

  • Spring 框架是一个用于构建企业级 Java 应用程序的开源框架。【Java项目快速构建轻量级框架】
  • 我们一般说 Spring 框架指的都是 Spring Framework,它是很多模块的集合,使用这些模块可以很方便地协助我们进行开发。【根据模块说明】
  • 作用:【简化开发】【框架整合】

Spring 是一个轻量级Java框架,有七大模块,分别为 数据,Web,切面,工具,消息,核心,测试

  • 核心模块有 Beans,Core,Context,Expression , IOC 和 DI⭐
  • 切面模块主要有 AOP ,涉及到这个 AOP 编程 ⭐
  • Web模块有 Web,WebMVC, WebSocket, WebFlux【MVC】
  • 数据模块主要有 ORM 【数据操作】,TX【事务】

方便扩展,比如 整合邮件,缓存,定时任务等

模块有哪些【七大核心模块】

主要关注5个

七大核心模块
1.【核心模块】⭐Core Container(关注IOC,DI)
2.【切面模块】⭐AOP
3.【数据模块】⭐Data Access/Integration
4.【Web模块】⭐Spring Web(关注MVC)
5.【测试模块】⭐Spring Test
6.【消息模块】Messaging
7.【工具模块】Instrumentation(没用过)

Spring,Spring MVC,Spring Boot 之间什么关系?

Spring指的是 Spring Framework【核心】
SpringMVC是SpringWeb模块的子模块【属于Spring】
SpringBoot是对Spring框架简化【自动配置,起步依赖】

如何理解spring属于低侵入式设计?

在代码中不需要依赖具体对象,在运行时进行自动注入,【IOC,DI】降低了组件的耦合,

依赖的是接口,而接口的实现类具有拓展性可以自由选择和组装Spring框架的各个功能模块,而不强制要求应用系统的类必须从Spring框架的系统API的某个类来继承或者实现某个接口。

Spring IoC

Spring IOC 实现了什么功能,谈谈你对IOC的理解。

Spring IOC 负责创建对象,管理对象(通过依赖注入(DI)装配对象、配置对象)并且管理这些对象的整个生命周期。

功能:

依赖注入(DI):IOC容器要为应用程序去提供运行时所依赖的资源。
生命周期管理:Spring IOC容器还负责管理Bean的生命周期。它会根据配置来创建Bean,初始化Bean,以及在不再需要时销毁Bean。
配置集中管理:Spring IOC容器允许将应用的配置集中到一个或多个地方,使得配置的管理更加方便。

控制反转【Ioc】:将对象的创建权交由外部容器,将Bean加入IOC容器

什么是 Spring Bean?Spring IoC容器和容器实现?

Bean

简单来说,Bean 代指的就是那些被 IoC 容器所管理的对象。

SpringIoC容器介绍

Spring IoC 容器,负责实例化、配置和组装 bean(组件)。容器通过读取配置元数据来获取有关要实例化、配置和组装组件的指令。配置元数据以 XML、Java 注解或 Java 代码形式表现。它允许表达组成应用程序的组件以及这些组件之间丰富的相互依赖关系。

SpringIoC容器具体接口和实现类

SpringIoc容器接口:

BeanFactory 接口提供了一种高级配置机制,能够管理任何类型的对象,它是SpringIoC容器标准化超接口!

ApplicationContext 是 BeanFactory 的子接口。

它扩展了以下功能:

  • 更容易与 Spring 的 AOP 功能集成
  • 消息资源处理(用于国际化)
  • 特定于应用程序给予此接口实现,例如Web 应用程序的 WebApplicationContext

简而言之, BeanFactory 提供了配置框架和基本功能,而 ApplicationContext 添加了更多特定于企业的功能。 ApplicationContext 是 BeanFactory 的完整超集!

ApplicationContext容器实现类:

ApplicationContext接口是Spring容器的核心接口,初始化时bean立即加载
在这里插入图片描述
在这里插入图片描述

将一个类声明为 Bean 的注解有哪些?

怎么声明

注解 说明 位置
@Controller @Component的衍生注解 标注在控制器类上
@Service @Component的衍生注解 标注在业务类上
@Repository @Component的衍生注解 标注在数据访问类上(由于与mybatis整合,用的少)
@Component 声明bean的基础注解 不属于以上三类时,用此注解【自定义类】

@Controller、@Service、@Repository这三个注解只是在@Component注解的基础上起了三个新的名字。
在这里插入图片描述
还可以使用 @Configuration 注解的类中,使用 @Bean 注解来定义 Bean。这些 Bean 会被 Spring IOC 容器自动创建和管理。【第三方Bean管理】

@Component 和 @Bean 的区别是什么?

  • @Component 注解作用于类,而@Bean注解作用于方法。
  • @Component通常是通过类路径扫描来自动侦测以及自动装配到 Spring 容器中(我们可以使用 @ComponentScan 注解定义要扫描的路径从中找出标识了需要装配的类自动装配到 Spring 的 bean 容器中)。@Bean
    注解通常是我们在标有该注解的方法中定义产生这个 bean,@Bean告诉了 Spring 这是某个类的实例,当我需要用它的时候还给我。
  • @Bean 注解比 @Component 注解的自定义性更强,而且很多地方我们只能通过 @Bean 注解来注册 bean。比如当我们引用第三方库中的类需要装配到 Spring容器时,则只能通过 @Bean来实现。

细节:

名称问题

  • value属性指定bean的名字
  • 如果没有指定,默认为类名首字母小写。

DI 注入的方式有?

依赖注入,是指IOC容器要为应用程序去提供运行时所依赖的资源,而资源指的就是对象。

方式:

属性注入,构造器注入,Setter 注入,构造方法参数注入,接口注入

Bean属性赋值:引用类型自动装配 (DI)

前提:一个对象且容器中存在

@Autowired自动装配⭐

  • 默认是按照类型进行自动装配的
  • 前提:参与自动装配的组件(需要装配、被装配)全部都必须在IoC容器中。

如果存在多个相同类型的bean对象?@Autowired无法使用

@Primary

当存在多个相同类型的Bean注入时,加上@Primary注解,来确定默认的实现。

@Qualifier

指定当前要注入的bean对象。 在@Qualifier的value属性中,指定注入的bean的名称。

  • @Qualifier注解不能单独使用,必须配合@Autowired使用

@Resource类型装配⭐

是按照bean的名称进行注入。通过name属性指定要注入的bean的名称。

@Autowired(required = true) + @Qualifier(value = “userServiceImpl”) =@Resource(name=“userServiceImpl”)

拓展

@Autowired 和@Resource使用的比较多一些。

@Autowird 与 @Resource的区别⭐

  • @Autowired 是spring框架提供的注解,而@Resource是JDK提供的注解
  • @Autowired 默认是按照类型注入,而@Resource是按照名称注入
  • @Resource注解用在属性上、setter方法上。
  • @Autowired注解用在属性上、setter方法上、构造方法上、构造方法参数上。

@Resource注解属于JDK扩展包,所以不在JDK当中,需要额外引入以下依赖:【高于JDK11或低于JDK8需要引入以下依赖】

<dependency><groupId>jakarta.annotation</groupId><artifactId>jakarta.annotation-api</artifactId><version>2.1.1</version>
</dependency>

Bean属性赋值:基本类型属性赋值 (DI)

通常用于注入外部化属性

从外部配置文件(如 .properties 或 .yaml 文件)读取配置值并将其注入到 Bean 属性中的机制。

配置文件(application.properties 或 application.yml):

# application.properties
app.name=MyApplication
app.version=1.0.0

@Value

Java 类(注入配置属性):

  • 情况1: ${key} 取外部配置key对应的值!
  • 情况2: ${key:defaultValue} 没有key,可以给与默认值
 import org.springframework.beans.factory.annotation.Value;import org.springframework.stereotype.Component;@Componentpublic class AppConfig {@Value("${app.name}")private String appName;@Value("${app.version}")private String appVersion;// Getter 方法public String getAppName() {return appName;}public String getAppVersion() {return appVersion;}}

@ConfigurationProperties

另一种方式是使用 @ConfigurationProperties
注解,它允许将配置文件中的属性映射到一个配置类中。这样可以将一组相关的配置属性绑定到一个 Bean 上。

示例代码:

配置文件(application.yml):

app:name: MyApplicationversion: 1.0.0

配置类:

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;@Component
@ConfigurationProperties(prefix = "app")
public class AppProperties {private String name;private String version;// Getter 和 Setter 方法public String getName() {return name;}public void setName(String name) {this.name = name;}public String getVersion() {return version;}public void setVersion(String version) {this.version = version;}
}

组件管理

组件周期

概述

  • bean生命周期:bean从创建到销毁的整体过程
  • bean生命周期控制:在bean创建后到销毁前做一些事情

Bean 生命周期的主要阶段:

  1. Bean 实例化(Instantiation)

Spring 容器通过调用构造器(无论是默认构造器还是带参数的构造器)来实例化 Bean 对象。这是 Bean 生命周期的第一步。

  1. 属性赋值/填充(Dependency Injection)

在 Bean 实例化之后,Spring 会注入其依赖(即进行依赖注入),通过构造器注入、setter 注入或字段注入等方式来填充 Bean
的属性。

  1. 初始化(Initialization)
  • InitializingBean 接口: 如果 Bean 实现了 InitializingBean 接口,Spring 会调用其 afterPropertiesSet() 方法。
  • 初始化方法: 如果 Bean 配置了初始化方法(通过 @PostConstruct 注解或在 XML 配置中定义的 init-method),Spring 会调用这个方法。
  1. 使用(Usage)

Bean 在这个阶段被完全初始化,可以被应用程序使用。

  1. 销毁(Destruction)
  • DisposableBean 接口: 如果 Bean 实现了 DisposableBean 接口,Spring 会调用其 destroy() 方法。
  • 销毁方法: 如果 Bean 配置了销毁方法(通过 @PreDestroy 注解或在 XML 配置中定义的 destroy-method),Spring 会调用这个方法。 件作用域配置

Bean作用域概念

具体创建多少个Bean的实例对象,由Bean的作用域Scope属性指定!【控制实例化对象个数】

作用域可选值

在这里插入图片描述

Bean 是线程安全的吗?

在Spring框架中,Bean 的线程安全性与其作用域和状态密切相关。下面是关于最常用的两种作用域——singleton 和 prototype——的详细说明:

作用域与线程安全
  1. prototype 作用域:
    • 定义:每次请求都会创建一个新的 Bean 实例。
    • 线程安全性:由于每次请求创建的是不同的实例,因此不存在共享状态的问题,线程安全性得以保证。
   - 示例:@Component@Scope("prototype")public class PrototypeBean {// 每次请求都会创建一个新的实例}
  1. singleton 作用域:
    • 定义:Spring IoC 容器中只有一个 Bean 实例。
    • 线程安全性:由于所有线程共享同一个 Bean 实例,如果 Bean 中存在可变的成员变量,就可能会导致资源竞争和线程安全问题。
   - 示例:@Component@Scope("singleton")public class SingletonBean {private int counter; // 可变的成员变量}
线程安全问题的解决方案

对于 singleton 作用域的有状态 Bean,以下是解决线程安全问题的常见方法:

  1. 避免定义可变的成员变量:
    • 尽量将 Bean 设计为无状态 Bean,不在 Bean 中定义可变的成员变量。
   - 示例:@Component@Scope("singleton")public class StatelessBean {private final String immutableField; // 不可变的成员变量public StatelessBean(String immutableField) {this.immutableField = immutableField;}}
  1. 使用 ThreadLocal:
    • 对于有状态的 Bean,可以在类中使用 ThreadLocal 成员变量,将可变的状态绑定到当前线程,这样每个线程都有自己的变量副本,避免了线程安全问题。
   - 示例:@Component@Scope("singleton")public class ThreadLocalBean {private static final ThreadLocal<Integer> threadLocalCounter = ThreadLocal.withInitial(() -> 0);public void incrementCounter() {threadLocalCounter.set(threadLocalCounter.get() + 1);}public int getCounter() {return threadLocalCounter.get();}}

总结

  • prototype 作用域的 Bean 在每次请求时都会创建新的实例,因此是线程安全的。
  • singleton 作用域的 Bean 可能会存在线程安全问题,尤其是当 Bean 有状态时。常见的解决办法是避免可变的成员变量或使用 ThreadLocal 以确保每个线程有独立的状态副本。

通过上述方法,你可以确保在使用 Spring 的 Bean 时,能够处理好线程安全的问题。

Spring AOP

使用场景

方法增强

日志记录

权限控制

什么是AOP?

AOP英文全称:Aspect Oriented Programming(面向切面编程、面向方面编程),其实说白了,面向切面编程就是面向特定方法编程。

AOP是Spring框架的高级技术,旨在管理bean对象的过程中底层使用动态代理机制,对特定的方法进行编程(功能增强)。

代理模式

代理方式可以解决附加功能代码干扰核心代码和不方便统一维护的问题!

概述

  • 代理:将非核心逻辑剥离出来以后,封装这些非核心逻辑的类、对象、方法。(中介)
    • 动词:指做代理这个动作,或这项工作
    • 名词:扮演代理这个角色的类、对象、方法
  • 目标:被代理“套用”了核心逻辑代码的类、对象、方法。(房东)
    代理在开发中实现的方式具体有两种:静态代理,[动态代理技术]

静态代理

主动创建代理类:

public class CalculatorStaticProxy implements Calculator {// 将被代理的目标对象声明为成员变量private Calculator target;//使用构造函数传入目标public CalculatorStaticProxy(Calculator target) {this.target = target;}@Overridepublic int add(int i, int j) {// 附加功能由代理类中的代理方法来实现System.out.println("参数是:" + i + "," + j);// 通过目标对象来实现核心业务逻辑int addResult = target.add(i, j);System.out.println("方法内部 result = " + result);return addResult;}

动态代理(代理自由分配)

动态代理技术分类

  • JDK动态代理(Java原生):JDK原生的实现方式,需要被代理的目标类必须实现接口!他会根据目标类的接口动态生成一个代理对象!代理对象和目标对象有相同的接口!(拜把子)
  • cglib(第三方,spring已经集成):通过继承被代理的目标类实现代理,所以不需要目标类实现接口!(认干爹)

Spring AOP 就是基于动态代理的,如果要代理的对象,实现了某个接口,那么 Spring AOP 会使用 JDK Proxy,去创建代理对象,而对于没有实现接口的对象,就无法使用 JDK Proxy 去进行代理了,这时候 Spring AOP 会使用
Cglib 生成一个被代理对象的子类来作为代理。

动态代理:Spring AOP使用动态代理技术,在目标对象方法执行时将切面的逻辑织入到目标对象的方法中

OOP 和 AOP 的区别是什么?

OOP面向对象编程,纵向结构关系,关注类之间的关系.OOP引入封装、继承、多态等概念来建立一种对象层次结构,用于模拟公共行为的一个集

合。它导致了大量代码的重复,而不利于各个模块的重用。

AOP可以说是OOP(Object Oriented
Programming,面向对象编程)的补充和完善。AOP面向切面编程,横向结构关系,关注同一层次类的内容

剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,使用AOP,可以在不修改原来代码的基础上添加新功能。

AOP的实现用到了哪种设计模式,它有哪些实现方式?

Spring AOP(面向切面编程)的实现主要用到了以下设计模式:

  1. 代理模式:Spring AOP是围绕着代理模式设计的。这里的代理模式,其实就是指使用一个代理对象来控制对原对象的访问,这个代理对象在原对象的基础上增加了一些额外的功能。
  2. 工厂模式:在Spring AOP中,工厂模式主要用于创建代理对象和目标对象。

Spring AOP的实现方式主要有以下几种:

  1. JDK动态代理:JDK动态代理主要针对目标对象的接口进行代理,动态生成接口的实现类。这种方式需要目标对象实现一个或多个接口,否则不能使用JDK动态代理)。
  2. CGLIB代理:CGLIB代理可以针对类进行代理,生成目标类的子类。这种方式不需要目标对象实现接口,也可以进行代理。
  3. Spring API实现AOP:通过实现Spring提供的AOP接口,如MethodBeforeAdvice、AfterReturningAdvice、MethodInterceptor等,来实现AOP。
  4. 自定义类实现AOP:通过自定义切入类和配置,来实现AOP。通过使用Spring的@Aspect、@Pointcut、@Before、@After等注解,来实现AOP

理解什么是连接点、切面、切点、通知、目标对象、织入、引入。

连接点 JoinPoint:要增强的哪些方法(目标方法)

通知 Advice:进行增强的重复逻辑,也就是共性的功能。(增强方法)

通知是切面在连接点处执行的代码,例如在方法调用前、方法调用后、方法抛出异常时执行的代码。通知可以分为
Before、After、AfterReturning、AfterThrowing 和 Around 五种类型

  • @Around:环绕通知,此注解标注的通知方法在目标方法前、后都被执行
  • @Before:前置通知,此注解标注的通知方法在目标方法前被执行
  • @After :后置通知,此注解标注的通知方法在目标方法后被执行,无论是否有异常都会执行
  • @AfterReturning : 返回后通知,此注解标注的通知方法在目标方法后被执行,有异常不会执行
  • @AfterThrowing : 异常后通知,此注解标注的通知方法发生异常后执行

切入点 PointCut:匹配连接点的条件,通知仅会在切入点方法执行时被应用(为共性的功能标记目标方法)

切面 Aspect:,描述通知与切入点的对应关系(通知+切入点)【针对切入点的通知的完整方法】

切面所在的类,我们一般称为切面类(被@Aspect注解标识的类)

目标对象:Target,通知所应用的对象(要增强目标方法所在对象)

织入 weave:指把通知应用到目标上,生成代理对象的过程。

引入(Introduction):引入允许我们向现有类添加新方法或属性

多个切面的执行顺序如何控制?

默认按照切面类的类名字母排序:

  • 目标方法前的通知方法:字母排名靠前的先执行
  • 目标方法后的通知方法:字母排名靠前的后执行

使用 @Order 注解可以控制切面的优先级:

  • @Order(较小的数):优先级高
  • @Order(较大的数):优先级低

Spring TX 事务

概述

事务是一组操作的集合,它是一个不可分割的工作单位。事务会把所有的操作作为一个整体,一起向数据库提交或者是撤销操作请求。所以这组操作要么同时成功,要么同时失败。Spring中为声明式事务。

Spring事务管理

注:SpringBoot项目会自动配置一个 DataSourceTransactionManager,所以我们只需在方法(或者类)加上
@Transactional 注解,就自动纳入 Spring 的事务管理了。

DataSourceTransactionManager类中的主要方法:

  • doBegin():开启事务
  • doSuspend():挂起事务
  • doResume():恢复挂起的事务
  • doCommit():提交事务
  • doRollback():回滚事务

Transactional注解

@Transactional作用:就是在当前这个方法执行开始之前来开启事务,方法执行完毕之后提交事务。如果在这个方法执行的过程当中出现了异常,就会进行事务的回滚操作。

@Transactional注解:我们一般会在业务层当中来控制事务,因为在业务层当中,一个业务功能可能会包含多个数据访问的操作。在业务层来控制事务,我们就可以将多个数据访问操作控制在一个事务范围内。

事务属性

isolation 【事务隔离级别】

  1. 读未提交(Read Uncommitted):事务可以读取未被提交的数据,容易产生脏读、不可重复读和幻读等问题。实现简单但不太安全,一般不用。
  2. 读已提交(Read Committed):事务只能读取已经提交的数据,可以避免脏读问题,但可能引发不可重复读和幻读。【推荐设置】
  3. 可重复读(Repeatable Read):在一个事务中,相同的查询将返回相同的结果集,不管其他事务对数据做了什么修改。可以避免脏读和不可重复读,但仍有幻读的问题。
  4. 串行化(Serializable):最高的隔离级别,完全禁止了并发,只允许一个事务执行完毕之后才能执行另一个事务。可以避免以上所有问题,但效率较低,不适用于高并发场景。

rollbackFor【事务异常】

默认情况下,只有出现RuntimeException(运行时异常)才会回滚事务。

假如我们想让所有的异常都回滚,需要来配置@Transactional注解当中的rollbackFor属性,通过rollbackFor这个属性可以指定出现何种异常类型回滚事务。

在这里插入图片描述

拓展

Spring容器是如何启动的?

加载配置文件:Spring 容器会从指定的配置文件中读取配置信息,包括 bean 的定义、依赖关系、AOP 切面等。

创建容器:Spring 容器启动后会创建一个容器实例,容器负责管理 bean 的生命周期和依赖关系。

初始化 bean:容器会按照指定的顺序依次对 bean 进行初始化,包括实例化、属性注入、初始化方法执行等。

设置代理对象:如果 bean 需要被 AOP 切面增强,则容器会为其创建代理对象。

完成容器初始化:所有 bean 初始化完成后,Spring 容器启动完成1.

Spring是如何解决循环依赖问题的?

Spring循环依赖指的是两个或多个Bean之间相互依赖,形成一个环状依赖的情况。简单来说,就是A依赖B,B依赖C,C依赖A,这样就形成了一个循环依赖的环。

Spring循环依赖通常会导致Bean无法正确地被实例化,从而导致应用程序无法正常启动或者出现异常。因此,Spring循环依赖是一种需要尽量避免的情况。

Spring循环依赖的解决方法

  • 构造函数注入: 在构造函数注入中,Spring会检查循环依赖,并在发现循环依赖时抛出异常,避免死循环。
  • 使用@Lazy注解: @Lazy注解可以延迟Bean的实例化,从而避免循环依赖的问题。
  • 使用setter方法:在构造函数注入中,Spring会检查循环依赖,并在发现循环依赖时抛出异常,避免死循环

Spring 框架中都用到了哪些设计模式?

  1. 简单工厂模式:Spring中的BeanFactory就是简单工厂模式的体现,根据传入一个唯一的标识来获得Bean对象。
  2. 工厂方法模式:Spring使用工厂模式通过BeanFactory或ApplicationContext创建bean对象。
  3. 单例模式:Spring中bean的默认作用域就是singleton,也就是说,Spring容器中的bean默认都是单例的。
  4. 适配器模式:Spring框架的许多地方使用了适配器模式,如Spring MVC。
  5. 代理模式:Spring AOP就是基于动态代理的,如果要代理的对象,实现了某个接口,那么Spring AOP会使用JDK Proxy,去创建代理对象。

相关文章:

Spring框架面试总结

Spring基础 什么是spring框架 Spring 框架是一个用于构建企业级 Java 应用程序的开源框架。【Java项目快速构建轻量级框架】我们一般说 Spring 框架指的都是 Spring Framework&#xff0c;它是很多模块的集合&#xff0c;使用这些模块可以很方便地协助我们进行开发。【根据模…...

java之网络编程篇

前言 网络编程就是计算机和计算机之间通过网络进行数据传输&#xff0c;下面介绍一些概念和如何实现UDP和TCP两种模式的传输。 一、常见的软件架构C/S和B/S C/S架构需要一个客户端软件程序服务器 B/S只需要打开网页服务器 C/S架构的优缺点和应用场景 优点&#xff1a;画面可以…...

stm32f103c8t6与TB6612FNG解耦测试

stm32f103c8t6与TB6612FNG解耦测试 本文操作方式: 忽略底层,只做上层, 所以前面全部照搬步骤,重在调试 文章目录 stm32f103c8t6与TB6612FNG解耦测试本文操作方式:创建基本工程(1)跳转此链接,创建(2)创建电机驱动文件夹(3)PWM原理(4)电机转动控制 oled调试和key调试(5)OLED转速…...

2253336 - 资源库 - OAC0 中的脱机状态

症状 资源库的状态显示为离线。 环境 SAP 内容服务器 6.50 或更高版本与 MaxDB 存储媒介结合使用对于状态为离线的资源库&#xff0c;测试报表 RSCMST 运行正常资源库可在应用程序中使用&#xff0c;没有任何问题 重现问题 启动事务 OAC0双击资源库按 "CSADMIN"…...

uni-app总结

1. <u-form-item label"报废人" ><u--input v-model"model.remark" border"bottom" placeholder"请输入"></u--input> </u-form-item> border"bottom" 报废日期 为了...

【JavaEE初阶】线程安全的集合类

&#x1f4d5; 引言 我们之前讲过的集合类&#xff0c;,大部分都不是线程安全的. Vector, Stack, HashTable, 是线程安全的(都是自带了synchronized,不建议用), 其他的集合类不是线程安全的。 注意&#xff1a;加锁不能保证线程一定安全&#xff0c;不加锁也不能确定线程一定…...

关于Vue项目npm快捷键,点击run启动报错,及npm i也报错的解决办法

1.配置idea的npm 2.点击运行按钮 3.结果 分析原因及问题&#xff1a; npm i npm run dev 由于是刚刚从gitlab新拉的前端代码&#xff0c;可能没有用命令install过类似于没有编译过&#xff0c;所以执行一下上面的命令 结果报错如下&#xff1a; F:\tbyf\qjyy\hip-manager-ui&…...

React中,className属性自定义组件不生效的问题

在React中&#xff0c;className属性不仅适用于原生的HTML元素&#xff0c;也可以用于自定义组件。实际上&#xff0c;className属性是React中通用的属性&#xff0c;可以应用于任何React元素&#xff0c;无论是原生的HTML元素还是自定义的组件。 为什么使用className而不是cl…...

Ubuntu22.04搭建fabric开发环境、开发环境下运行链码

在智能合约开发过程中&#xff0c;开发人员需要一种快速、迭代地测试链码包的方法&#xff0c;而无需为每次修改运行链码生命周期命令。 使用 Fabric 二进制文件并启动peer处于开发模式&#xff08;“DevMode”&#xff09;&#xff0c;然后将链码连接到peer。它允许您启动链代…...

[BSidesCF 2019]Kookie1

打开题目&#xff0c;看到 根据提示&#xff0c;账号&#xff1a;cookie。密码&#xff1a;monster。试一下登录&#xff0c;登陆成功 抓包看看信息 根据提示&#xff0c; 看一下返回包 账号要加username要改成admin&#xff0c;改一下试试 构造cookie 直接得到flag flag{c…...

LCM红外小目标检测

根据站内的matlab代码修改成python版本。 import numpy as np import matplotlib.pyplot as plt import cv2 from pylab import mpl# 设置中文显示字体 mpl.rcParams["font.sans-serif"] ["SimHei"]def LCM_computation(patch_LCM_in):row, col patch_L…...

振德医疗选择泛微千里聆RPA,助力电商、人事业务流程自动化

振德医疗用品股份有限公司成立于1994年&#xff0c;中国A股上市公司&#xff0c;是医用敷料和感控防护产品主要的供应商之一。 &#xff08;图片素材来自振德医疗官网&#xff09; 振德医疗的业务在线上线下齐发力。目前拥有5个国内生产基地&#xff0c;3个海外工厂&#xff0…...

VBA高级应用30例应用3在Excel中的ListObject对象:创建表

《VBA高级应用30例》&#xff08;版权10178985&#xff09;&#xff0c;是我推出的第十套教程&#xff0c;教程是专门针对高级学员在学习VBA过程中提高路途上的案例展开&#xff0c;这套教程案例与理论结合&#xff0c;紧贴“实战”&#xff0c;并做“战术总结”&#xff0c;以…...

IP 地址在 SQL 注入攻击中的作用及防范策略

数据库在各个领域的逐步应用&#xff0c;其安全性也备受关注。SQL 注入攻击作为一种常见的数据库攻击手段&#xff0c;给网络安全带来了巨大威胁。今天我们来聊一聊SQL 注入攻击的基本知识。 SQL 注入攻击的基本原理 SQL 注入是通过将恶意的 SQL 代码插入到输入参数中&#xf…...

Unity VR黑屏

picosdk里面的&#xff0c;有修改 using System.Collections; using System.Collections.Generic; using UnityEngine;public class ScreenFade : MonoBehaviour {[Tooltip("颜色")]public Color fadeColor new Color(0.0f, 0.0f, 0.0f, 1.0f);private int renderQ…...

Vue.js 中使用 Watcher 的强大场景和案例

目录 表单验证 示例代码: HTML: 获取 API 数据 示例代码: HTML: 深度监听对象变化 示例代码: HTML: 观察多个数据源 示例代码: HTML: Vue.js 是一个流行的前端框架,以其直观的数据绑定和组件驱动的开发模式而闻名。其中,watch 功能是其响应式编程模型…...

《实现 DevOps 平台(2) · GitLab CI/CD 交互》

&#x1f4e2; 大家好&#xff0c;我是 【战神刘玉栋】&#xff0c;有10多年的研发经验&#xff0c;致力于前后端技术栈的知识沉淀和传播。 &#x1f497; &#x1f33b; CSDN入驻不久&#xff0c;希望大家多多支持&#xff0c;后续会继续提升文章质量&#xff0c;绝不滥竽充数…...

【机器学习sklearn实战】岭回归、Lasso回归和弹性网络

一 sklean中模型详解 1.1 Ride regression 1.2 Lasso regression 1.3 ElasticNet 二 算法实战 2.1 导入包 import numpy as np import pandas as pd from sklearn import datasets from sklearn.model_selection import train_test_split, GridSearchCV from sklearn.linear…...

Python 爬虫项目实战六:抓取猫眼电影排行榜的数据

在这篇博客中&#xff0c;我们将通过一个实际的Python爬虫项目&#xff0c;详细讲解如何抓取网页数据。本次选择的实战项目是抓取猫眼电影排行榜的数据&#xff0c;通过这个项目&#xff0c;你将学会如何使用Python编写爬虫&#xff0c;从网页中提取有用的电影信息。 一、项目…...

YOLO系列:从yolov1至yolov8的进阶之路 持续更新中

一、基本概念 1.YOLO简介 YOLO&#xff08;You Only Look Once&#xff09;&#xff1a;是一种基于深度神经网络的对象识别和定位算法&#xff0c;其最大的特点是运行速度很快&#xff0c;可以用于实时系统。 2.目标检测算法 RCNN&#xff1a;该系列算法实现主要为两个步骤&…...

Python学习(7) ----- Python起源

&#x1f40d;《Python 的诞生》&#xff1a;一段圣诞假期的奇妙冒险 &#x1f4cd;时间&#xff1a;1989 年圣诞节 在荷兰阿姆斯特丹的一个寒冷冬夜&#xff0c;灯光昏黄、窗外飘着雪。一个程序员 Guido van Rossum 正窝在家里度假——没有会议、没有项目、没有 bug&#xf…...

JAVA学习-练习试用Java实现“TF-IDF算法 :用于文本特征提取。”

问题: java语言编辑&#xff0c;实现TF-IDF算法 &#xff1a;用于文本特征提取。 解答思路: TF-IDF&#xff08;Term Frequency-Inverse Document Frequency&#xff09;是一种常用的文本特征提取方法&#xff0c;用于评估一个词语对于一个文件集或一个语料库中的其中一份文件的…...

【CUDA 】第5章 共享内存和常量内存——5.3减少全局内存访问(2)

CUDA C编程笔记 第五章 共享内存和常量内存5.3 减少全局内存访问5.3.2 使用展开的并行规约思路reduceSmemUnroll4&#xff08;共享内存&#xff09;具体代码&#xff1a;运行结果意外发现书上全局加载事务和全局存储事务和ncu中这两个值相同 5.3.3 动态共享内存的并行规约reduc…...

springboot线上教学平台

摘要&#xff1a;在社会快速发展的影响下&#xff0c;使线上教学平台的管理和运营比过去十年更加理性化。依照这一现实为基础&#xff0c;设计一个快捷而又方便的网上线上教学平台系统是一项十分重要并且有价值的事情。对于传统的线上教学平台控制模型来说&#xff0c;网上线上…...

【C/C++】EBO空基类优化介绍

空对象优化&#xff08;Empty Base Optimization&#xff0c;简称 EBO&#xff09;是 C 编译器的一种 优化技术&#xff0c;用于消除空类作为基类时占用的内存空间&#xff0c;从而避免浪费空间、提升结构体或类的存储效率。 1 什么是“空对象”&#xff1f; 一个**空类&#…...

应用层协议:HTTPS

目录 HTTPS&#xff1a;超文本传输安全协议 1、概念 2、通信过程及关键技术 2.1 通信过程 1> TLS握手协商&#xff08;建立安全通道&#xff09; 2> 加密数据传输 2.2 关键技术 1> 对称加密算法 2> 非对称加密 3> 对称加密和非对称加密组合 4> 数…...

嵌入式学习--江协stm32day4

只能说拖延没有什么好结果&#xff0c;欠下的债总是要还的。 ADC 模拟信号转化为数字信号&#xff0c;例如温度传感器将外部温度的变化&#xff08;模拟信号&#xff09;&#xff0c;转换为内部电压的变化&#xff08;数字信号&#xff09; IN是八路输入&#xff0c;下方是选择…...

[面试精选] 0094. 二叉树的中序遍历

文章目录 1. 题目链接2. 题目描述3. 题目示例4. 解题思路5. 题解代码6. 复杂度分析 1. 题目链接 94. 二叉树的中序遍历 - 力扣&#xff08;LeetCode&#xff09; 2. 题目描述 给定一个二叉树的根节点 root &#xff0c;返回 它的 中序 遍历 。 3. 题目示例 示例 1 : 输入&…...

学习笔记(23): 机器学习之数据预处理Pandas和转换成张量格式[1]

学习笔记(23): 机器学习之数据预处理Pandas和转换成张量格式[1] 学习机器学习&#xff0c;需要学习如何预处理原始数据&#xff0c;这里用到pandas&#xff0c;将原始数据转换为张量格式的数据。 1、安装pandas pip install pandas 2、写入和读取数据 >>创建一个人工…...

【QT】自定义QWidget标题栏,可拖拽(拖拽时窗体变为normal大小),可最小/大化、关闭(图文详情)

目录 0.背景 1.详细实现 思路简介 .h文件 .cpp文件 0.背景 Qt Linux&#xff1b;项目遇到问题&#xff0c;解决后特此记录 项目需要&#xff0c;个性化的标题栏&#xff08;是个widget&#xff09;&#xff0c;在传统的三个按钮&#xff08;最大化、最小化、关闭&#xf…...