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

Spring不能创建bean

鄢晔
2023-03-14

我是spring及其概念的初学者。我试图使用@Configuration和package scan注释来扫描单个包下的一些bean提供程序类。当其中一个类的@Bean注释方法与另一个不同类的@Bean注释方法同名时,两个类都不会创建Bean。如果我将@bean注释的方法名称更改为未创建的bean的另一个名称,那么两个bean都会成功创建。无法理解这种行为。

    @Configuration
    public class ManagementHelperProvider {
        @Bean
        public ManagementHelper getInstance() {
            return new ManagementHelper();
        }
    }

如果我正在创建另一个类,如顶部下面的Bean ManagementHelper,则不会创建。

    @Configuration
    public class ManagementValidatorProvider {
        @Bean
        public ManagementValidator getInstance() {
            return new ManagementValidator();
        }
    }

如果我正在创建另一个类,如顶部下面的Bean ManagementHelper。

    @Configuration
    public class ManagementValidatorProvider {
        @Bean
        public ManagementValidator getInstanceTwo() {
            return new ManagementValidator();
        }
    }

共有3个答案

谢胤
2023-03-14

默认情况下,spring中的bean是单例的,只需要在上下文中定义一次。组件扫描将搜索所有文件。

不需要多次定义getInstance(),只需一次!为清晰起见,请将此方法重命名如下:

@Bean
public ManagementHelper getManagementHelperInstance() {
    return new ManagementHelper();
}

在其他类中需要依赖它的地方,在类中添加以下内容作为成员变量

@Inject
ManagementHelper managementHelperInstance

如果您不想在多个位置(而不是单个位置)使用同一个ManagementHelper,那么将MangementHelper类注释为原型,这将在每个请求上创建一个新的bean实例,而不仅仅是返回相同的实例,即

@Scope("prototype")
public class ManagementHelper 
詹甫
2023-03-14

由于您试图覆盖bean,它将引发异常

如果你还想这么做。

请参阅SetAllowBean定义覆盖-https://docs.spring.io/spring/docs/2.5.x/javadoc-api/org/springframework/beans/factory/support/DefaultListableBeanFactory.html#setAllowBeanDefinitionOverriding(布尔值)

您可以使用name属性简单地更改bean的名称

  • @Bean(name="name1")
  • @Bean(name="name2")
邹浩
2023-03-14

案例一:

bean1是用getInstance创建的。

使用相同名称getInstance和bean1创建的bean2被此覆盖。

案例2:

bean1是用getInstance创建的。

bean2是用getInstanceTo创建的。没有覆盖,因为名称没有冲突。

如果你

 @Bean(name="bean1") 

@Bean(name="bean2") 

它也会起作用。

@Configuration
public class AppConfig {
    @Bean
    public TransferService transferService() {
        return new TransferServiceImpl();
    }
}

以上完全等同于以下appConfig.xml

<beans>
    <bean name="transferService" class="com.acme.TransferServiceImpl"/>
</beans>

这两种情况都将导致BeanFactory/Application ationContext中提供一个名为transferService的bean,绑定到TransferServiceImpl类型的对象实例:

transferService => com.acme.TransferService
 类似资料:
  • 我的问题是:为什么我不能自动连接我的地图与接口,而我可以与实现? 多谢了。

  • 我的项目是一个Maven项目,具有以下依赖关系: 为了保持文章的简短性,我试图只放置相关的依赖项,避免其他的依赖项(Lombok、jpa等) 和我的graphqls文件(在参考资料文件夹中):

  • 这是我的项目目录结构。 所有controller和其他类以及bean目录都在“WebPortalApplication”类下,正如Spring Boot doc所述,我们没有明确指定要扫描bean的包,只要这些包位于“main”类目录下,对吗?因此,当我运行“WebPortalApplication”文件时,它会生成,但有这样的例外。 @RestController公共类

  • 我尝试了很多事情 be.fgov.minfin.virtualprinter.model.StatusMap中的字段statusDescriptionDao需要一个类型为

  • 当我启动应用程序时,我得到以下错误:

  • 我正在尝试在Swiftui2.0Xcode 12.4中创建一个WebView视图,但它太新了,我找不到答案和最佳实践的好例子。对于下面的代码,我得到以下错误。 类型SwiftUIWebView不符合协议UIView表示 此外,配置设置已更改,我无法启用。正确地允许使用JavaScript。尝试将其添加到“perfs”会触发一个错误,抱怨不喜欢Bool。