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

【Spring篇】Spring中的Bean管理

  

      🧸安清h:个人主页

   🎥个人专栏:【计算机网络】【Mybatis篇】

🚦作者简介:一个有趣爱睡觉的intp,期待和更多人分享自己所学知识的真诚大学生。 


目录

🎯Spring IOC容器

🚦BeanFactory接口

🚦ApplicationContext接口

🎯Bean的配置

🚦Bean元素的多个属性

🚦Bean元素的多个子元素

🎯Bean的实例化

🚦构造方法实例

✨pom.xml文件

 ✨创建Bean1类

✨编写applicationContext.xml文件

✨编写测试类

🚦静态工厂实例化

✨创建Bean2类

✨创建MyBean2Factory类

✨编写applicationContext.xml文件

✨编写测试类

🚦实例工厂实例化

✨创建Bean3类

✨创建MyBean3Factory类

✨编写applicationContext.xml文件

✨编写测试类

🎯Bean的作用域

🎯Bean的装配方式

🚦基于Xml的装配

🎯基于注解的装配 

🚦导入依赖

🚦创建XML配置文件

🚦定义实体类

🚦定义DAO层

🚦实现DAO层

🚦定义Service层

🚦实现Service层

🚦定义Controller层

🚦定义测试类


🎯Spring IOC容器

Spring框架的主要功能是通过Spring容器实现的,Spring容器可以管理人们开发的各种Bean。Spring提供了相应API来管理Bean,在Spring容器的API里,最常用的是BeanFactory和ApplicationContext这两个接口。

🚦BeanFactory接口

BeanFactory 是 Spring 框架中的一个核心接口,它定义了 Spring IoC 容器的基本功能。BeanFactory 提供了配置应用程序组件的方式,并且负责这些组件的生命周期和依赖关系的管理。它是 Spring 框架中最原始的 IoC 容器的表现形式。BeanFactory 通常由 ApplicationContext 接口实现。

BeanFactory接口的一些关键方法示例:

  1. Object getBean(String name):根据给定的 Bean 名称获取一个 Bean 实例。

  2. <T> T getBean(String name, Class<T> requiredType):根据给定的 Bean 名称和期望的类型获取一个 Bean 实例。

  3. Object getBean(String name, Object... args):根据给定的 Bean 名称和构造函数参数获取一个 Bean 实例。

  4. <T> T getBean(Class<T> requiredType):根据给定的类型获取一个 Bean 实例。

  5. <T> T getBean(Class<T> requiredType, Object... args):根据给定的类型和构造函数参数获取一个 Bean 实例。

  6. boolean containsBean(String name):检查是否包含一个具有给定名称的 Bean。

  7. boolean isSingleton(String name):检查一个具有给定名称的 Bean 是否是单例作用域。

  8. boolean isPrototype(String name):检查一个具有给定名称的 Bean 是否是原型作用域。

  9. boolean isTypeMatch(String name, Class<?> targetType):检查一个具有给定名称的 Bean 是否是指定类型的一个匹配。

  10. Class<?> getType(String name):获取一个具有给定名称的 Bean 的类型。

  11. String[] getAliases(String name):获取一个具有给定名称的 Bean 的所有别名。

🚦ApplicationContext接口

ApplicationContext 接口是 Spring 框架中 BeanFactory 的一个扩展,它提供了更多的高级功能和特性,以支持企业级应用开发。ApplicationContext 包含了 BeanFactory 的所有功能。

ApplicationContext 接口的一些关键实现包括:

  • ClassPathXmlApplicationContext:从类路径下的 XML 配置文件中加载上下文定义。
  • FileSystemXmlApplicationContext:从文件系统下的 XML 配置文件中加载上下文定义。
  • AnnotationConfigApplicationContext:从注解配置类中加载上下文定义。
  • WebApplicationContext:用于 Web 应用程序,如 ServletContext 或 PortletContext。

🎯Bean的配置

在Spring框架中,Bean的配置是将类定义为Spring容器管理的对象的过程。Spring支持多种方式来配置Bean,包括XML配置、注解和Java配置类。

🚦Bean元素的多个属性

