Spring @Scope, @Lazy, @DependsOn, @Required, @Lookup

Q\&A @Scope 引入背景

传统的 Spring 配置中,Bean 的作用域(如 singleton、prototype)只能通过 XML 配置定义,不够直观且与代码分离,提供一种基于注解的方式定义 Bean 的作用域。

Q\&A @Lazy 引入背景

默认情况下,Spring 容器会在启动时加载所有单例 Bean,这可能导致启动慢、资源占用高,尤其是某些 Bean 并不总是被使用,引入@Lazy允许开发者延迟初始化 Bean,直到第一次被使用。

1、Spring容器在启动时会初始化所有的单例(singleton)Bean,而使用@Lazy后,Bean会在第一次被使用时才进行初始化。

2、用于@Component 类上(非 @Configuration类):该Bean将会被懒加载初始化。

3、用于@Configuration配置类上:该类中所有的@Bean方法都会受到影响,即这些Bean都将被懒加载。

Q\&A @DependsOn 引入背景

Spring 默认采用自动装配机制,Bean 的初始化顺序通常由依赖关系决定。但在某些复杂场景下,需要显式控制 Bean 的初始化顺序。显式指定某些 Bean 必须在当前 Bean 之前初始化。

Q\&A @Required 引入背景

早期 Spring 使用 setter 注入时,无法强制要求某个属性必须被注入,容易导致运行时空指针异常。标记某个属性必须被注入,否则抛出异常。

Q\&A @Lookup 引入背景

在某些场景下,希望每次调用一个方法都能获取一个新的 Bean 实例(如 prototype 作用域 Bean),但直接 new 对象会破坏 Spring 的管理机制。支持从容器中动态获取 Bean,允许 Spring 动态决定返回哪个 Bean 实例。

注解 用途 是否支持作用域控制 是否影响初始化顺序 是否支持原型模式 是否已弃用 引入年份(关联 Spring 版本参考)
@Scope 控制Bean作用域 ✔️ ❌ ✔️ ❌ Spring 2.0+(约 2006-2007年)
@Lazy 延迟初始化 ❌ ✔️(延迟加载) ❌ ❌ Spring 2.0+(约 2006-2007年)
@DependsOn 强制依赖其他Bean ❌ ✔️(控制顺序) ❌ ❌ Spring 2.0+(约 2006-2007年)
@Required 标记必须注入的属性 ❌ ❌ ❌ ✔️(Spring 5+) Spring 2.0+(约 2006-2007年)
@Lookup 动态获取Bean或覆盖方法实现 ❌ ❌ ✔️ ❌ Spring 2.0+(约 2006-2007年)

典型用法

Spring @Scope 典型使用场景
Spring @Lazy 典型使用场景
Spring @DependsOn 典型使用场景
Spring @Required 典型使用场景
Spring @Lookup 典型使用场景

相关推荐
实名上网宋凯宣6 小时前
Django
后端·python·django
天河归来7 小时前
第三方接口不稳定,如何让核心任务继续完成
java·大数据
Knight_AL8 小时前
Java 文件下载时文件名中的 `#` 被转换成 `%23`?一次 URL 编码与解码问题排查
java·开发语言
利威尔xu8 小时前
Go IM 源码实战(14):本地缓存快 3000 倍,失效却难 10 倍
后端·缓存·微服务·面试·golang
逃逸线LOF9 小时前
Ribbon负载均衡原理(Irule组件、源码分析)
后端·spring cloud·ribbon
砚底藏山河9 小时前
python量化自定义周期 K 线合成
java·开发语言·数据库·python·金融
慢云智慧空间9 小时前
从设备智能到空间理解,空间智能终端解决方案商如何重新定义行业标准
后端
利威尔xu9 小时前
Go IM 源码实战(13):30 个会话只有 2 个红点,未读数错在三条路径
redis·后端·微服务·面试·golang
猿究院_夏燊10 小时前
MySQL 的四种隔离级别
java·数据库·mysql
薛定谔的猫-菜鸟程序员10 小时前
软件架构设计师开发资料大全(从入门到精通)
后端·python·系统架构·flask·架构设计师