如何为依赖类提供多个bean时自动装配?

时间:2018-06-01 09:39:56

标签: java spring junit4 spring-test

ClassA

/occupied

班级配置:

class ClassA {
    @Autowired 
    class ClassB;

    }

班级考试:

    @Configuration
    class TestConfig {
        @Bean(name = "instance1")
        public ClassB instance1() {
            return new ClassB();
        }

        @Bean(name = "instance2")
        public ClassB instance2() {
            return new ClassB();
        }
}

如何在Test类中使用instance1实例化obj1和使用instance2实现obj2?

2 个答案:

答案 0 :(得分:4)

一种可能的解决方案。

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = TestConfig.class)
 class Test {

    @Autowired
    @Qualifier("instance1")
    ClassB obj1;

    @Autowired
    @Qualifier("instance2")
    ClassB obj2; // You can also rename obj2 as instance2 and remove @Qualifier
}

使用new创建ClassA的实例并在ClassA中使用构造函数注入而不是字段注入(@Autowired)

class ClassA {
  ClassB classB;

    @Autowired 
    public ClassA(ClassB classB){
     this.classB = classB;
    }
}

如果您无法更改A类,则创建两个TestConfig类。一次使用obj1,一次使用obj2。并根据您的测试用例进行相应的使用

答案 1 :(得分:0)

<强>更新

注意:我不知道你是否理解你想做什么,但这是我的解决方案......

ClassA实际上不是一个类,而是接口

 public interface ClassA {

        public String getInstanceName();

        public void setInstanceName(String instanceName);
    }

ClassB是“ClassA”接口的实现

public class ClassB implements ClassA {

    private String instanceName;

    public ClassB(String instanceName) {
        super();
        this.instanceName = instanceName;
    }

    @Override
    public String getInstanceName() {
        return instanceName;
    }

    @Override
    public void setInstanceName(String instanceName) {
        this.instanceName = instanceName;
    }

}

TestConfig配置类

@Configuration
class TestConfig {

    @Bean(name = "instance1")
    public ClassB instance1() {
        return new ClassB("instance1");
    }

    @Bean(name = "instance2")
    public ClassB instance2() {
        return new ClassB("instance2");
    }
}

和测试类

@RunWith(SpringRunner.class)
@SpringBootTest
public class DemoApplicationTests {

    @Autowired
    @Qualifier("instance1")
    ClassA objB1; 

    @Autowired
    @Qualifier("instance2")
    ClassA objB2; 

    @Test
    public void test() {
        System.out.println(objB1.getInstanceName());
        System.out.println(objB2.getInstanceName());
    }

}

如果它不是你想要的,也许会帮助别人。关于@Autowired注释,文档说明如下

  

标记构造函数,字段,setter方法或配置方法   由Spring的依赖注入工具自动启动。

但不是班级...... 文档:https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/beans/factory/annotation/Autowired.html