java-Spring-入门学习-第二天(单例模式和多例模式)

目录

 Bean作用域

单例模式(默认可以不写)

Spring下的 @AutoWired 依赖注入

JaveEE下的 @Resource 依赖注入

多例模式


 Bean作用域

​在Spring框架中,Bean是按照作用域来创建的,常见的作用域有两种:Singleton 和 Prototype。Singleton (单例)是指整个应用中只有一个实例,并在第一次请求时创建实例

Prototype (多例)是指每次请求都会创建一个新的实例并返回,每个实例之间是相互独立的。

@Scope注解指定bean的作用域
取值含义
@Scope("singleton")(默认)在IoC容器中,在bean的对象为单实例
@Scoper("prototype")在IoC容器中,在bean中有多个实例

单例模式(默认可以不写)

Spring下的 @AutoWired 依赖注入

注意的是@Autowired 不能以类的名字来寻找对应的Product的实体类,需要通过@Qualifier来查找对应的接口实体类,不确定对应的实体类的名会报NoUniqueBeanDefinitionException异常。

这个异常表明Spring容器中有多个相同类型的bean候选者,但Spring不知道应该选择哪一个来注入

// 一个接口  
interface Product {  void test();  
}  @Component("productDealWith1") // 使用 @Component 并指定 bean 名称  
class ProductDealWith1 implements Product {  @Override  public void test() {  System.out.println("ProductDealWith1 test method called.");  }  
}  @Component("productDealWith") // 使用 @Component 并指定 bean 名称  
class ProductDealWith implements Product {  @Override  public void test() {  System.out.println("ProductDealWith test method called.");  }  
}  @Component  
class ProductOrder {  @Autowired  @Qualifier("productDealWith1") // 使用 @Qualifier 指定要注入的 bean 名称  private Product product;  public void doSomething() {  product.test(); // 这将调用 ProductDealWith1 的 test 方法  }  
}  public class TestProduct {  public static void main(String[] args) {  ApplicationContext context = new AnnotationConfigApplicationContext("demo.test.product");  ProductOrder order = context.getBean(ProductOrder.class); // 获取 ProductOrder 类型的 bean  order.doSomething(); // 这将间接调用 ProductDealWith1 的 test 方法  }  
}

ProductDealWith1  和 ProductDealWith   类都使用了 @Component 注解,并且分别通过 value 参数指定了它们的 bean 名称。在 ProductOrder 类中,通过@Autowired 和 @Qualifier 注解,我们指定了要注入的  Product 类型的 bean 是名为 "productDealWith1" 的那个。在 TestProduct 的 main 方法中,我们通过 context.getBean(ProductOrder.class) 来获取 ProductOrder 类型的 bean,并调用其 doSomething 方法,这将间接调用ProductDealWith1 的 test方法

JaveEE下的 @Resource 依赖注入

这边讲解一下顺便讲解@Resource依靠name找寻接口的实例

因为@Resource是Java EE 的一部分,如果您指定了 name 属性,Spring 将会查找与指定名称匹配的 bean;如果没有指定name  属性,Spring 将会查找与注入点类型匹配的 bean

@Configueration是将该类转变成配置类

其次使用配置类扫描工具@ComponentScan,使其在运行编译过程中优先加载其类

并根据其中的配置创建并管理相应的 bean

 

 
@Configuration  
@ComponentScan("demo.test.product")  
public class AppConfig {  // 该配置类告诉Spring在此包及其子包中查找带有@Component注解的类  
}
// 一个接口  
interface Product {  void test();  
}  @Component(name= "productDealWith1") // 使用 @Component 并指定 bean 名称  
class ProductDealWith1 implements Product {  @Override  public void test() {  System.out.println("ProductDealWith1 test method called.");  }  
}  @Component(name="productDealWith") // 使用 @Component 并指定 bean 名称  
class ProductDealWith implements Product {  @Override  public void test() {  System.out.println("ProductDealWith test method called.");  }  
}  @Component  
class ProductOrder {  @Resource(name ="productDealWith1") private Product product;  public void doSomething() {  product.test(); // 这将调用 ProductDealWith1 的 test 方法  }  
}  public class TestProduct {  public static void main(String[] args) {  ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);  ProductOrder order = context.getBean(ProductOrder.class); // 获取 ProductOrder 类型的 bean  order.doSomething(); // 这将间接调用 ProductDealWith1 的 test 方法  }  
}

多例模式

//这边是多实例
@Scope(value="prototype")
//这边是单实例
//@Scope(value="singleton")
@Component
class Product{}
public class TestDBConnect {@Testpublic void testScope(){ApplicationContext context = new AnnotationConfigApplicationContext("demo.test.product");// 第一次获取Product product1= context.getBean(product.class);System.out.println(product1);// 第二次获取Product product2 = context.getBean(product.class);System.out.println(product2);}
}

多例模式运行

当为多例模式 prototype 时,多次获取bean实例的地址是不同的

单例模式运行

当为单例模式 singleton 时,多次获取bean实例的地址是相同的

单例模式和多例模式的区别

单例模式适用于需要共享数据并且需要避免重复创建实例的情况。

而多例模式适用于需要动态地创建对象并提供独立实例的情况。

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

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

相关文章

Python编程与算法面试-编程面试的重点

在求职面试的过程中,编程能力也是面试官非常看重的一项能力。而对于编程这项能力主要的考察点也有三个维度: 初级:编程的基本功 编程的基本功主要考察的编程语言的基本语法,原理知识,以及一些在编程过程中的常见问题…

深入理解MD5:Message Digest Algorithm 5

title: 深入理解MD5:Message Digest Algorithm 5 date: 2024/4/21 18:10:18 updated: 2024/4/21 18:10:18 tags: MD5哈希函数密码学数据完整性碰撞攻击安全性替代算法 导论 MD5的背景和历史 MD5(Message Digest Algorithm 5)是一种广泛使用…

基于httpd和lvs的dr模式简单测试

lvs主机:192.168.50.154 httpd主机:192.168.50.157 192.168.50.156 (ip需要在同一网段) 虚拟ip:192.168.50.183 前提准备: lvs安装: yum install ipvsadm -y lsmod|grep ip_vs modprobe ip_vs …

一堆喷儿香喷儿香的工具网站-已经收藏-搜嗖工具箱!

文心一言 https://yiyan.baidu.com/ ​ ChatGpt横空出世的横空出世好像一把钥匙,开启了大模型时代,国内也有不错的产品,比如百度的文心一言,从3.5到4.0看得见的成长,现在的文心一言是我们工作中不可缺少的好帮手&am…

javaEE初阶——多线程(五)

T04BF 👋专栏: 算法|JAVA|MySQL|C语言 🫵 小比特 大梦想 此篇文章与大家分享关于多线程的文章第五篇关于 多线程代码案例二 阻塞队列 如果有不足的或者错误的请您指出! 目录 2.阻塞队列2.1常见队列2.2 生产者消费者模型有利于进行解耦合程序进行削峰填谷…

OEEL图表——进行直方图绘制histogram函数的使用

简介 本文将使用histogram函数来进行数据分析。 直方图是一种用于可视化数据分布的图表。它可以帮助我们理解数据的集中程度、偏移程度和分散程度。以下是直方图的一些主要作用: 1. 展示数据分布:直方图可以将数据按照不同区间进行分组,并以柱状图的形式呈现。通过观察直…

走近网络安全公司:F5探索应用安全至简之道

伴随企业加速数字化转型工作、扩展到新的基础设施环境并采用微服务架构,企业正在拥抱混合和多云基础设施所带来的灵活性。现在跨越四种环境部署应用的企业,其平均需要管理和保护的应用数据路径比应用仅限本地部署时多10倍,复杂性呈指数级增加…

【JAVA基础篇】泛型详解版

🔥作者主页:小林同学的学习笔录 🔥mysql专栏:小林同学的专栏 目录 1.泛型的认识 2.泛型类 3.泛型方法 4.泛型接口 5.特别强调 6.类型通配符 简单化知识点,让你彻底了解泛型 1.泛型的认识 Java泛型是一种在Java编程语言…

Ubuntu系统安装配置笔记

最近装了台Ubuntu系统用于日常工作,过程中搜索了很多资料或找ChatGPT解答疑问,已有的资料都比较详细了,因此这篇笔记主要是列举大纲和参考网站,并记录中间踩坑耗时较多的问题。 一,系统安装 1,镜像下载 …

2024数学建模时间汇总与竞赛攻略

目录 2024数学建模汇总(时间、报名费、获奖率、竞赛级别、是否可跨校) 中国高校大数据挑战赛 “华数杯”国际大学生数学建模竞赛 美国大学生数学建模竞赛(美赛) 数学中国(认证杯)数学建模网络挑战赛 …

盲盒一番赏小程序:打开未知的惊喜之旅

在快节奏的生活中,人们总是渴望寻找一份属于自己的小确幸。盲盒一番赏小程序,正是这样一个为你带来无尽惊喜与乐趣的平台。我们精心打造这一小程序,让每一次点击都成为一次全新的探索,让每一次选择都充满无限可能。 盲盒一番赏小…

dns高防和ip高防的区别是什么?

在面对日益增长的网络安全威胁时,DNS高防和IP高防作为防御策略发挥着重要的作用。虽然两者都旨在保护网络资源免受攻击,但它们在操作方式和防护重点上有着本质的不同。 DNS高防:保护域名解析服务DNS高防,全称是高防御的域名解析服…

JavaWeb--05Vue项目简介

Vue项目简介 1 创建vue项目2 Vue项目目录结构3 运行Vue项目3 Vue项目开发流程 1 创建vue项目 环境准备好了,接下来我们需要通过Vue-cli创建一个vue项目,然后再学习一下vue项目的目录结构。Vue-cli提供了如下2种方式创建vue项目: 命令行:直接…

应用编程之线程(二-同步篇)

线程的主要优势在于,资源的共享性,譬如通过全局变量来实现信息共享,不过这种便捷的共享是有代价的,那就是多个线程并发访问共享数据所导致的数据不一 致的问题。 一、为什么需要线程同步 线程同步是为了对共享资源的访问进行保护…

用Cmake编译程序时,链接到FFmpeg库

用Cmake编译程序时,链接到FFmpeg库 一、前言 可喜可贺,折腾了一晚上终于把这个勾八链接成功了,已经要吐了。看到下面控制台的输出,吾心甚慰呀😭 [100%] Linking CXX executable rknn_yolov5_demo [100%] Built targe…

SpringBoot 操作 Redis

导入对应版本的依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId> </dependency>修改配置文件中的信息 spring:redis:host: 127.0.0.1port: 8888注意: 我这里 xsh…

【python】深度解剖!一文搞懂字符串常用功能

【python】深度解剖!一文搞懂字符串常用功能 【先赞后看养成习惯】求点赞+关注+收藏😀 目录 【python】深度解剖!一文搞懂字符串常用功能字符串的创建:字符串的格式化——占位符.format方法字符串的分割字符串的连接字符串的重复字符串的大小写转换字符串的判断字符串的…

sherpa + ncnn 离线语音识别

目录结构 前言音视频格式转为wavsherpa-ncnn编译LinuxWindowswindows编译中遇到的问题问题“nmake -? failed with: no such file or directory”编译失败原因 成功编译截图 可执行程序说明模型下载语言识别测试LinuxWindows 参考文献 前言 小编需要实现离线音视频语言部分识…

C++ 程序的内存分配

C 程序的内存分配 C 程序的内存分配栈堆数据区程序代码区参考 C 程序的内存分配 一个 C 编译的程序占用内存分为以下几个部分&#xff08;从高地址到低地址&#xff09;&#xff1a; 内核空间&#xff1a;由操作系统创建并控制&#xff0c;用户代码不能读写。栈&#xff1a;由…

mysql 日环比 统计

接到一个任务&#xff0c;要计算日环比的情况。 16、查询销售额日环比情况 日环比&#xff1a; &#xff08;今日-昨日&#xff09;/ 昨日 的一个比率情况。 1&#xff0c;建表 DROP TABLE IF EXISTS sale; create table sale(id int not null AUTO_INCREMENT,record_date da…