懒加载Spring bean

2024-01-08

如果一个bean是延迟加载的,那么延迟加载的bean中定义的所有bean都会被延迟加载吗? (即使它们没有定义@Lazy)

这是测试项目:https://github.com/madhur/conditional-property-test/blob/master/src/main/java/com/example/demo/EventPublishService.java https://github.com/madhur/conditional-property-test/blob/master/src/main/java/com/example/demo/EventPublishService.java

我有这些豆子:

@Service
@ConditionalOnProperty(
        name = {"publish.feed.events"},
        havingValue = "true"
)
public class EventPublishService {
 
     @Autowired
     private KafkaPublisher kafkaPublisher;

}

////////////////////////////////////////

@Service
public class EventService {

    @Autowired
    @Lazy
    private EventPublishService eventPublishService;

    @Value("${publish.feed.events:false}")
    private boolean isPublishEvents;
}

//////////////////////////////////////////////////

@Component
public class KafkaPublisher {

    @Value("${kafka.producer.financial_feed.topic}")
    private String financeFeedTopic;
}

我的任何 application.properties 只有一个属性,

publish.feed.events=false

因为,我没有加载EventPublishServicebeans(因为属性为 false),我期望依赖 beanKafkaPublisher也不应该被加载。但是,我在启动时收到错误,这意味着KafkaPublisherbean 正在加载,尽管EventPublishServicebean 没有被加载。

我怎样才能确保KafkaPublisherbean 不应该被加载吗? 因此,对于任何不需要财产的人来说,财产不应该是强制性的EventPublishService bean?

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'kafkaPublisher': Injection of autowired dependencies failed; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder 'kafka.producer.financial_feed.topic' in value "${kafka.producer.financial_feed.topic}"
        at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:379) ~[spring-beans-5.0.5.RELEASE.jar:5.0.5.RELEASE]
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1344) ~[spring-beans-5.0.5.RELEASE.jar:5.0.5.RELEASE]
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:578) ~[spring-beans-5.0.5.RELEASE.jar:5.0.5.RELEASE]
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:501) ~[spring-beans-5.0.5.RELEASE.jar:5.0.5.RELEASE]
        at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:317) ~[spring-beans-5.0.5.RELEASE.jar:5.0.5.RELEASE]
        at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228) ~[spring-beans-5.0.5.RELEASE.jar:5.0.5.RELEASE]
        at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:315) ~[spring-beans-5.0.5.RELEASE.jar:5.0.5.RELEASE]
        at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199) ~[spring-beans-5.0.5.RELEASE.jar:5.0.5.RELEASE]
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:760) ~[spring-beans-5.0.5.RELEASE.jar:5.0.5.RELEASE]
        at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:869) ~[spring-context-5.0.5.RELEASE.jar:5.0.5.RELEASE]
        at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:550) ~[spring-context-5.0.5.RELEASE.jar:5.0.5.RELEASE]
        at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:759) [spring-boot-2.0.1.RELEASE.jar:2.0.1.RELEASE]
        at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:395) [spring-boot-2.0.1.RELEASE.jar:2.0.1.RELEASE]
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:327) [spring-boot-2.0.1.RELEASE.jar:2.0.1.RELEASE]
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:1255) [spring-boot-2.0.1.RELEASE.jar:2.0.1.RELEASE]
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:1243) [spring-boot-2.0.1.RELEASE.jar:2.0.1.RELEASE]
        at com.example.demo.DemoApplication.main(DemoApplication.java:17) [main/:na] Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'kafka.producer.financial_feed.topic' in value "${kafka.producer.financial_feed.topic}"
        at org.springframework.util.PropertyPlaceholderHelper.parseStringValue(PropertyPlaceholderHelper.java:172) ~[spring-core-5.0.5.RELEASE.jar:5.0.5.RELEASE]
        at org.springframework.util.PropertyPlaceholderHelper.replacePlaceholders(PropertyPlaceholderHelper.java:124) ~[spring-core-5.0.5.RELEASE.jar:5.0.5.RELEASE]
        at org.springframework.core.env.AbstractPropertyResolver.doResolvePlaceholders(AbstractPropertyResolver.java:237) ~[spring-core-5.0.5.RELEASE.jar:5.0.5.RELEASE]
        at org.springframework.core.env.AbstractPropertyResolver.resolveRequiredPlaceholders(AbstractPropertyResolver.java:211) ~[spring-core-5.0.5.RELEASE.jar:5.0.5.RELEASE]
        at org.springframework.context.support.PropertySourcesPlaceholderConfigurer.lambda$processProperties$0(PropertySourcesPlaceholderConfigurer.java:175) ~[spring-context-5.0.5.RELEASE.jar:5.0.5.RELEASE]
        at org.springframework.beans.factory.support.AbstractBeanFactory.resolveEmbeddedValue(AbstractBeanFactory.java:839) ~[spring-beans-5.0.5.RELEASE.jar:5.0.5.RELEASE]
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1086) ~[spring-beans-5.0.5.RELEASE.jar:5.0.5.RELEASE]
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1065) ~[spring-beans-5.0.5.RELEASE.jar:5.0.5.RELEASE]
        at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:584) ~[spring-beans-5.0.5.RELEASE.jar:5.0.5.RELEASE]
        at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:91) ~[spring-beans-5.0.5.RELEASE.jar:5.0.5.RELEASE]
        at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:373) ~[spring-beans-5.0.5.RELEASE.jar:5.0.5.RELEASE]
        ... 16 common frames omitted