在Spring的XML配置中,<bean>元素具有多个属性,用于定义和管理Bean的创建和行为。以下是一些常用的<bean>元素属性:

  1. id:Bean的唯一标识符。通常用于通过getBean方法按名称检索Bean。

  2. class:Bean的全限定类名。Spring将使用这个类名来实例化Bean。

  3. name:为Bean提供额外的名称。可以有多个名称,它们之间用逗号、空格或分号分隔。

  4. scope:定义Bean的作用域。常见的作用域包括singleton(单例,默认值)、prototype(原型)、request(Web应用中的请求)、session(Web应用中的会话)等。

  5. lazy-init:指定Bean是否应该延迟初始化,直到它被首次请求时才创建。

🚦Bean元素的多个子元素

在Spring的XML配置中,<bean>元素可以包含多个子元素,这些子元素用于定义Bean的属性、构造函数参数、元数据以及其他配置。以下是一些常用的<bean>子元素:

  1. <property>:用于设置Bean的属性。它包含一个或多个<value><ref><bean>子元素,用于指定属性的值。

  2. <constructor-arg>:用于提供构造函数参数。可以包含<value><ref><bean>子元素,或者通过indextype属性指定参数的位置或类型。

  3. <property>的集合:可以定义多个<property>子元素来设置Bean的多个属性。

🎯Bean的实例化

在Spring框架中,Bean的实例化是指创建Bean实例的过程。Spring提供了多种方式来实例化Bean,这些方式可以通过配置来指定。以下是Spring中常见的Bean实例化方式:

🚦构造方法实例

在Spring中,构造方法实例化是通过调用类的构造方法来创建Bean实例的一种方式。这种方式适用于需要通过构造参数来初始化Bean的情况。以下是如何在Spring中使用构造方法实例化Bean的步骤:

✨pom.xml文件

 <dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.2.8.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>5.2.8.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId><version>5.2.8.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-expression</artifactId><version>5.2.8.RELEASE</version></dependency><dependency><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId><version>1.2</version></dependency></dependencies>

 ✨创建Bean1类

public class Bean1 {public Bean1(){System.out.println("Bean1");}
}

✨编写applicationContext.xml文件

 <bean id="bean1" class="com.han.Bean1"></bean>

✨编写测试类

public class Bean1Test {public static void main(String[]args){ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");Bean1 bean= (Bean1) applicationContext.getBean("bean1");System.out.println(bean);}
}

🚦静态工厂实例化

静态工厂实例化是指使用类的静态方法来创建Bean实例的方式。在Spring中,可以通过配置XML文件来指定使用哪个类的静态方法来创建Bean。这种方式特别适用于那些没有构造函数参数或者需要通过特定工厂方法来创建实例的情况。

✨创建Bean2类

public class Bean2 {public Bean2(){System.out.println("Bean2");}
}

✨创建MyBean2Factory类

public class Bean2Factory {public static Bean2 createBean(){return new Bean2();}
}

✨编写applicationContext.xml文件

 <bean id="bean2" class="com.han.Bean2Factory" factory-method="createBean"></bean>

✨编写测试类

public class Bean2Test {public static void main(String[]args){ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");Bean2 bean2= (Bean2) applicationContext.getBean("bean2");System.out.println(bean2);}
}

🚦实例工厂实例化

在Spring中,实例工厂实例化是一种创建Bean实例的方法,它允许你通过工厂方法来创建Bean,而不是通过构造函数或静态工厂方法。这种方式提供了更高的灵活性,因为你可以在工厂方法中执行复杂的逻辑来决定哪个Bean的实例应该被创建 

✨创建Bean3类

public class Bean3 {public Bean3(){System.out.println("Bean3");}
}

✨创建MyBean3Factory类

public class MyBean3Factory {public MyBean3Factory(){System.out.println("bean3工厂实例化中");}public Bean3 createBean(){return new Bean3();}
}

✨编写applicationContext.xml文件

