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

Java知识点整理 16 — Spring Bean

在之前的文章 Java知识点整理 8 — Spring 简介 中介绍了 Spring 的两大核心概念 IoC 和 AOP,但对 Spring Bean 的介绍不全面,本文将补充 Spring 中 Bean 的概念。

一. 什么是 Spring Bean 

在 Spring 官方文档中,对 bean 的定义为:构成应用程序主干并由 Spring IoC 容器管理的对象称为 bean。bean 是由 Spring IoC 容器实例化、组装和管理的对象。

开发者需要告诉 IoC 容器协助管理哪些对象,这个是通过配置元数据来定义的。配置元数据可以是 XML文件(较老)、注解或者 Java 配置类。

二. 通过例子来理解

首先有一个 Student 类,里面有两个成员变量 id 和 name,并提供 set、get方法。

public class Student {private Integer id;private String name;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}
}

另一个类是 StudentManager,有一个 Student 的对象,提供了 setStudent 方法初始化 Student 对象,并且它的 show 方法能够打印这个 student 的 id 和 name。

public class StudentManager {private Student student;public void setStudent(Student student) {this.student = student;}public void show() {System.out.println(student.getId());System.out.println(student.getName());}
}

分析以上两段代码发现,两个类之间高度耦合,后者依赖于前者。假如没有及时对 StudentManager 的 student 绑定对象,却调用了 show 方法,那么程序就会报空指针异常的错误。因此 Spring 提供了 IoC(控制反转)和 DI(依赖注入)进行解耦。

在 Spring 中不需要自己创建对象,只需要告诉 Spring,哪些类需要创建,然后在启动项目时 Spring 就会自动帮助创建对应的对象,并且只存在一个类的实例。这个类的实例也就是 Bean,而这种模式通常称为单例模式,即一个类只有一个实例。

继续思考,开发者该如何告诉 Spring 哪些类需要创建对象呢?

最简单最常用的方式就是 Java 注解配置。也就是将一个类声明为 Bean 所需要的注解。

声明含义
@Component通用注解,可标注任意类为 Spring 组件。如果一个 Bean 不知道属于哪个层,可以使用该注解标注
@Repository当前类在持久层(Dao层),主要用于数据库相关操作。
@Service当前类在业务逻辑层,主要涉及复杂的逻辑。
@Controller当前类在控制层,主要用于接受用户请求并调用 Service 层返回数据给前端页面。

其实以上四种声明方式效果完全一致,使用不同的关键词是让开发者快速了解该类属于哪一层。

例如,在刚才的 Student 类前加上 @Component 注解,就告诉 Spring:你要在项目创建运行时帮我创建 Student 类的 Bean(对象)

@Component
public class Student {private Integer id;private String name;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}
}

此时"依赖"添加完毕,但还没结束。虽然让 Spring 帮助我们创建了对象,但 StudentManager 怎么知道这个被创建的对象在哪呢?所以接下来要告诉 StudentManager 刚才 Spring 帮助创建的 Bean(对象)在哪,也就是注入 Bean

注入注解
声明含义
@Autowired根据 Bean 的 Class 类型自动装配
@Inject字面意思注入
@Resource字面意思资源,根据 Bean 的属性名称(id / name)自动装配

例如,在 StudentManager 类中声明成员变量 Student 的前面加上 @Autowired,Spring 会自动注入一个 Bean。

@Component
public class StudentManager {@Autowiredprivate Student student;public void show() {System.out.println(student.getId());System.out.println(student.getName());}
}

三. @Bean 注解的使用

  • @Bean 注解作用在方法上,产生一个 Bean 对象,然后将其交给 Spring 管理。Spring 会将这个 Bean 对象放在自己的 IoC 容器中。
  • @Bean 方法名与返回类名一致,首字母小写。
  • @Component、@Repository、@Controller、@Service 这些注解只局限于自己编写的类,@Bean 注解能把第三方库中的类实例加入 IoC 容器并交给 Spring 管理。
  • @Bean 一般和 @Component 或 @Configuration 一起使用。

四. @Component 和 @Bean 的区别

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

@Bean 注解的使用:

@Configuration //标记该类为配置类,提供配置信息给 Spring 容器。
public class AppConfig {@Beanpublic TransferService transferService() {return new TransferServiceImpl();}
}

