【问题标题】:How to create two beans with the same class by methods?如何通过方法创建两个具有相同类的bean?
【发布时间】:2020-06-09 09:21:25
【问题描述】:

我想创建 Clazz,在这里我可以创建两个具有相同类但具有不同配置的 Bean。

public class Clazz {
//same class : Client, inside has the different configuration
//inicilized by methods
@Bean(name="Bean1")
public Client1 (){}

@Bean(name = "Bean2")
public Clien2t (){}
}

然后我想将它们注入到其他类中

public class ClassForInjectBean1{

@Autowired
@Qualifier("Bean1")
@NotNull 
Client client
....
}

public class ClassForInjectBean2{

@Autowired
@Qualifier("Bean2")
@NotNull 
Client client
....
}

我已经在 ClassForInjectBean1 和 ClassForInjectBean2 类中尝试过这种构造

@Resource(name = "Bean2")
@NotNull 
Client client

@Autowired
@Qualifier("Bean2")

但是spring不明白

Ошибка : ClassForInjectBean1 中构造函数的参数 1 需要单个 bean,但找到了 2 个: - Bean1:由类路径资源中的方法“Client1”定义... - Bean2:由类路径资源中的方法“Client2”定义... 为什么我不能这样做?

我知道https://www.baeldung.com/spring-qualifier-annotation有这种方式,但是我不会创建很多类和接口。

【问题讨论】:

    标签: java spring spring-boot spring-mvc dependency-injection


    【解决方案1】:

    尝试使用@Configuration

    表示一个类声明了一个或多个@Bean 方法并且可能是 由 Spring 容器处理以生成 bean 定义和 在运行时对这些 bean 的服务请求

    我为你提供了一些例子。

    @Configuration
    public class Cfg {
    
        @Bean("client1")
        public Client client1() {
            return new Client("client1");
        }
    
        @Bean("client2")
        public Client client2() {
            return new Client("client2");
        }
    }
    
    public class Client {
        private String name;
    
        public Client(String name) {
            this.name = name;
        }
    
        @Override
        public String toString() {
            return "Client{" +
                    "name='" + name + '\'' +
                    '}';
        }
    }
    
    @Component
    public class InjectionTest {
    
        @Component
        public class ClassForInjectBean1 {
            private final Client client;
    
            public ClassForInjectBean1(@Qualifier("client1") Client client) {
                this.client = client;
            }
    
            @PostConstruct
            public void testInit() {
                System.out.println(client.toString());
            }
        }
    
        @Component
        public class ClassForInjectBean2 {
            private final Client client;
    
            public ClassForInjectBean2(@Qualifier("client2") Client client) {
                this.client = client;
            }
    
            @PostConstruct
            public void testInit() {
                System.out.println(client.toString());
            }
        }
    }
    

    输出将是:

    Client{name='client2'}
    Client{name='client1'}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-20
      • 2013-01-21
      相关资源
      最近更新 更多