As 文档中指出 https://docs.spring.io/spring/docs/current/spring-framework-reference/core.html#beans-dependency-resolution,

单例范围并设置为预实例化(默认)的 Bean 在创建容器时创建

因此,如果你把@Lazy on @Autowired,bean将在启动时创建只要bean本身没有定义lazy:

@Component
public class KafkaPublisher {
    ...
}

如果你希望这个 bean 被延迟初始化,请输入 @Lazy on it。如果你想让bean注入的过程变得懒惰,把@Lazy on @Autowired, 就如此容易。

延迟初始化一组相关的 bean 可以通过在 a 中声明它们来实现。@Configuration类别和标记配置@Lazy。但是,请注意,所有声明的 bean 将在以下情况下立即初始化:@Configuration类已初始化。

@Lazy
@Configuration
@ComponentScan(...) // will be lazily initialized with config
public class LazyConfiguration {

    @Bean
    public SomeBean beanName() { // will be lazily initialized with config
        return new SomeBean();
    } 

    @Bean
    public OtherBean beanName() { // will be lazily initialized with config
        return new OtherBean();
    }     
}

然而,当使用@ComponentScan,确保豆子(即@Service, @Component等)您想要延迟初始化尚未被其他上下文扫描。如果是,请将它们添加为扫描该上下文的排除项。


出于历史目的,下面过时的答案(在OP完全改变问题之前):

在 beans 中声明 beans 不被认为是一个好的做法,但是如果您标记@Configuration作为惰性,那么实际上它内部的所有 bean 都会被惰性初始化,如@Lazy的javadoc:

如果 @Configuration 类上存在 Lazy,则表明所有 @Configuration 中的 @Bean 方法应该延迟初始化。

If by “里面定义的bean”你实际上指的是注入点,例如@Autowired,javadoc也有答案:

惰性注释也可以放置在标记为的注入点上 自动装配或注入:在这种情况下,它会导致创建 作为替代方案,所有受影响的依赖项的惰性解析代理 使用 ObjectFactory 或 Provider。

然而,实际的自动装配 bean 将被急切地初始化(如果也没有标记为 @Lazy)。在这种情况下,注射本身会变得懒惰。

否则,请澄清你的意思。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

