当前位置: 首页 > 知识库问答 >
问题:

Spring@Bean方法可以返回实例字段吗?

岳出野
2023-03-14

以下SpringBean声明似乎“按预期”运行和行为:

@Configuration
public class AppConfig {

    private final Foo foo;

    public AppConfig() {
        foo = new Foo();
    }

    @Bean
    public Foo foo() {
        return foo;
    }
}

其中“如预期”表示“没有明显的错误”。

假设Foo有一些复杂的生命周期(例如,使用AutoCloseable管理外部资源),这是Foo()的有效且合理的声明吗?我能找到的所有示例(官方和非官方)都表明foo实例应该在foo()中实例化,而不是存储在字段中或从字段中检索。然而,我在任何文件中都找不到任何确定的信息,说明这应该或不应该是安全的。

例如,我能找到的最相关的文档是关于SpringIoCbean生命周期的https://docs.spring.io/spring/docs/5.1.0.RELEASE/spring-framework-reference/core.html#beans-工厂范围。在这两行之间,一个单例应用程序作用域bean将是有效的,因为当它不再有效时,应用程序就不再是活动的。由于singleton是默认范围,因此上述声明将隐式有效。

即使使用了适当的范围,假设您引入了另一种特定于配置文件的声明

@Bean("foo")
@Profile("!test")
public Foo realFoo() {
    return this.foo;
}

@Bean("foo")
@Profile("test")
public Foo testFoo() {
    return new TestFoo();
}

这个。foo现在总是被实例化,即使在激活测试配置文件时也是如此?如果是这样,Spring是否仍然管理realFoo()的值,即使该bean应该是非活动的?

这个问题不是Spring@Bean at方法的重复,返回已经创建的Bean,它回避了这个问题,但是这个问题可以正确地确定答案。

共有1个答案

芮祺
2023-03-14

如果将Spring IoC存储在现场,您将失去它所能提供的好处,甚至可能导致某些范围内的意外行为。

如果作用域是singletonapplication,这将起作用,因为它只调用foo()一次。但是如果范围更改为protoptype(每次都创建一个新实例)。然后它可能会导致意外的行为。因为您将foo存储在一个字段中,所以它的行为仍然是singleton,因为它总是指向同一个实例。

如果您在构造函数中启动类,它将始终启动,即使配置文件不是活动的。Spring不能(也不应该)检测实例在哪里启动。如果配置文件不处于活动状态,Spring IoC将不会调用该方法。根据上面的解释,在方法本身中启动实例会更安全。

 类似资料:
  • 我正在设计一个用Go编写的gRPC服务。 gRPC服务前面是特使,它将传入的HTTP请求转换为gRPC,并将gRPC响应转换为JSON。 此应用程序的要求是有一个返回以下JSON对象的endpoint: 我可以在Go中非常简单地建模这个响应,如下所示: 但我的要求是,有时我的_id可能是空的。在这种情况下,我想找回以下JSON: 信息技术 是否可以修改,使可以是返回的JSON对象中的字符串或空值?

  • 问题内容: 有没有一种方法可以包含超级的私有字段?我尝试添加,但是没有用。 请看下面的代码 Employee.java 管理器 输出量 那是我能做的最好的,连接+一组字符串,这肯定是一团糟,还有其他方法,即使语言规范不允许它确实有蚀的能力, 注意 :使用 eclipse 生成 toString 方法,通过任何方式,我可以告诉eclipse也包括超类字段, 换句话说,我可以取代这个凌乱的代码 通过让

  • 本文向大家介绍Spring装配bean方法实例总结,包括了Spring装配bean方法实例总结的使用技巧和注意事项,需要的朋友参考一下 一 前言 在XML中进行显式配置。 在Java中进行显式配置。 隐式的bean发现机制和自动装配 关于xml配置不会在本篇说明,有兴趣的读者可以自行了解学习; 二 自动装配bean 自动装配Bean主要通过如下两个方式实现自动装备bean 组件扫描(compone

  • 我试过的事情: scope=“prototype” restartable=“true” 实现了一个ApplicationContextAware类来获取ApplicationContext。 为beforeJob()和afterJob()实现了一个JobExecutionListener类。 以下是细节: null 解决方案是简单地在JobParameters()中提供至少一个JobParame

  • 我刚刚开始使用WebDriver,我正在尝试学习最佳实践,特别是使用PageObject和PageFactory。 我的理解是,PageObject应该公开网页上的各种操作,并将WebDriver代码与测试类隔离开来。根据所使用的数据,相同的操作通常会导致导航到不同的页面。 例如,在这个假设的登录场景中,提供管理员凭据将带您进入AdminWelcome页面,提供客户凭据将带您进入CustomerW

  • 假设我有一个spring bean我想在整个应用程序中使用,但是因为它是遗留代码,所以我不能在或任何类型的bean中使用它,因为这个类是在整个项目中手动实例化的,所以我不能在我想要的地方自动地使用它。 我如何为一个我想要重用的spring bean创建一个包装器类,配置如下,这样它除了返回在应用程序上下文中注册的bean的实例之外什么都不做? 基本上,我正在寻找类似的方法,如: 这样,在我想使用M