繁体   English   中英

如何通过方法创建两个具有相同 class 的 bean?

[英]How to create two beans with the same class by methods?

我想创建 Clazz,我可以在其中创建两个具有相同 class 但配置不同的 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:由 class 路径资源中的方法“Client1”定义... - Bean2:由 class 路径资源中的方法“Client2”定义。 . 为什么我不能这样做?

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

尝试使用@Configuration

表示 class 声明了一个或多个 @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());
        }
    }
}

Output 将是:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM