Spring 其它注解和杂项

news/2024/5/25 11:12:28/文章来源:https://blog.csdn.net/m0_73393501/article/details/136687267

Spring 其它注解和杂项

1. @Lazy 注解

使用 @Lazy 注解的典型场景就是解决循环依赖问题。特别是构造注入,@Lazy 是弥补构造注入的『缺点』的关键。

当你对注入的 JavaBean 使用 @Lazy 注解时,Spring 注入的并非是这个单例对象,而是它的一个代理。当你(在未来)第一次使用这个 Bean 时,这个代理对象才会去 IoC 容器中找这个真正的 Bean 。

2. Spring 的 @Import 注解

在使用 maven 多模块的概念去构建项目时,我们的各个 @Bean 会分散在各个子模块中。

当然,我们可以仍在入口模块(web)中通过配置去配置各个模块必须创建的单例 Bean ,不过更好的方式是:将各个模块的配置也分散在各个模块中,由各个模块自己负责,最后让入口模块引入各个模块的配置即可。这样的话,责任更加分明。

  • 一个独立的配置类:ConfigA.java
@ComponentScan("com.example.commandpattern.config.a")
public class ConfigA {@Beanpublic String demo() {return "hello world";}
}
  • 另一个独立的配置类:ConfigB.java
@ComponentScan("com.example.commandpattern.config.b")
public class ConfigB {@Beanpublic LocalDate localDate() {return LocalDate.now();}
}
  • 主配置类:MainConfig.java
// 主配置类引入各个独立配置类
@Import({ConfigA.class, ConfigB.class})
public class MainConfig {
}
  • 引入,使用:
// 只需要将主配之类交给 Spring IoC 容器即可。
public static void main(String[] args) {ApplicationContext context = new AnnotationConfigApplicationContext(MainConfig.class);System.out.println(context.getBean(String.class));System.out.println(context.getBean(LocalDate.class));System.out.println(context.getBean(StudentDao.class));System.out.println(context.getBean(StudentService.class));
}

3. 特殊情况下的 Bean 注入

非托管对象中获取托管对象

有时你需要在非托管对象中获取 Spring 的 ApplicationContext

方案一:通用方案
@Slf4j
@Component
public class ApplicationContextHolder {private static ApplicationContext APPLICATION_CONTEXT;public ApplicationContextHolder(ApplicationContext applicationContext) {APPLICATION_CONTEXT = applicationContext;}public static ApplicationContext getApplicationContext() {return APPLICATION_CONTEXT;}
}

使用时调用:

ApplicationContextRegister.getApplicationContext().getBean(Xxx.class);
方案二:Spring 可用,Spring Boot 不可用

在 Spring 项目中可用,在 Spring Boot 项目中不可用。

还有一种方案可以实现同样效果,直接调用 Spring 提供的工具类:

ContextLoader.getCurrentWebApplicationContext().getBean(Xxx.class);

经测试发现,在 Spring Boot 项目中该方案无效。有人跟踪源码分析,因为 Spring Boot 的内嵌 Tomcat 和真实 Tomcat 还是有一定的区别,从而导致 Spring Boot 中该方案无法起到一起效果。

单例 Bean 中注入多例 Bean

保证每次获取都是新的多例 Bean 。

在 Spring 中 如果需要一个对象为多例,需要使用 @Scope 注解,指明作用于为 SCOPE_PROTOTYPE 即可。

当我们在一个单例的 Bean A 中注入多例 Bean B 时,由于 Spring 在初始化过程中加载 A 的时候已经将 B 注入到 A 中,所以直接当做成员变量时,只会获取一个实例。

我们可以通过以下两种优雅的方法解决:

  • 使用 Spring 的 ObjectFactory

  • 使用 @Looup 注解

方案一:Spring 的 ObjectFactory

为你的单例对象注入一个 Spring 提供的 ObjectFactory ,毫无疑问,ObjectFacotry 也是一个单例对象。

@Component
public class SingleBean {@AutowiredObjectFactory<PrototypeBean> factory;public void print(String name) {System.out.println("single service is " + this);factory.getObject().test(name);}
}

但是,在单例对象中,你只要通过 ObjectFactory(的封装)ObjectFactory.getObject() 方法去获得多例对象,每次它返回给你的都是一个『新』的对象。

方案二:@Lookup 注解

我们可以使用 Spring 的 @Lookup 注解。该注解主要为单例 Bean 实现一个 cglib 代理类,并通过 BeanFacoty.getBean() 来获取对象。

