у меня такой сценарий
interface Vehicle как ClassAVehicleТеперь у команды А есть новая реализация 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;
}
Привет, я добавил пример кода. Извинение за поздний ответ.




Если вы используете 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?
Каковы ваши настройки для управления использованием bService, какое транспортное средство без перезапуска приложения? Если вы поместите информацию о настройке в XML-файл, вам следует перезапустить приложение, чтобы перезагрузить файл. Возможно, вы можете использовать параметр -D или спокойный интерфейс для получения информации о настройке, чтобы это было фактически автоматически без перезапуска приложения.
надеюсь, я не до конца понял вопрос... команда Б использует реализацию вместо интерфейса? В этом весь смысл интерфейсов, так что если ответ на этот вопрос положительный, то да, у вас тесная связь. Команда Б должна использовать интерфейс в своем коде и фактически не знать реализации. Команда А отвечает за реализацию интерфейса. Однако это может выглядеть.