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

调用@bean注释方法的不同行为

益绯辞
2023-03-14

我知道从@configuration中调用@bean带注释的方法,前面已经讨论过了。

但是我不明白为什么当bean被覆盖时它就不起作用了。

我有一个遗留类,我不能修改。它是一个配置,同时也是一个业务bean。这是一个简化版本:

@Configuration
public class MyBean {

    String someMethod() {
        return otherBean() + "|" + otherBean();
    }

    int called = 0;

    @Bean
    Object otherBean() {
        return called ++;
    }
}
@SpringJUnitConfig//(MyBean.class)
public class BeanTest {

    @Autowired
    MyBean myBean;

    @Test
    void testIt() {
        assertEquals("0|0", myBean.someMethod());
    }

    @Configuration
    static class TestConfig {    

        @Bean
        MyBean myBean() {
            return new MyBean();
        }
    }
}

现在,调用myBean.someMethod()返回01而不是00

testconfig配置被删除并且测试上下文的配置被设置为@SpringJunitConfig(MyBean.class)时,一切都能正常工作(结果为00)。

在测试中注册bean有什么不同?

共有1个答案

孙京
2023-03-14

代理用@bean注释的方法调用并从Spring上下文返回实例的“魔法”仅发生在配置bean中(如这里:@SpringJUnitConfig(MyBean.class))。

但是,当您创建一个新实例时,返回new MyBean()时,@configuration注释将被忽略,对象被注册为普通bean(@bean MyBean MyBean()),而不是配置。这就是方法调用otherBean()总是创建一个新实例的原因。

 类似资料:
  • 我很好奇spring注入是如何用注释处理调用方法的。如果我将注释放在一个方法上,并返回一个实例,我理解这会告诉spring通过调用该方法并获得返回的实例来创建一个bean。但是,有时该bean必须用于连接其他bean或设置其他代码。通常的方法是调用带注释的方法来获得一个实例。我的问题是,为什么这不会导致bean的多个实例浮动? 例如,参见下面的代码(摘自另一个问题)。方法是用注释的,因此我想spr

  • 问题内容: 我很好奇弹簧注入如何处理带有注释的调用方法。如果我在方法上添加注释并返回实例,则我理解这告诉spring通过调用方法并获取返回的实例来创建bean。但是,有时必须使用该bean来连接其他bean或设置其他代码。完成此操作的通常方法是调用带注释的方法以获取实例。我的问题是,为什么这不会导致有多个bean实例漂浮? 例如,请参见下面的代码(取自另一个问题)。该方法带有注释,因此我可以想象s

  • 本文向大家介绍PowerShell单行注释、多行注释、块注释的方法,包括了PowerShell单行注释、多行注释、块注释的方法的使用技巧和注意事项,需要的朋友参考一下 PowerShell的注释符分为行注释符和块注释符。行注释符使用井号(#)引起一行;块注释符使用“<#”和 “#>”来引起一段注释。 行注释符 举例如下: 块注释符、多行注释 举例如下: 这是小编每次写脚本之前,都会定义的一段关于脚

  • 问题内容: 有人可以给MWE 直接在方法上使用注释的方法吗? 我已经看到了无数的关于在类定义中使用它的示例-但还没有方法的示例。 引用文档: 这种添加到一个类定义或 一个方法 @Target(value = {TYPE, METHOD }) 因此,我认为还有一种可能性和预期的用途-但不幸的是,我无法弄清楚。 问题答案: 这里的DataSource类具有属性url,用户名,密码,driverClas

  • 我使用Netbeans来了解JavaEE。我使用“插入代码”和“调用企业bean”来获取一个远程bean,其接口位于我的项目中包含的库中。如果我的项目是一个web应用程序netbeans,那么这样做会插入一个如下所示的函数。(这是一个jndi查找,对吗?) 当您在企业应用程序客户端中执行同样的操作时,netbeans只会给出 这是为什么? 如果我试图在web应用程序中手动创建第二个,服务器会出现如