懒加载Spring bean 的相关文章

  • Java 读取大文本文件时出现 OutOfMemoryError

    我是 Java 新手 正在读取非常大的文件 需要一些帮助来理解问题并解决它 我们有一些遗留代码 必须对其进行优化才能正常运行 文件大小仅在 10mb 到 10gb 之间变化 只有当文件开始大小超过 800mb 时才会出现启动问题 Input
  • GET 请求的 Spring 注解

    这两种spring GET方法有什么区别呢 哪一种是首选方法 Component Scope request Path public class TestComponent GET Path hello public String prin
  • JavaFX 2.0 FXML 子窗口

    经过多次搜索我发现了这个问题如何创建 javafx 2 0 应用程序 MDI https stackoverflow com questions 10915388 how to create a javafx 2 0 application
  • 在 Java 中从 SOAPMessage 获取原始 XML

    我已经在 J AX WS 中设置了 SOAP WebServiceProvider 但我无法弄清楚如何从 SOAPMessage 或任何 Node 对象获取原始 XML 下面是我现在获得的代码示例 以及我试图获取 XML 的位置 WebSe
  • 迁移到Java 9或更高版本时是否需要切换到模块?

    我们目前正在从 Java 8 迁移到 Java 11 但是 升级我们的服务并没有我们预期的那么痛苦 我们基本上只需要更改我们的版本号build gradle文件和服务都顺利启动并运行 我们升级了库以及使用这些库的 微 服务 到目前为止没有问
  • 如何将现有的 SQLite3 数据库导入 Room?

    好吧 我在桌面上使用 SQLite3 创建了一个只需要读取的某些信息的数据库 我正在制作的应用程序不需要在此表中插入或删除信息 我在 Room 数据库层上做了相当多的谷歌搜索 所有文档都需要在构建应用程序时在 Room 中创建一个新的数据库
  • 检查 IPv4 地址是否在私有范围内

    在 Python 中 使用 IPy 模块您可以执行以下操作 gt gt gt ip iptype PRIVATE 有没有一个库或简单的方法可以在 Java 中执行相同的操作 似乎不完全是但是InetAddress有一些 isXX 方法 例如
  • 使用 JAX-WS 的 WebLogic 中没有模式导入的单个 WSDL

    如何使用 JAX WS 配置由 WebLogic 10 3 6 生成的 Web 服务 以将对象架构包含在单个 WSDL 文件声明 而不是导入声明 中 示例代码 界面 import javax ejb Local Local public i
  • 查找数组中的组合

    我在java中有一个像这样的二维数组 transmission communication tv television approach memorycode methodact 我需要获得所有组合 例如 transmission appr
  • 使用 Spring 注入 Log4J 记录器

    我有一个带有以下 web xml 的 spring 2 5 webapp
  • java swing:向 JTree 项目添加自定义图形按钮

    我想在 JTree 中的项目右侧添加一个带有小图标的附加按钮 这可以做到吗 如果是这样 怎么办 thanks Clamp 你在这方面成功了吗 我想做同样的事情 但很难让 JButton 响应用户 设置渲染器以显示按钮的过程很顺利 但所有鼠标
  • Java8:流映射同一流中的两个属性

    我有课Model带有以下签名 class Model private String stringA private String stringB public Model String stringA String stringB this
  • 如何检查日期字符串的有效性?

    在我的项目中 我需要检查日期字符串是否计算为正确的日期对象 我决定允许 yyyy MM dd 和日期格式 年 月 日 和 年 月 日 小时 分钟 我如何检查它们是否有效 我的代码为 1980 01 01 和一些奇怪的日期 如 3837 05
  • 在循环中按名称访问变量

    我正在开发一个 Android 项目 并且有很多可绘制对象 这些绘图的名称都类似于icon 0 png icon 1 png icon 100 png 我想将这些可绘制对象的所有资源 ID 添加到整数 ArrayList 中 对于那些不了解
  • Android项目中使用java获取电脑的IP地址

    我在用ksoap2 android http code google com p ksoap2 android 我需要使用java获取IP地址 这样我就不必每次都手动输入它 我所说的 IP 地址是指 例如 如果我这样做ipconfig使用命
  • JPA 将 BigDecimal 作为整数保存在数据库中

    我在数据库中有这个字段 ITEMCOST NUMERIC 13 DEFAULT 0 NOT NULL 在JAVA中 Entity中的字段定义如下 Column name ITEMCOST private BigDecimal itemCos
  • CXF:通过 SOAP 发送对象时如何排除某些属性?

    我使用 Apache CXF 2 4 2 当我将数据库中的某个对象返回给用户时 我想排除一些属性 例如密码 我怎样才能做到这一点无需创建临时的班级 有这方面的注释吗 根据 tomasz nurkiewicz 评论我应该使用 XmlTrans
  • 如何使用注释处理 Hibernate 和 Spring 中的连接查询?

    我正在使用 Spring 和 Hibernate 以及 MySQL 开发应用程序 我是 Hibernate 新手 完成了基本任务 现在我需要在选择查询中应用联接以使用注释从多个表中获取数据 我已经搜索过但仍然没有任何想法 这是我的数据库表和
  • Android Google 地图无法在当前主题中找到样式“mapViewStyle”

    添加谷歌地图视图时 我扩展了MapView 使用xml编辑器将其添加到活动中 并将我的谷歌地图api密钥手动添加到布局xml文件中 我的权限在清单文件中允许互联网 我想知道的是 在 xml 编辑器中 我收到错误 无法在当前主题中找到样式 m
  • 使用 AmazonSNSClient 发送短信时的授权

    aws 官方文档如何发送短信 http docs aws amazon com sns latest dg sms publish to phone html使用 java 中的 aws SDK 非常简单 但是 当发送如底部示例所示的消息时

