Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/309.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
SpringJava配置扩展抽象配置_Java_Spring_Spring Java Config - Fatal编程技术网

SpringJava配置扩展抽象配置

SpringJava配置扩展抽象配置,java,spring,spring-java-config,Java,Spring,Spring Java Config,在我们的软件中,我们使用SpringJava配置。我们有一个设置,其中一个配置扩展了一个抽象配置。请看一下这个测试用例: import java.util.concurrent.atomic.AtomicInteger; import org.junit.Test; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframe

在我们的软件中,我们使用SpringJava配置。我们有一个设置,其中一个配置扩展了一个抽象配置。请看一下这个测试用例:

import java.util.concurrent.atomic.AtomicInteger; import org.junit.Test; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; public class SpringConfigTest { @Test public void test() { final AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(MyConfig.class); ctx.getBeansOfType(AtomicInteger.class).entrySet().stream().forEach( b -> System.out.println(b.getKey() + " : " + b.getValue() + " (" + b.getValue().hashCode() + ")")); } @Configuration public static class MyConfig extends AbstractConfig { @Bean(name = "anotherName") public AtomicInteger myBean() { return new AtomicInteger(5); } } public static abstract class AbstractConfig { @Bean public AtomicInteger myBean() { return new AtomicInteger(10); } } } 所以它说,有两个bean(两个实例,每个名称对应一个实例),而且更令人惊讶的是,使用相同的方法(
MyConfig\myBean()
)创建了这两个bean

这种行为在我们看来很奇怪:我们期望spring要么尊重通常的java继承方式,要么只从
MyConfig
创建bean。。。或者至少创建两个独立的bean(“10”和“5”),以防它将
AbstractConfig
视为独立的配置

在研究此问题时,我们还尝试在
MyConfig
类上注册方法名称:

public static class MyConfig extends AbstractConfig { @Bean(name = ["anotherName", "myBean"]) public AtomicInteger myBean() { ... 公共静态类MyConfig扩展了AbstractConfig{ @Bean(name=[“另一个名称”,“myBean”]) 公共原子整数myBean(){ ... 这次我们只有一个豆子:
其他名称:5(2109798150)

更让我们惊讶的是

有人知道这是否真的是正确的行为,还是我们只是使用了错误的行为?我们应该在春季的jira中提高门票吗?
提前感谢!

我不是Spring专业人士,但我要说的是,行为是经过设计的。为了实现您想要的(我希望我猜对了)“注入这个bean而不是另一个”您将在bean上使用,根据您将使用的情况有选择地启用配置,即在Spring中,bean可以先按类型连接,然后按名称连接。 因此@Qualifier(“myBeanName”)可以消除自动连接多个具有相同类型的bean的歧义,例如

因此: 非抽象bean被赋予了另一个名称,这使得它在应用程序上下文中被视为不同的bean

您可以在非配置类中声明bean。这称为“lite”模式,但它在应用程序上下文中仍然是一个bean。 另请参见lite模式下的回答


我不知道可以给一个bean多个名称,但是由于Springbean在默认情况下是单例的,所以在第二种情况下只能创建一个bean,即“myBean”已经存在,并且应用程序上下文中只能有一个具有该名称的bean。

谢谢您的回答!
@Primary
只会解决注入问题。但是仍然创建了两个bean(包括它们的整个生命周期-这就是我的问题所在)。我们不确定这是否是错误的。
@Conditional
不是我们的选项。因此,您的问题是,是否可以存在多个共享同一名称的bean?不,名称不同。问题是:我从抽象配置扩展而来(未使用
@configuration
注释),覆盖
@Bean
-方法并仅更改name属性:是否正确,spring仅在这种特殊情况下创建了两个Bean?(如果省略name属性,则只创建一个Bean)。这对我们来说似乎很奇怪。我认为这是正确的,因为bean的创建是通过对组件扫描期间发现的每个不同bean id/名称进行反射/代理来完成的。我认为原始配置是抽象的对该过程来说并不重要。至少文档中没有说明任何其他内容:创建spring的用例是什么java配置摘要?我们使用的是spring data mongodb,我们在应用程序中连接到两个不同的数据库。因此,我们重写了两次,但必须重命名一些bean,以便在其他地方找到它们。但现在我们已经看到,它们在我们的appCtx中出现了三次……这可能与组件扫描路径问题有关吗?Mayb您可以避免扫描mongodb包?或者这是spring数据与mongodb一起工作所必需的吗?不,这不是我们类路径扫描的一部分。只有两个派生类被自动扫描。 public static class MyConfig extends AbstractConfig { @Bean(name = ["anotherName", "myBean"]) public AtomicInteger myBean() { ...