@Lookup 注解是一个作用在方法上的注解,被其标注的方法会被 Spring 通过 cglib 实现的代理类重写,然后根据其返回值的类型,容器调用 BeanFactory 的 getBean() 方法来返回一个 bean 。

@Component
public class SingleBean {public void printClass() {System.out.println("This is SingleBean: " + this);getPrototypeBean().xxx();}/*** 方法的存在,以及方法的返回值是关键。* 该方法会被 Spring 重写:Spring 会来保证在『别处』你调用这个方法时,每次都返回一个新的 PrototypeBean 对象给你。*/@Lookuppublic PrototypeBean getPrototypeBean() {return null;}
}

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

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

相关文章

idea配置本地启用scope No ExecutorFactory found to execute the application

参考&#xff1a;https://www.cnblogs.com/jia-tong/p/16615412.html 当pom中带有&#xff1a; <scope>provided</scope> 时就会报错&#xff1a;Exception in thread “main” java.lang.IllegalStateException: No ExecutorFactory found to execute the applica…

YOLOv8改进 | 图像去雾 | 特征融合注意网络FFA-Net增强YOLOv8对于模糊图片检测能力(北大和北航联合提出)

一、本文介绍 本文给大家带来的改进机制是由北大和北航联合提出的FFA-net: Feature Fusion Attention Network for Single Image Dehazing图像增强去雾网络,该网络的主要思想是利用特征融合注意力网络(Feature Fusion Attention Network)直接恢复无雾图像,FFA-Net通过特征…

大模型高级 RAG 检索策略之句子窗口检索

之前介绍过大语言模型&#xff08;LLM&#xff09;相关技术 RAG&#xff08;Retrieval Augmented Generation&#xff09;的内容&#xff0c;但随着 LLM 技术的发展&#xff0c;越来越多的高级 RAG 检索方法也随之被人发现&#xff0c;相对于普通的 RAG 检索&#xff0c;高级 R…

使用CrossOver 在Mac 运行Windows 软件|D3DMetal是什么技术,

CrossOver Mac 使用特点 • 免费试用 14 天&#xff0c;可使用 CrossOver Mac 全部功能&#xff0c;• 试用过期会保留之前安装的 Windows 软件• 使 Mac 运行 Windows 程序 使用CrossOver在Mac上运行Windows软件是一个方便且无需安装完整Windows操作系统的解决方案。CrossOve…

使用Docker在windows上安装IBM MQ

第一步、安装wsl 详见我另一篇安装wsl文章。 第二步、安装centos 这里推荐两种方式&#xff0c;一种是从微软商城安装&#xff0c;一种是使用提前准备好的镜像安装&#xff0c;详见我另一篇windos下安装centos教程。 第三步、安装windows下的Docker desktop 详见我另一篇wind…

【WSN覆盖优化】基于改进黏菌算法的无线传感器网络覆盖 WSN覆盖优化【Matlab代码#65】

文章目录 【可更换其他算法&#xff0c;获取资源请见文章第5节&#xff1a;资源获取】1. 改进SMA算法1.1 改进参数p1.2 混沌精英突变策略 2. WSN节点感知模型3. 部分代码展示4. 仿真结果展示5. 资源获取 【可更换其他算法&#xff0c;获取资源请见文章第5节&#xff1a;资源获取…

Linux网络套接字之预备知识

