Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring无法创建bean_Java_Spring_Spring Mvc_Autowired - Fatal编程技术网

Java Spring无法创建bean

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

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

    @Configuration
    public class ManagementHelperProvider {
        @Bean
        public ManagementHelper getInstance() {
            return new ManagementHelper();
        }
    }
如果我正在创建另一个类似下面的类,则不会创建top 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();
        }
    }

案例1:

使用名称getInstance创建的bean1

使用相同名称创建的bean2getInstance,而bean1被该名称覆盖

案例2:

使用名称getInstance创建bean1

使用名称getInstanceTwo创建bean2。没有覆盖,因为名称中没有冲突

如果你

 @Bean(name="bean1") 

它也会起作用

@Configuration
public class AppConfig {
    @Bean
    public TransferService transferService() {
        return new TransferServiceImpl();
    }
}
上面的完全等同于以下appConfig.xml

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

由于您试图覆盖bean,它将抛出异常

如果你还想做的话

请参阅SetAllowBean定义覆盖-

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

  • @Bean(name=“name1”)
  • @Bean(name=“name2”)

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

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

      @Bean
      public ManagementHelper getManagementHelperInstance() {
          return new ManagementHelper();
      }
      
      如果需要在其他类中依赖它,请在类中添加以下内容作为成员变量

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

      @Scope("prototype")
      public class ManagementHelper 
      

      如果您没有为
      @Bean
      注释提供
      名称
      元素,Bean方法的名称将成为相应Bean的唯一标识符。@SotiriosDelimanolis-这很奇怪,因为我可以定义两个具有相同名称的Bean,一个如果被另一个覆盖-因此它们不能是唯一的,只是
      名称
      ,不是
      id
      @mszymborski-Spring不会抱怨,它只是用相同的名称覆盖以前的bean定义,以便发现它们。@SotiriosDelimanolis-因此我对作者声称它不存在感到惊讶work@mszymborski其中一个bean将不会被创建。这就是我对这个问题的解释。
      @Inject
      ManagementHelper managementHelperInstance
      
      @Scope("prototype")
      public class ManagementHelper