五. @Autowired 和 @Resource 的区别

@Autowired 属于 Spring 内置的注解,默认注入方式为 byType,优先根据接口类型去匹配并注入 Bean(接口的实现类)。

但如果一个接口存在多个实现类,byType 这种方式可能无法正确注入对象,因为 Spring 找到了多个满足条件的选择,默认情况下不知道选哪一个。这种情况下,注入方式会变为 byName,即根据名称匹配,这个名称通常是类名,如下面的 SmsService。

// smsService 就是上面所说的名称
@Autowired
private SmsService smsService;

如果 SmsService 接口有两个实现类:SmsServiceImpl1 和 SmsServiceImpl2,且它们都被 Spring 容器管理。

// 报错,byName 和 byType 都无法匹配到 bean
@Autowired
private SmsService smsService;
// 正确注入 SmsServiceImpl1 对象对应的 bean
@Autowired
private SmsService smsServiceImpl1;
// 正确注入  SmsServiceImpl1 对象对应的 bean
// smsServiceImpl1 就是我们上面所说的名称
@Autowired
@Qualifier(value = "smsServiceImpl1")
private SmsService smsService;

通过 @Qualifier 注解能够显式指定名称,而不是依赖变量名称。

@Resource 属于JDK提供的注解,默认注入方式为 byName。如果无法通过名称匹配到对应的 Bean,注入方式会变为 byType。

@Resource 有两个比较重要且日常开发常用的属性:name(名称)和 type(类型)。

// 报错,byName 和 byType 都无法匹配到 bean
@Resource
private SmsService smsService;
// 正确注入 SmsServiceImpl1 对象对应的 bean
@Resource
private SmsService smsServiceImpl1;
// 正确注入 SmsServiceImpl1 对象对应的 bean(比较推荐这种方式)
@Resource(name = "smsServiceImpl1")
private SmsService smsService;

总结一下:

  • @Autowired 是 Spring 提供的注解,@Resource 是 JDK 提供的注解。
  • @Autowired 默认的注入方式为 byType,@Resource 默认的注入方式为 byName。
  • 当一个接口存在多个实现类时,两个注解都需要通过名称才能正确匹配到对应的 Bean。@Autowired 可以通过 @Qualifier 注解来显示指定名称,@Resource 可以通过 name 属性来显式指定名称。
  • @Autowired 支持在构造函数、方法、字段和参数上使用。@Resource 主要用于字段和方法上的注入,不支持在构造函数或参数上使用。

六. Bean 的作用域

通常有以下几种:

作用域含义
singleton(默认)IoC容器中只有唯一的 bean 实例。Spring 中的 bean 默认都是单例的,单例模式的应用。
prototype每次获取都会创建一个新的 bean 实例。如果连续 getBean() 两次,得到的是不同的 Bean 实例。
request(仅 Web 应用)每次 HTTP 请求都会产生一个新的 bean(请求 bean),该 bean 仅在当前 HTTP request 内有效。
session(仅 Web 应用)每次来自新 session 的 HTTP 请求都会产生一个新的 bean(会话 bean),该 bean 仅在当前 HTTP session 内有效。
application(仅 Web 应用)每个 Web 应用在启动时创建一个 bean(应用 bean),该 bean 仅在当前应用启动时间内有效。
websocket(仅 Web 应用)每次 WebSocket 会话产生一个新的 bean。

如何配置:

// 注解方式
@Bean
@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public Person personPrototype() {return new Person();
}

七. Bean 的生命周期

1. 创建 Bean 的实例:Bean 容器首先会找到配置文件中的 Bean 定义,然后使用 Java 反射 API 来创建 Bean 的实例。

2. Bean 属性赋值/填充:为 Bean 设置相关属性和依赖,例如 @Autowired 等注解注入对象、@Value 注入值、@Resource 注入各种资源等。