(&#xff61;&#xff65;∀&#xff65;)&#xff89;&#xff9e;嗨&#xff01;你好这里是ky233的主页&#xff1a;这里是ky233的主页&#xff0c;欢迎光临~https://blog.csdn.net/ky233?typeblog 点个关注不迷路⌯▾⌯ 目录 一、预备知识 1.理解源IP地址和目的IP地址 …

jdk17下载安装图文教程【超详细】

目录 一、下载JDK17 二、安装JDK17 三、配置环境变量 四、测试Java安装是否成功 一、下载JDK17 访问官网&#xff1a;Java Downloads | Oracle 二、安装JDK17 三、配置环境变量 右键点击我的电脑>属性>高级系统设置>环境变量 在【系统变量】中新建JAVA_HOME&…

安装MySQL8.0及以上版本操作步骤

关于mysql安装过程中命令mysqld --initialize --console出错的解答 C:\mysql-8.3.0-winx64\bin>mysqld --initialize --usermysql --console 2024-03-12T11:21:23.201387Z 0 [System] [MY-015017] [Server] MySQL Server Initialization - start. 2024-03-12T11:21:23.2068…

tongweb7部署应用后应用卡顿的参考思路(by lqw)

文章目录 1.优化jvm和openfile相关参数2.排除网络延迟&#xff08;仅供参考&#xff09;3 查看服务器资源的使用情况3.1查看方式3.1.1cpu占用过高方法1&#xff1a;使用脚本show-busy-java-threads.sh进行分析方法2&#xff1a;使用jstack 3.1.2内存占用过高3.1.1线程阻塞 3 数…

【Python使用】嘿马头条完整开发md笔记第1篇:课程简介,ToutiaoWeb虚拟机使用说明【附代码文档】

嘿马头条项目从到完整开发笔记总结完整教程&#xff08;附代码资料&#xff09;主要内容讲述&#xff1a;课程简介&#xff0c;ToutiaoWeb虚拟机使用说明&#xff0c;Pycharm远程开发&#xff0c;产品与开发&#xff0c;数据库1 产品介绍,2 原型图与UI图,3 技术架构,4 开发。OS…

鸿蒙开发学习:【媒体引擎组件】

简介 HiStreamer是一个轻量级的媒体引擎组件&#xff0c;提供播放、录制等场景的媒体数据流水线处理。 播放场景分为如下几个节点&#xff1a;数据源读取、解封装、解码、输出&#xff1b;录制场景分为如下几个节点&#xff1a;数据源读取、编码、封装、输出。 这些节点的具…

云原生消息流系统 Apache RocketMQ 在腾讯云的大规模生产实践

导语 随着云计算技术的日益成熟&#xff0c;云原生应用已逐渐成为企业数字化转型的核心驱动力。在这一大背景下&#xff0c;高效、稳定、可扩展的消息流系统显得尤为重要。腾讯云高级开发工程师李伟先生&#xff0c;凭借其深厚的技术功底和丰富的实战经验&#xff0c;为我们带…

错误: 找不到或无法加载主类 Hello.class

在运行这串代码 public class Hello{ public static void main(String[] args){ System.out.println("Hello world!"); } } 的时候出现报错&#xff1a;错误: 找不到或无法加载主类 Hello.class 入门级错误 1.公共类的文件名和类名不一致 hello.j…

【LeetCode热题100】240. 搜索二维矩阵 II

一.题目要求 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性&#xff1a; 每行的元素从左到右升序排列。 ‘每列的元素从上到下升序排列。 二.题目难度 中等 三.输入样例 示例 1&#xff1a; 输入&#xff1a;matrix [[1,4,7…

搭建Hadoop3.x完全分布式集群

零、资源准备 虚拟机相关&#xff1a; VMware workstation 16&#xff1a;虚拟机 > vmware_177981.zipCentOS Stream 9&#xff1a;虚拟机 > CentOS-Stream-9-latest-x86_64-dvd1.iso Hadoop相关 jdk1.8&#xff1a;JDK > jdk-8u261-linux-x64.tar.gzHadoop 3.3.6&am…

17、设计模式之策略模式(Strategy)

一、什么是策略模式 策略模式属于行为型设计模式。定义了一系列算法&#xff0c;并将这些算法封装到一个类中&#xff0c;使得他们可以相互替换。这样&#xff0c;我们可以在改变某个对象使用的算法的情况下&#xff0c;选择一个合适的算法来处理特定的任务&#xff0c;主要解决…

全球首位AI软件工程师诞生,未来程序员会被取代吗?

今天早上看到一条消息&#xff0c;Cognition发布了世界首位AI程序员Devin&#xff0c;直接把我惊呆了&#xff0c;难道程序员是真要失业了吗&#xff1f; 全球首位AI软件工程师一亮相&#xff0c;直接引爆整个互联网圈。只需要一句指令&#xff0c;Devin就可以通过使用自己的s…

摄像机内存卡删除的视频如何恢复?恢复指南来袭

在现代社会&#xff0c;摄像机已成为记录生活、工作和学习的重要设备。然而&#xff0c;随着使用频率的增加&#xff0c;误删或意外丢失视频的情况也时有发生。面对这样的情况&#xff0c;许多用户可能会感到无助和困惑。那么&#xff0c;摄像机内存卡删除的视频真的无法恢复吗…

【05】消失的数字

hellohello~这里是土土数据结构学习笔记&#x1f973;&#x1f973; &#x1f4a5;个人主页&#xff1a;大耳朵土土垚的博客 &#x1f4a5;所属专栏&#xff1a;C语言函数实现 感谢大家的观看与支持&#x1f339;&#x1f339;&#x1f339; 有问题可以写在评论区或者私信我哦…