Альтернатива @Qualifier в весенней загрузке

у меня такой сценарий

  1. команда А реализует interface Vehicle как ClassAVehicle
  2. команда B реализует сервис панели мониторинга, в котором она использует реализацию транспортного средства

Теперь у команды А есть новая реализация Vehicle как ClassBVehicle. И команда Б хочет его использовать. Один из способов, который я знаю, - это использование аннотации @Qualifier. Но для этого мне нужно изменить код команды B. Так у меня здесь жесткая связь? Могу ли я иметь некоторую конфигурацию на основе XML, чтобы код команды B автоматически разрешал новый экземпляр ClassBVehicle?

interface Vehicle{
    int getNoTyre();
}
class ClassAVehicle{
    int getNoTyre(){
        return 1;
    }
}
class ClassBVehicle{
    int getNoTyre(){
        return 2;
    }
}
class Dashboard{
    // Here everything is fine until classBVehicle is not there
    // Now I want to use new classBVehicle.
    // One way I see is that using @Qualifier but will it not be tight coupling? 
    @Autowired
    Vehicle oldAInstance;
}

надеюсь, я не до конца понял вопрос... команда Б использует реализацию вместо интерфейса? В этом весь смысл интерфейсов, так что если ответ на этот вопрос положительный, то да, у вас тесная связь. Команда Б должна использовать интерфейс в своем коде и фактически не знать реализации. Команда А отвечает за реализацию интерфейса. Однако это может выглядеть.

Alejandro Alanis 14.12.2020 16:29

Привет, я добавил пример кода. Извинение за поздний ответ.

Pankaj Bagal 30.12.2020 07:34
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
2
1 133
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если вы используете xml для определения bean-компонента, ваш способ подходит для разделения. Другой способ заключается в том, что вы можете использовать ApplicationContext для динамического получения bean-компонента в программе аннотации. Есть два способа получитьBean с beanName или beanClass. Ниже приведен образец:


@Service
public class BService {

    private Vehicle vo;

    @Autowired
    ApplicationContext context;


    public void getVehicle(String beanName){
        this.vo =  (Vehicle) context.getBean(beanName);
    }


    public void getVehicle(Class beanClz){
        this.vo = (Vehicle) context.getBean(beanClz);
    }

    public void print(){
        System.out.println("---class is "+vo.getClass());
    }

}

public interface Vehicle  {
}

@Component
public class OneVehicle implements Vehicle{
}

@Component
public class TwoVehicle implements Vehicle{
}

@SpringBootApplication
public class SpringDependenciesExampleApplication implements ApplicationRunner {


    @Autowired
    BService bService;

    public static void main(String[] args) {
        SpringApplication.run(SpringDependenciesExampleApplication.class, args);
    }


    @Override
    public void run(ApplicationArguments applicationArguments) throws Exception {
        bService.getVehicle("oneVehicle");
        bService.print();
    }
}


// output is ---class is class OneVehicle

Мне нужно что-то вроде этого. Но все же мне нужно изменить код команды B. Могу ли я выполнить вышеуказанную настройку в каком-то внешнем XML-файле, и он будет автоматически загружен в код команды B?

Pankaj Bagal 30.12.2020 07:33

Каковы ваши настройки для управления использованием bService, какое транспортное средство без перезапуска приложения? Если вы поместите информацию о настройке в XML-файл, вам следует перезапустить приложение, чтобы перезагрузить файл. Возможно, вы можете использовать параметр -D или спокойный интерфейс для получения информации о настройке, чтобы это было фактически автоматически без перезапуска приложения.

jacky-neo 30.12.2020 08:03

Другие вопросы по теме