3. Bean 初始化:

  • 如果 Bean 实现了 BeanNameAware 接口,调用 setBeanName() 方法,传入 Bean 的名字。
  • 如果 Bean 实现了 BeanClassLoaderAware 接口,调用 setBeanClassLoader() 方法,传入 ClassLoader 对象的实例。
  • 与上面的类似,如果实现了其他 *.Aware 接口,就调用相应的方法。
  • 如果有和加载这个 Bean 的 Spring 容器相关的 BeanPostProcessor 对象,执行postProcessBeforeInitialization() 方法
  • 如果 Bean 实现了 InitializingBean 接口,执afterPropertiesSet() 方法。
  • 如果 Bean 在配置文件中的定义包含 init-method 属性,执行指定的方法。
  • 如果有和加载这个 Bean 的 Spring 容器相关的 BeanPostProcessor 对象,执行postProcessAfterInitialization() 方法。

4. 销毁 Bean:销毁并不是说立刻把 Bean 销毁掉,而是把 Bean 的销毁方法先记录下来,将来需要销毁 Bean 或者销毁容器的时候,就调用这些方法去释放 Bean 所持有的资源。

  • 如果 Bean 实现了 DisposableBean 接口,执行 destroy() 方法。
  • 如果 Bean 在配置文件中的定义包含 destroy-method 属性,执行指定的 Bean 销毁方法。或者,也可以直接通过 @PreDestroy 注解标记 Bean 销毁之前执行的方法。

相关文章:

Java知识点整理 16 — Spring Bean

在之前的文章 Java知识点整理 8 — Spring 简介 中介绍了 Spring 的两大核心概念 IoC 和 AOP,但对 Spring Bean 的介绍不全面,本文将补充 Spring 中 Bean 的概念。 一. 什么是 Spring Bean 在 Spring 官方文档中,对 bean 的定义为&#xf…...

Nvidia Jetson/RK3588+AI双目立体相机,适合各种割草机器人、扫地机器人、AGV等应用

双目立体视觉是基于视差原理,依据成像设备从不同位置获取的被测物体的图像,匹配对应点的位置偏移,得到视差数据,进而计算物体的空间三维信息。为您带来高图像质量的双目立体相机,具有高分辨率、低功耗、远距离等优点&a…...

springboot使用feign调用不依赖cloud

在使用spring boot调用第三方api中,常用的是okhttp、apache http client等,但是直接使用下来还是有点繁琐,需要手动转换实体。 在springcloud中有个openfeign调用,第一次体验到调用接口还能这么丝滑。注解写道接口上,…...

springboot中使用springboot cache

前言&#xff1a;SpringBoot中使用Cache缓存可以提高对缓存的开发效率 此图片是SpringBootCache常用注解 Springboot Cache中常用注解 第一步&#xff1a;引入依赖 <!--缓存--><dependency><groupId>org.springframework.boot</groupId><artifactId…...

Promise,async/await的运用

一&#xff0c;了解Promise Promise是异步编程的一种解决方案&#xff0c;它是一个对象&#xff0c;可以获取异步操作的消息&#xff0c;它的出现避免了地狱回调。 &#xff08;1&#xff09;Promise的实例有三个状态&#xff1a; Pending&#xff08;进行中&#xff09; Re…...

图论·多源最短路径Floyddijsktra

例题地址 多源最短路径 多个源点多个终点可以使用Floyd算法直接求各源点到终点的最短距离&#xff0c;也可以直接多次使用dijsktra算法求单源点到终点的最短距离 Floyd算法 使用条件 多源最短路径权值正负皆可 核心思想&#xff1a;动态规划 子问题&#xff1a; 设(A,B)…...

微服务 | Springboot整合GateWay+Nacos实现动态路由

1、简介 路由转发 执行过滤器链。 ​ 网关&#xff0c;旨在为微服务架构提供一种简单有效的统一的API路由管理方式。同时&#xff0c;基于Filter链的方式提供了网关的基本功能&#xff0c;比如&#xff1a;鉴权、流量控制、熔断、路径重写、黑白名单、日志监控等。 基本功能…...

做google SEO 有哪些好用的工具?这12款谷歌SEO工具值得收藏!

1、Google Trends 谷歌旗下一款基于搜索数据推出的一款免费分析工具 外贸人有句老话&#xff0c;七分靠选品&#xff0c;三分靠运营。在你开始做独立站之前&#xff0c;在你不清楚你的行业在Google上面能否有足够的流量时&#xff0c;那么Google Trends则是你最好的工具。 你只…...