随机推荐

  • 使用 Javamail API 和 IMAP 批量获取邮件正文

    有没有一种方法可以通过使用 Javamail API 对 IMAP 服务器进行一次调用来获取多封电子邮件的邮件正文 我知道我可以使用 Message getContent 调用获取给定消息的正文 但这最终会为每个单独的消息调用 imap 服
  • 是否可以将解决方案部署到 Web 应用程序,使其功能仅在此 Web 应用程序中可见?

    我有一个具有多个站点 网络范围功能的解决方案 SP2010 我想将此解决方案部署到一个特定的网络应用程序 这些功能应该只显示在驻留在该 Web 应用程序中的站点 网站中 通过增加安全控制入口对于我的解决方案 我能够将解决方案部署到特定的 W
  • Adb 传输协议错误。没有这样的文件或目录

    我尝试在模拟器中运行我的 Android 应用程序intelliJ 13 我将模拟器配置为Nexus 4跑步android 4 4 2 with ARMcpu 我得到以下错误 Waiting for device C Program Fil
  • Firemonkey TTabControl 可以复制 VCL TPageControl.OnChanging 事件吗?

    我正在运行 Delphi Dx 西雅图 在 Delphi VCL 的 TPageControl 中 有一个 onChanging 事件 您可以在其中阻止页面控件更改选项卡的 procedure TForm1 pgc1Changing Sen
  • android:用毕加索创建圆形图像

    这个问题已经被提出 并且对我正在使用的 Picasso 版本做出了承诺 如何使用 Picasso 将圆形位图发送到 ImageView 我是毕加索的新手 我唯一使用过的是 Picasso with context load url resi
  • 在连接到 SSAS OLAP 多维数据集的 Excel 中按键排序

    我搜索了互联网和 StackOverflow 但没有找到这个问题的答案 我通过 SSAS 创建了一个带有日期维度的 OLAP 多维数据集 维度的属性之一是活动日历月 The NameColumn值的格式如 January 2015 Febr
  • 使用 StructureMap 在 ASP.NET MVC 3 RC2 中进行操作过滤器依赖注入

    我一直在研究 ASP NET MVC RC2 中的 DI 支持 我已经为 NHibernate 的每个请求实现了会话并且需要注入ISession进入我的 工作单元 操作过滤器 如果我直接引用 StructureMap 容器 ObjectFa
  • SwiftUI 如何添加带有回调的自定义修饰符

    在 SwiftUI 中你可以编写如下代码 List ForEach users id self user in Text user onDelete perform delete 我尝试添加功能 onDelete我的自定义组件的语法方法 s
  • 如何删除 CMake 中的特定系统包含目录

    有没有办法告诉 CMake 排除某些系统包含路径 例如 我定义了 string h 两次 一次在 usr include c v1 libc 中 一次在 usr include 中 当我编译时出现以下错误 error functions t
  • 改变箭头的箭头()

    我想知道是否可以更改用 绘制的箭头的箭头arrows 我查看了文档 但我发现我可以更改行尾但不能更改箭头 plot c 1 10 arrows 0 0 10 10 任何帮助表示赞赏 如中所解释的 arrow 您可以使用length and
  • 基于jsonb寻找合适的EAV结构

    我想知道在 jsonb 上构建 EAV 的正确方法是什么 我有Attribute gt Values表与标准 EAV 中的表一样 CREATE TABLE attribute values id INTEGER attribute id I
  • 重构代码后使用 NetDataContractSerializer 进行反序列化时出现问题

    我遇到过这样的情况 我使用 NetDataContractSerializer 序列化一些 NET 对象 并将 XML 存储在数据库中 作为记住应用程序中这些对象的状态的一种方式 最近我刚刚遇到第一种情况 即属性和类型名称的某些代码重构导致
  • 虚拟连续内存与物理连续内存

    虚拟连续内存在物理上也总是连续的吗 如果不是 如何在物理上不连续的 RAM 块上分配和映射虚拟连续内存 感谢详细的回答 简短的回答 您不必关心 除非您是内核 驱动程序开发人员 对你来说都是一样的 更长的答案 相反 实际上连续的内存是通常不会
  • Angular 2:子路由的多个

    使用 Angular 2 有什么方法可以让子路由不显示到主标签中
  • 如何在 GitKraken 中查看提交?

    使用 GitKraken 来检查提交似乎是不可能的 正如您所看到的 没有选项可以签出较旧的提交 只能Cherrypick commit但我不知道这有什么好处 编辑 我可以通过控制台使用另一个 git 程序 git bash 结帐 现在在 G
  • 如何使用 --header 选项通过 Siege 发送 cookie?

    我刚刚开始使用 Siege 在新的 Web 服务器上进行负载 压力测试 我正在尝试测试我的资源 性能最重的脚本 但该脚本需要cookie 在 siege 中使用 header 选项的正确格式是什么 我尝试过这个但没有运气 siege hea
  • 通过具有 NaN 值的数据帧更新数据帧

    我尝试更新 DataFrame df1 pd DataFrame data A 1 2 3 4 B 5 6 7 8 通过另一个 DataFrame df2 pd DataFrame data B 9 np nan 11 np nan 现在我
  • 计算列存储聚合计数

    我希望计算列存储来自另一个表的计数总计 我该怎么做 以下工作是否有效 创建表样本 列 1 AS SELECT COUNT FROM table2 PERSISTED 对于 SQL Server 您可以使用索引视图 http technet
  • “检查 S3 通用/方法一致性...警告”的说明

    我试图理解 S3 功能的 R CMD 检查警告 因此 这是我的情况的一个完全可重现的示例 包括 R 代码和 roxygen 代码 我永远无法在任何地方找到 S3 的完整示例 并且包中的实际使用要么过于复杂 要么记录不足 因此 希望这对其他实
  • 懒加载Spring bean

    如果一个bean是延迟加载的 那么延迟加载的bean中定义的所有bean都会被延迟加载吗 即使它们没有定义 Lazy 这是测试项目 https github com madhur conditional property test blob