    <bean id="mybean3" class="com.han.MyBean3Factory"/><bean id="bean3" factory-bean="mybean3" factory-method="createBean"/>

✨编写测试类

public class Bean3Test {public static void main(String[]args){ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");Bean3 bean3= (Bean3) applicationContext.getBean("bean3");System.out.println(bean3);}
}

🎯Bean的作用域

在bean标签中可以通过scope属性指定对象的作用域

scope="singleton"表示当前bean是单例模式(默认饿汉模式,Spring容器初始化阶段就会完成此对象的创建,在bean标签中设置lazy-init="true"时变为懒汉模式)

scope="prototype"表示当前bean为非单例模式,每次通过Spring容器获取此bean的对象时都会创建一个新的对象。

单例

<bean id="book2Spring" class="com.haust.pojo.Book" scope="singleton" lazy-init="true"></bean>

非单例

<bean id="book1Spring" class="com.haust.pojo.Book" scope="prototype"></bean>

bean的声明周期方法

在bean标签中通过init-method属性指定当前bean的初始化方法,初始化方法在构造器执行之后执行。

在bean标签中通过destory-method属性指定当前bean的销毁方法,销毁方法在对象销毁之前执行。

🎯Bean的装配方式

🚦基于Xml的装配

基于XML的装配是Spring框架中的一种配置方式,它允许开发者通过XML文件来定义和管理Bean的创建和依赖关系。这种方式在早期的Spring应用中非常常见,尽管现在注解和Java配置逐渐成为主流,但XML配置仍然是一种重要的配置手段,特别是在需要配置大量复杂Bean关系时。

在XML配置中,Bean的装配可以通过以下几种方式实现:

  1. setter注入(Setter Injection):这是最常见的装配方式,通过在XML文件中使用<property>标签来注入依赖。这种方式要求Bean类必须提供一个无参构造方法,并且需要注入的属性必须有对应的setter方法。例如:

    <bean id="student1" class="educoder.Student"><property name="name" value="张三" /><property name="age" value="25" />
    </bean>
  2. 构造注入(Constructor Injection):通过构造器注入的方式装配Bean,需要在XML配置文件中使用<constructor-arg>标签来定义构造方法的参数。这种方式适用于需要通过构造器传递依赖的场景。例如:

    <bean id="student2" class="educoder.Student"><constructor-arg index="0" value="李四" /><constructor-arg index="1" value="24" />
    </bean>

🎯基于注解的装配 

基于注解的装配是Spring框架中的一种依赖注入方式,它通过在代码中使用特定的注解来实现Bean的自动装配,从而减少了XML配置的复杂性。这种方式使得配置更加简洁,代码与配置的耦合度更低,提高了开发效率。以下是Spring中常用的几种注解装配方式:

  • @Component@Service@Repository@Controller:这些注解用于声明一个类作为Spring容器管理的Bean。@Component是通用的,而其他注解提供了额外的语义信息。
  • @Value:用于注入外部配置的值,如properties文件中的值。
  • @Resource:这是Java标准的一部分,可以通过名称来自动装配Bean,如果Bean的名称与字段名或setter方法名相同,Spring容器会自动装配。
  • @Autowired:这是最常见的自动装配注解,Spring容器会通过类型来自动装配Bean。如果存在多个相同类型的Bean,可以通过@Qualifier注解来指定具体的Bean。

下面通过一个案例来演示用注解装配Bean,具体步骤及代码如下:

🚦导入依赖

<dependency><groupId>org.springframework</groupId><artifactId>spring-aop</artifactId><version>5.2.8.RELEASE</version></dependency>

🚦创建XML配置文件

在appicationContext.xml文件中添加如下代码:

<context:component-scan base-package="com.han"/>

代码中指定要扫描的包为com.han,这个包下的注解就会生效。 

🚦定义实体类

实体类User是一个简单的Java类,使用@Component注解标记为Spring管理的Bean,并设置了作用域为单例。类中定义了三个属性:idusernamepassword,以及它们的getter和setter方法。@Value注解用于注入配置文件中的值。toString方法被覆盖以提供类的字符串表示。

@Component("user")
@Scope("singleton")
public class User {@Value("1")private int id;@Value("haha")private String username;@Value("789")private String password;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}@Overridepublic String toString() {return "User{" +"id=" + id +", username='" + username + '\'' +", password='" + password + '\'' +'}';}
}

🚦定义DAO层

DAO层定义了一个接口UserDao,其中包含一个save方法。这个接口代表了与数据库交互的数据访问对象,save方法用于表示保存数据的操作。

public interface UserDao {public void save();
}

🚦实现DAO层

UserDaoImpl类实现了UserDao接口,并使用@Repository注解标记为Spring的Repository Bean。它的save方法中通过Spring的ApplicationContext获取了User Bean的实例,并打印了用户信息和保存操作的消息。

//使用Repository将UserDaoImpl类标识为Spring中的Bean
@Repository("userDao")
public class UserDaoImpl implements UserDao{@Overridepublic void save() {ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");User user= (User) applicationContext.getBean("user");System.out.println(user);System.out.println("执行UserDaoImpl.save()");}
}

🚦定义Service层

Service层定义了一个接口UserService,其中包含一个save方法。这个接口代表了业务逻辑层,save方法用于表示执行保存操作的业务逻辑。

public interface UserService {public void save();
}

🚦实现Service层

UserServiceImpl类实现了UserService接口,并使用@Repository注解标记为Spring的Service Bean。它通过@Resource注解注入了UserDao,并在save方法中调用了UserDaosave方法,然后打印了业务逻辑层的保存操作消息。

@Repository("userService")
public class UserServiceImpl implements UserService{//使用Resource注解注入UserDao@Resource(name="userDao")private UserDao userDao;@Overridepublic void save() {this.userDao.save();System.out.println("执行UserServiceImpl.save()");}
}

🚦定义Controller层

Controller层定义了一个UserController类,使用@Controller注解标记为Spring的Controller Bean。它通过@Resource注解注入了UserService,并在save方法中调用了UserServicesave方法,然后打印了控制器层的保存操作消息。

//使用Controller注解将UserController类标识为Bean
@Controller
public class UserController {@Resource(name="userService")private UserService userService;public void save(){this.userService.save();System.out.println("执行UserController.save()");}
}

🚦定义测试类

测试类AnnotationTest包含了一个main方法,用于初始化Spring的ApplicationContext并获取UserController的实例。然后调用UserControllersave方法来执行保存操作,从而测试整个Spring应用的流程是否正确。

public class AnnotationTest {public static void main(String[]args){ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");UserController userController= (UserController) applicationContext.getBean("userController");userController.save();}
}

以上就是今天要讲的内容了,主要介绍了Bean的配置,实例化,作用域以及装配方式等相关内容,如果您感兴趣的话,可以订阅我的相关专栏。非常感谢您的阅读,如果这篇文章对您有帮助,那将是我的荣幸。我们下期再见啦🧸!

相关文章:

【Spring篇】Spring中的Bean管理

&#x1f9f8;安清h&#xff1a;个人主页 &#x1f3a5;个人专栏&#xff1a;【计算机网络】【Mybatis篇】 &#x1f6a6;作者简介&#xff1a;一个有趣爱睡觉的intp&#xff0c;期待和更多人分享自己所学知识的真诚大学生。 目录 &#x1f3af;Spring IOC容器 &#x1f6a…...

UV灯 VS LED灯,LED美甲灯是紫外线灯吗?

美甲灯是使甲油胶固化的重要工具&#xff0c;目前最常用的美甲灯一般是UV灯、LED灯以及CCFL灯。 一、不同的灯之间到底有什么区别呢&#xff1f;这次让我们好好看一下 UV灯&#xff1a; UV灯是紫外线灯管的简称。UV灯属于热阴极荧光灯&#xff0c;发出UVA&#xff08;长波紫…...

得物App3D博物馆亮相“两博会”,正品保障助力消费体验升级

近日&#xff0c;2024中国体育文化博览会、中国体育旅游博览会&#xff08;以下简称“两博会”&#xff09;在苏州国际展览中心盛大开幕。本次展会汇聚了众多国内外体育文化、体育旅游领域的顶尖企业和品牌&#xff0c;共同展示体育产业的发展成果和最新趋势。在C展馆C21展位&a…...

rancher安装并快速部署k8s 管理集群工具

主机准备 准备4台主机 3台用于k8s集群 &#xff0c;1台用于rancher 每台服务器新增配置文件 vi etc/sysctl.confnet.ipv4.ip_forward 1 刷新生效 sysctl –p 安装docker 安装的时候可以去github上检索rancher看看最新版本适配那个版本的docker&#xff0c;这里安装23.0.1…...

NVR接入录像回放平台EasyCVR视频融合平台语音对讲配置

国标GB28181视频平台EasyCVR视频融合平台可拓展性强、视频能力灵活&#xff0c;平台可提供视频监控直播、云端录像、云存储、录像检索与回看、智能告警、平台级联、云台控制、语音对讲、智能分析接入等功能。其中&#xff0c;在语音对讲方面&#xff0c;NVR接入录像回放平台目前…...

八、Linux 系统安全:守护你的数字堡垒

Linux 系统安全&#xff1a;守护你的数字堡垒 在当今数字化时代&#xff0c;Linux 系统因其稳定性、高效性和开源性而被广泛应用于服务器、工作站以及各种嵌入式设备中。然而&#xff0c;随着网络攻击的日益频繁和复杂&#xff0c;确保 Linux 系统的安全变得至关重要。本文将深…...

PTA数据库编程练习合集

10-1 查询重量在[40,65]之间的产品信息 本题目要求编写SQL语句&#xff0c; 检索出product表中所有符合40 < Weight < 65的记录。 提示&#xff1a;请使用SELECT语句作答。 表结构: CREATE TABLE product (Pid varchar(20), --商品编号PName varchar(50), --商品名…...

分布式链路追踪-01初步认识SkyWalking

一 SkyWaling是什么&#xff1f; Skywalking是分布式系统的应用程序性能监视工具&#xff0c;专为微服务、云原生架构和基于容器&#xff08;Docker、K8s、Mesos&#xff09;架构而设计。SkyWalking 是观察性分析平台和应用性能管理系统&#xff0c;提供分布式追踪、服务网格遥…...

openpnp - 底部相机视觉识别CvPipeLine的参数bug修正

文章目录 openpnp - 底部相机视觉识别的CvPipeLine的参数bug概述笔记openpnp的视觉识别参数的错误原因备注补充 - 如果要直接改默认的底部视觉要注意END openpnp - 底部相机视觉识别的CvPipeLine的参数bug 概述 底部相机抓起一个SOD323的元件&#xff0c;进行视觉识别。 识别…...

C#从零开始学习(接口,强制转化和is)(7)

有时根据对象能做什么来分组,而不是根据他们继承的类.这就引入了接口 让无关的类做相同的动作 接口定义一个类必须实现的方法和属性 一个类实现一个接口时,必须包含接口中列出的所有方法和属性 向下强制转化 Appliance是CoffeeMaker的基类 Appliance powerConsumer new Co…...

算法Day-8

15. 三数之和 给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 nums[i] nums[j] nums[k] 0 。请你返回所有和为 0 且不重复的三元组。 注意&#xff1a;答案中不可以包含重复的三元…...

屏蔽小米电视广告的方法

小米电视那个广告&#xff0c;太多&#xff0c;时间太长&#xff0c;影响观看感受&#xff0c;经过处理&#xff0c;成功屏蔽了小米电视的广告&#xff0c;提升了观影体验。 手动添加AD域名到 hosts 列表 小米(红米)电视关闭开机AD屏蔽hosts方法。 在路由器的hosts中配置。 …...

C#,自动驾驶技术,ASAM OpenDRIVE BS 1.8.0 规范摘要与C# .NET Parser

本文介绍自动驾驶技术的标准之一《ASAM OpenDRIVE》1.8.0 版本的规范摘要&#xff0c;及北京联高软件开发有限公司实现的 C# 版本 xodr 文件&#xff08;XML&#xff09; Parser 源代码。 本文档是 ASAM e.V. 的版权财产。 在更改常规许可条款时&#xff0c;ASAM 允许不受限制地…...

玩转PyCharm:常用操作和快捷键

常用操作和快捷键 PyCharm为写Python代码提供了自动补全和高亮语法功能&#xff0c;这也是PyCharm作为集成开发环境&#xff08;IDE&#xff09;的基本功能。PyCharm的“File”菜单有一个“Settings”菜单项&#xff08;macOS上是在“PyCharm”菜单的“Preferences…”菜单项&…...

HeterGCL 论文写作分析

HeterGCL 论文写作分析 这篇文章&#xff0c;由于理论证明较少&#xff0c;因此写作风格了polygcl是两种风格的。polygcl偏向理论的写作风格&#xff0c;而hetergcl就是实践派的风格 首先看标题&#xff0c;其的重点是Graph contrastive learning Framework。其重点是framewo…...

简单的windows java -jar 无法启动jar包解决方法

简单的windows java -jar 无法启动jar包解决方法 1. 问题 我们项目是使用nacos作为注册中心以及配置中心&#xff0c;我们本地使用idea 进行服务配置以及启动发现没有问题&#xff0c;然后我们的服务经过maven install 打包后发布到LINUX服务启动也没有问题&#xff0c;但是我…...

iPhone图片/照片/视频复制到win10系统的简单方法 - 照片导出

效果图 不同方法&#xff1a; 【推荐】爱思助手 一步到位....【不推荐&#xff0c;会错漏很多照片】 1) 开始&#xff0c;打开开始菜单最后一个“照片” 2) 打开外部设备“Apple iPhone” 3) 全选&#xff0c;“添加xx项”&#xff0c;选择本地...

ctfshow-文件上传-151-161

CTFshow文件上传 PHP文件上传&#xff1a;1、代码思路 黑名单是设置不能通过的用户&#xff0c;黑名单以外的用户都能通过。 phtml、pht、php3、php4、php5后缀都会按做php文件执行&#xff0c;且不在黑名单内。 2、绕过 找漏网之鱼:cer、php3、php4、phtml等。 大小写绕…...

【Windows】Microsoft Office 的 .docx .xlsx .pptx 等文件图标消失,变成空白图标

问题描述 在重新安装 Microsoft Office 后&#xff0c;发现 .docx、.xlsx、.pptx 等文件的图标消失&#xff0c;变成一个空白的图标。 原因分析 可能是由于Office组件的快捷方式和图标的注册表损坏所导致的。注册表是Windows操作系统中用来存储系统和应用程序配置信息的一个重…...

场景化运营与定制开发链动 2+1 模式 S2B2C 商城小程序的融合

摘要&#xff1a;本文深入探讨了场景化运营的重要性以及其在商业领域的广泛应用。通过分析电梯广告、视频网站和电商产品的场景化运营方式&#xff0c;引入关键词“定制开发链动 21 模式 S2B2C 商城小程序”&#xff0c;阐述了如何将场景化运营理念融入到该小程序的开发与推广中…...

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇&#xff0c;在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下&#xff1a; 【Note】&#xff1a;如果你已经完成安装等操作&#xff0c;可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作&#xff0c;重…...

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…...

MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例

一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...

多场景 OkHttpClient 管理器 - Android 网络通信解决方案

下面是一个完整的 Android 实现&#xff0c;展示如何创建和管理多个 OkHttpClient 实例&#xff0c;分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...

关于nvm与node.js

1 安装nvm 安装过程中手动修改 nvm的安装路径&#xff0c; 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解&#xff0c;但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后&#xff0c;通常在该文件中会出现以下配置&…...

质量体系的重要

质量体系是为确保产品、服务或过程质量满足规定要求&#xff0c;由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面&#xff1a; &#x1f3db;️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限&#xff0c;形成层级清晰的管理网络&#xf…...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!

5月28日&#xff0c;中天合创屋面分布式光伏发电项目顺利并网发电&#xff0c;该项目位于内蒙古自治区鄂尔多斯市乌审旗&#xff0c;项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站&#xff0c;总装机容量为9.96MWp。 项目投运后&#xff0c;每年可节约标煤3670…...

自然语言处理——循环神经网络

自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元&#xff08;GRU&#xff09;长短期记忆神经网络&#xff08;LSTM&#xff09…...

C++八股 —— 单例模式

文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全&#xff08;Thread Safety&#xff09; 线程安全是指在多线程环境下&#xff0c;某个函数、类或代码片段能够被多个线程同时调用时&#xff0c;仍能保证数据的一致性和逻辑的正确性&#xf…...

Spring AI与Spring Modulith核心技术解析

Spring AI核心架构解析 Spring AI&#xff08;https://spring.io/projects/spring-ai&#xff09;作为Spring生态中的AI集成框架&#xff0c;其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似&#xff0c;但特别为多语…...