【变频调速在锅炉引风机控制中的应用】

变频调速在锅炉引风机控制中的应用 变频器的选型 变频器是利用电力半导体器件的通断作用将工频电源变换为另一种频率的电能控制装置,能宏观对交流异步电机软启动,变频调速,提高运转精度,改变功率因数,过流/过压/过载保护等功能,国内技术较领先的品牌有汇川、欧瑞(原烟台…...

网络配置(IP、NETMASK、GATEWAY、DNS、DHCP) <持续更新中>

参考&#xff1a; 初学Linux之网络配置(IP、NETMASK、GATEWAY、DNS、DHCP)-CSDN博客【学习笔记】网关 & 路由_网关和路由-CSDN博客【学习笔记】计算机网络 IP地址与MAC地址_根据mac分配ip-CSDN博客【学习笔记】TCP 和 UDP 协议_tcp 发送 syn 应答没有syn ack-CSDN博客 一…...

【ArcGIS 脚本工具】拯救密恐,隐藏唯一值渲染图层的标记符号

最近拿到了【Hello 图狗】制作的三调/变更样式符号库&#xff0c;确实比之前网上下载的版本好用很多。 ArcGIS Pro三调23变更符号库V1.02&#xff08;汇总&#xff09;_中大比例尺.stylx和样式属性对调 不过使用过程中触发了一个旧病&#xff0c;就是匹配样式之后&#xff0c;…...

tensorflow学习1.3-创建会话,启动会话

tensorflow学习1.3-创建会话&#xff0c;启动会话 会话的由来与作用由来作用 会话的定义与结构定义 用法基本用法上下文管理器执行部分计算图获取多个结果 总结 练习代码报错原因&#xff1a;TensorFlow 2.x中的Eager Execution使用兼容模式来启用SessionEager Execution和计算…...

QT基本对话框(基本对话框、工具盒类、进度条、调色板与电子钟、可扩展对话框、程序启动画面)

此篇文章通过实例介绍基本对话框的用法。首先介绍标准文件对话框&#xff08;QFileDialog&#xff09;、标准颜色对话框&#xff08;QColorDialog&#xff09;、标准字体对话框&#xff08;QFontDialog&#xff09;、标准输入对话框&#xff08;QInputDialog&#xff09;以及标…...

Docker 部署 MariaDB 数据库 与 Adminer 数据库管理工具

文章目录 MariaDBmariadb.cnf开启 binlog Adminerdocker-compose.ymlAdminer 连接 MariaDB MariaDB MariaDB是一个流行的开源关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;它是MySQL的一个分支和替代品。 官网&#xff1a;https://mariadb.com/镜像&#xff…...

qt 可以在一个函数中读一个文件,然后再将内容写入另一个文件中

是的&#xff0c;Qt 允许你在一个函数中读取一个文件的内容&#xff0c;并将这些内容写入到另一个文件中。这可以通过结合使用 QFile 和 QTextStream&#xff08;或 QDataStream&#xff0c;取决于你的具体需求&#xff09;来实现。以下是一个简单的示例&#xff0c;展示了如何…...

Dijkstra算法C代码

一个带权图n个点m条边&#xff0c;求起点到终点的最短距离 先定义一个邻接矩阵graph&#xff0c;graph[i][j]表示从i到j的距离&#xff0c;i到j没有路就表示为无穷 然后定义一个visit数组&#xff0c;visit[i]表示i结点是否被访问 然后定义一个dist数组&#xff0c;dist[i]表…...

P1064 [NOIP2006 提高组] 金明的预算方案

[NOIP2006 提高组] 金明的预算方案 题目描述 金明今天很开心&#xff0c;家里购置的新房就要领钥匙了&#xff0c;新房里有一间金明自己专用的很宽敞的房间。更让他高兴的是&#xff0c;妈妈昨天对他说&#xff1a;“你的房间需要购买哪些物品&#xff0c;怎么布置&#xff0…...

大型企业组网如何规划网络

大型企业组网是一个复杂的过程&#xff0c;它需要细致的规划和设计&#xff0c;以确保网络能够满足企业的业务需求&#xff0c;同时保证性能、安全性和可扩展性。以下是规划大型企业网络的一些关键步骤和考虑因素&#xff1a; 1. 需求分析 业务需求&#xff1a;与各个业务部门…...

java:aocache的单实例缓存(二)

之前一篇博客《java:aocache的单实例缓存》介绍了aoocache使用注解AoCacheable实现单实例缓存的方式&#xff0c;同时也指出了这种方式的使用限制&#xff0c;就是这个注解定义的构造方法&#xff0c;不能再创建出新实例。 为了更灵活方便的实现单实例。aocache最新版本0.4.0增…...

ElasticSearch安装部署

简介 Elasticsearch 是一个开源的分布式搜索和分析引擎&#xff0c;用于实时地存储、检索和分析大数据量。它基于 Apache Lucene 搜索引擎库构建而成&#xff0c;提供了一个强大、稳定且易于扩展的搜索解决方案。 主要特点和用途&#xff1a; 分布式存储和搜索&#xff1a; E…...

数据赋能(132)——开发:数据转换——影响因素、直接作用、主要特征

影响因素 数据转换过程中需要考虑的一些影响因素&#xff1a; 数据格式与结构&#xff1a; 不同系统或应用可能使用不同的数据格式&#xff08;如JSON、XML、CSV等&#xff09;和数据结构&#xff08;如关系型数据库、非关系型数据库等&#xff09;。数据转换需要确保原始数据…...

TMGM:ASIC撤销禁令,TMGM强化合规、重启差价合约服务

TMGM作为差价合约&#xff08;CFDs&#xff09;与保证金外汇交易领域的领航者&#xff0c;安全、合规、高效被奉为我集团的终身使命。澳大利亚证券和投资委员会&#xff08;ASIC&#xff09;已正式撤销了早前针对TMGM差价合约业务实施的临时止损令。这一误会的解除&#xff0c;…...

基于SpringBoot网吧管理系统设计和实现(源码+LW+调试文档+讲解等)

&#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN作者、博客专家、全栈领域优质创作者&#xff0c;博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; Java精品实战案例《600套》 2025-2026年最值得选择的Java毕业设计选题大全&#xff1…...

实测2024年最佳的三款Socks5代理IP网站

一、引言 在浩瀚的网络世界中&#xff0c;Socks5代理IP服务如同导航灯塔&#xff0c;指引我们穿越数据海洋&#xff0c;安全、稳定地访问目标网站。作为专业的测评团队&#xff0c;我们深知一款优秀的Socks5代理IP网站需要具备哪些特质&#xff1a;稳定的IP资源、高效的连接速…...

Pythonnet能导入clr,但无法引入System模块?

【pythonnet详解】—— Python 和 .NET 互操作的库_pythonnet 详细使用-CSDN博客 Python中动态调用C#的dll动态链接库中方法_python 如何调用c# dll-CSDN博客 需求&#xff1a;Python调用并传List<float>类型参数给.Net 起初&#xff1a;直接 # 创建一个Python浮点数…...

媒体宣发套餐的概述及推广方法-华媒舍

在今天的数字化时代&#xff0c;对于产品和服务的宣传已经变得不可或缺。媒体宣发套餐作为一种高效的宣传方式&#xff0c;在帮助企业塑造品牌形象、扩大影响力方面扮演着重要角色。本文将揭秘媒体宣发套餐&#xff0c;为您呈现一条通往成功的路。 1. 媒体宣发套餐的概述 媒体…...

Windows和Linux C++判断磁盘空间是否充足

基本是由百度Ai写代码生成的&#xff0c;记录一下。实现此功能需要调用系统的API函数。 对于Windows&#xff0c;可调用函数GetDiskFreeSpaceEx&#xff0c;使用该函数需要包含头文件windows.h。该函数的原型&#xff1a; 它的四个参数&#xff1a; lpDirectoryName&#xff0…...

数据访问层如何提取数据到其他层,其他类中

当然可以&#xff0c;以下是一些具体的例子&#xff0c;展示了如何将数据库访问逻辑封装在一个单独的类中&#xff0c;并在其他类中使用这个类来获取数据。 数据库访问类&#xff08;DatabaseAccess.java&#xff09;&#xff1a; java复制代码 import java.sql.*; import ja…...

【JS】AI总结:JavaScript中常用的判空方法

在JavaScript中&#xff0c;判空是一个常见的操作&#xff0c;因为变量可能未定义、未初始化或包含特定的空值。以下是JavaScript中常用的判空方法&#xff1a; 使用if语句直接判断&#xff1a; 如果变量是null、undefined、0、NaN、空字符串&#xff08;""&#xff…...

Rust单元测试、集成测试

单元测试、集成测试 在了解了如何在 Rust 中写测试用例后&#xff0c;本章节我们将学习如何实现单元测试、集成测试&#xff0c;其实它们用到的技术还是上一章节中的测试技术&#xff0c;只不过对如何组织测试代码提出了新的要求。 单元测试 单元测试目标是测试某一个代码单…...

vue全局方法plugins/utils

一、在src目录下创建一个plugins文件夹 test.ts文件存放创建的方法&#xff0c;index.ts用于接收所有自定义方法进行统一处理 二、编写自定义方法 // test.ts文件 export default {handleTest(val1: number, val2: number) {// 只是一个求和的方法return val1 val2;}, };三…...

高阶算法班从入门到精通之路

课程介绍 本课程旨在帮助学员深入理解算法与数据结构的核心概念&#xff0c;从而掌握高级算法设计与分析技能。每集课程内容精心设计&#xff0c;涵盖了常用数据结构、经典算法及其应用场景等方面的深度讲解&#xff0c;同时通过大量实例演练&#xff0c;帮助学员提升解决实际…...

C++ 左值右值

文章目录 概述左值右值右值引用左值和右值的互换 小结 概述 左值和右值属于2中不同的表达式类型&#xff1b;它们在表达式中扮演不同的角色&#xff0c;特别是在赋值操作和函数参数传递中。 左值 定义&#xff1a;左值是指那些在内存中有确定位置的表达式&#xff0c;可以出…...

[数据集][目标检测]水面垃圾水面漂浮物检测数据集VOC+YOLO格式3749张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;3749 标注数量(xml文件个数)&#xff1a;3749 标注数量(txt文件个数)&#xff1a;3749 标注…...

[深度学习] 卷积神经网络CNN

卷积神经网络&#xff08;Convolutional Neural Network, CNN&#xff09;是一种专门用于处理数据具有类似网格结构的神经网络&#xff0c;最常用于图像数据处理。 一、CNN的详细过程&#xff1a; 1. 输入层 输入层接收原始数据&#xff0c;例如一张图像&#xff0c;它可以被…...

区别QPushButton和QToolButton

在刚开始学习Qt时,可能很难理解QPushButton和QToolButton之间的区别。 QToolButton通常用于QToolBar中,常常只显示图标,而不显示文本。那么,它们的主要区别是什么?什么时候应该使用QPushButton,什么时候应该使用QToolButton? 了解这一点很重要,这样我们才能选择最合适…...

【Python】已解决:TypeError: Object of type JpegImageFile is not JSON serializable

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决&#xff1a;TypeError: Object of type JpegImageFile is not JSON serializable 一、分析问题背景 在进行Python编程时&#xff0c;特别是处理图像数据和JSON序列化时&…...

超简单的nodejs使用log4js保存日志到本地(可直接复制使用)

引入依赖 npm install log4js 新建配置文件logUtil.js const log4js require(log4js);// 日志配置 log4js.configure({appenders: {// 控制台输出consoleAppender: { type: console },// 文件输出fileAppender: {type: dateFile,filename: ./logs/default, //日志文件的存…...

Python面试宝典第1题:两数之和

题目 给定一个整数数组 nums 和一个目标值 target&#xff0c;找出数组中和为目标值的两个数的索引。可以假设每个输入只对应唯一的答案&#xff0c;且同样的元素不能被重复利用。比如&#xff1a;给定 nums [2, 7, 11, 15] 和 target 9&#xff0c;返回 [0, 1]&#xff0c;因…...

fastapi集成jwt

fastapi集成jwt fastapipython-jose实现jwt登录 1、安装相关包 python-jose pip install python-jose2、创建token及token校验 from copy import deepcopy from datetime import timedelta, datetimefrom jose import jwt, ExpiredSignatureErrorSECRET_KEY "xxx&quo…...

自定义一个背景图片的高度,随着容器高度的变化而变化,小于图片的高度时裁剪,大于时拉伸100%展示

1、通过js创建<image?>标签来获取背景图片的宽高比&#xff1b; 2、当元素的高度大于原有比例计算出来的高度时&#xff0c;背景图片的高度拉伸自适应100%&#xff0c;否则高度为auto&#xff0c;会自动被裁减 3、背景图片容器高度变化时&#xff0c;自动计算背景图片的…...

iPhone怎么恢复删除的数据?几款顶级iPhone数据恢复软件

从iOS设备恢复数据。 对于任何数据恢复软件来说&#xff0c;从iOS设备恢复数据都是一项复杂的任务&#xff0c;因为Apple已将众多数据保护技术集成到现代iPhone和iPad中。其中包括硬件加密和文件级加密。iOS 上已删除的数据只能通过取证文件工件搜索来找到&#xff0c;例如分析…...

macOS 上或linux安装 Jenkins

在 macOS 上使用 Docker 安装 Jenkins 的步骤如下&#xff1a; 安装 Docker: 如果尚未安装 Docker&#xff0c;请先从 Docker 官网下载并安装 Docker Desktop for Mac。 打开终端: 打开 macOS 上的终端应用程序。 拉取 Jenkins 镜像: 使用以下命令从 Docker Hub 拉取 Jenkins…...

axios发送数据的几种方式

axios 发送数据的几种方式 1、最简单的方式是将参数直接拼接在 URL 上&#xff0c;这通常用于传递少量的数据&#xff0c;例如资源的 ID。 const id 12; axios.delete(https://api.example.com/${id}).then(response > {console.log(Resource deleted successfully:, res…...

示例:WPF中推荐一个Diagram开源流程图控件

一、目的&#xff1a;分享一个自研的开源流程图控件 二、使用方法 1、引用Nuget包&#xff1a; 2、添加节点列表和绘图控件 <DockPanel><ItemsControl DockPanel.Dock"Left"><h:GeometryNodeData Text"节点"/></ItemsControl><…...

离线安装kubesphere-详细操作,以及报错

离线安装kubesphere 官网地址 https://kubesphere.io/zh/docs/v3.4/installing-on-linux/introduction/air-gapped-installation/ 1.先准备docker环境 [rootnode1 ~]# tar -xf docker-24.0.6.tgz [rootnode1 ~]# ls anaconda-ks.cfg calico-v3.26.1.tar docker …...

Python Coala库:代码质量检查与自动化修复的利器

更多Python学习内容&#xff1a;ipengtao.com 在软件开发过程中&#xff0c;代码质量至关重要。高质量的代码不仅易于维护和扩展&#xff0c;还能减少错误和提升效率。为了确保代码质量&#xff0c;我们常常需要依赖代码分析工具。Python的Coala库就是这样一个强大的工具&#…...

MyBatis(12)MyBatis 映射文件中的 resultMap

MyBatis 的 resultMap 是一种高级映射策略&#xff0c;用于处理复杂的SQL查询结果和Java对象之间的映射关系。resultMap 提供了比 auto-mapping 更为灵活的映射方式&#xff0c;它允许开发者显式指定数据库列和Java对象属性之间的映射关系&#xff0c;甚至可以处理复杂的数据结…...

C语言从入门到进阶(15万字总结)

前言&#xff1a; 《C语言从入门到进阶》这本书可是作者呕心沥血之作&#xff0c;建议零售价1元&#xff0c;当然这里开个玩笑。 本篇博客可是作者之前写的所有C语言笔记博客的集结&#xff0c;本篇博客不止有知识点&#xff0c;还有一部分代码练习。 有人可能会问&#xff…...

Java---Maven详解

一段新的启程&#xff0c; 披荆斩棘而前&#xff0c; 心中的梦想&#xff0c; 照亮每个黑暗的瞬间。 无论风雨多大&#xff0c; 我们都将坚强&#xff0c; 因为希望的火焰&#xff0c; 在胸中永不熄灭。 成功不是终点&#xff0c; 而是每一步的脚印&#xff0c; 用汗水浇灌&…...

昇思25天学习打卡营第3天|张量Tensor

张量Tensor 概念创建张量&#xff08;4种方式&#xff09;张量的属性张量索引张量运算Tensor与NumPy转换 概念 张量&#xff08;Tensor&#xff09;是一种特殊的数据结构&#xff0c;与数组和矩阵非常相似。张量是MindSpore网络运算中的基本数据结构。 创建张量&#xff08;4…...

MT4外汇交易全攻略:从安装到精通的实战教程

MetaTrader 4&#xff08;MT4&#xff09;是一款由俄罗斯MetaQuotes Software开发的电子交易平台&#xff0c;最初于2005年发布。它被广泛用于外汇、差价合约&#xff08;CFD&#xff09;和期货市场的交易&#xff0c;提供了强大的图表分析工具、自动化交易能力和扩展性插件支持…...

Python基于PyQt5和卷积神经网络分类模型(CNN分类算法)实现时装类别识别系统GUI界面项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 随着深度学习技术的发展&#xff0c;计算机视觉领域取得了显著的进步&#xff0c;特别是在图像分类、目…...

开启IT世界的第一步:高考新生的暑期学习指南

目录 前言 了解IT领域 学习编程语言 实践项目 学习资源 阅读专业书籍 培养良好的学习习惯 结语 最后 - 投票 前言 七月的钟声敲响&#xff0c;各省的高考分数已揭晓&#xff0c;意味着一段紧张而又充满奋斗的旅程画上了句号。然而&#xff0c;高考的结束并不意味…...

目标检测之YOLOv6实践

序&#xff1a; 上一篇文讲了目标检测的基础知识&#xff0c;今天以YoloV6 为例&#xff08;选择v6&#xff0c;因为项目的选型&#xff09;&#xff0c;详细讲解目标检测的工程细节&#xff0c;一些重要的超参数&#xff0c;必须用到的工具&#xff0c;会在工程任务中解释。 …...

web学习笔记(七十一)

目录 1.vue2注册子组件 2. vue2组件传值父传子 3. vue2组件传值子传父 1.vue2注册子组件 vue2注册子组件和vue3不使用setup语法糖注册子组件是一样的&#xff0c;都需要通过components来注册子组件。 <template><div class"about"><h1>关于&l…...

【ai】livekit:Agents 3 : pythonsdk和livekit-agent的可编辑模式下的安装

livekit-agent 依赖于livekit、livekit-api、livekit-protocol 其中livekit就是livekkit-rtc: 包含俩sdk 实时互动sdkReal-time SDK for connecting to LiveKit as a participant livekit-api : 服务端sdk https://pypi.org/project/livekit-api/ livekit的python sdk...

什么是React?

01 Why React? What is React? I think the one-line description of React on its home page (https://react.dev/) is concise and accurate: “A JavaScript library for building user interfaces.” 我认为React主页(https://react.dev/)上的一行描述既简洁又准确: …...

时间|基于SprinBoot+vue的时间管理系统(源码+数据库+文档)

时间管理系统 目录 基于SprinBootvue的时间管理系统 一、前言 二、系统设计 三、系统功能设计 1管理员功能模块 2用户功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff1a;✌️大厂码农…...

Linux线程:管理与控制

一、引言 随着计算机硬件技术的飞速发展&#xff0c;尤其是多核CPU的普及&#xff0c;多线程编程已成为充分利用系统资源、提高程序并发性和响应速度的关键技术。 多线程编程允许一个程序中同时运行多个线程&#xff0c;每个线程可以独立地执行不同的任务。这种并行处理的方式…...

中国上市企业行业异质性数据分析

数据简介&#xff1a;企业行业异质性数据是指不同行业的企业在运营、管理、财务等方面的差异性数据。这些数据可以反映不同行业企业的特点、优势和劣势&#xff0c;以及行业间的异质性对企业经营和投资的影响。通过对企业行业异质性数据的分析&#xff0c;投资者可以更好地了解…...

linux input 驱动

使用文档 设备树修改 新增一个 LED 节点 arch/arm/boot/dts/arm/vexpress-v2p-ca9.dts my_pl_led {compatible = "arm, cortex-a9-led";status = "okay";};设备树编译 make dtbs日志 DTC arch/arm/boot/dts/arm/vexpress...