Как выполнить автоматическое соединение, когда для зависимых классов присутствует более одного bean-компонента? - PullRequest
0 голосов
/ 01 июня 2018

ClassA

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();
        }
}

Проверка класса:

    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(classes = TestConfig.class)
    class Test {
        @Autowired
        ClassA obj1; // how to initialise it with instance1

        @Autowired
        ClassA obj2; //// how to initialise it with instance2
    }

Как установить obj1 с instance1 и obj2 с instance2 в классе Test

Ответы [ 2 ]

0 голосов
/ 01 июня 2018

Обновление

Примечание : Я не знаю, понимаю ли я, что вы хотели бы сделать, но это мое решение ...

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 документ говорит следующее

Помечает конструктор, поле, метод сеттера или метод конфигурации как автоматически подключаемые средствами Spring для внедрения зависимостей.

, ноне класс ... Документация: https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/beans/factory/annotation/Autowired.html

0 голосов
/ 01 июня 2018

Одно из возможных решений.

@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
}

Создание экземпляра ClassA с использованием нового и использование инжекции конструктора в ClassA вместо внедрения поля (@Autowired)

class ClassA {
  ClassB classB;

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

Если вы не можете изменить свойКласс A, затем создайте два класса TestConfig.Один раз с obj1 и один раз с obj2.И используйте соответственно на основе вашего теста

...