Я знаю, что вы приняли ответ, но я просто хочу высказать свое собственное мнение. Во-первых, я не думаю, что вы хотите использовать шаблон Abstract Factory, кажется, что вы не создаете объекты, а просто хотите найти клиентские объекты на основе их имени. Это работа для Locator, давайте назовем его ClientLocator (из-за отсутствия лучшего названия).
Идея состоит в том, что вы создаете класс с именем ClientLocator
, который реализует ApplicationContextAware
. Реализуя этот интерфейс, Spring вводит объект ApplicationContext
через метод установки. Используя объект ApplicationContext
, мы можем искать bean-компонент по его имени, после чего мы можем проверить тип bean-компонента, чтобы убедиться, что мы получили правильный, и выдать ошибку, когда мы этого не сделаем.
Вот как выглядит код.
Клиенты
// SentimentClient.java
public interface SentimentClient {
void call();
}
// FirstClient.java
@Service
public class FirstClient implements SentimentClient {
@Override
public void call() {
System.out.println("Hello from the first client");
}
}
// SecondClient.java
@Service
public class SecondClient implements SentimentClient {
@Override
public void call() {
System.out.println("Hello from the second client");
}
}
ClientLocator.java
@Component
public class ClientLocator implements ApplicationContextAware {
private ApplicationContext ctx;
public SentimentClient get(String name) {
return ctx.getBean(name + "Client", SentimentClient.class);
}
@Override
public void setApplicationContext(ApplicationContext ctx) throws BeansException {
this.ctx = ctx;
}
}
Вот как мыможно использовать локатор.
ClientLocatorDemo.java
@Component
public class ClientLocatorDemo implements CommandLineRunner {
@Autowired
private ClientLocator clientLocator;
@Override
public void run(String... args) {
SentimentClient firstClient = clientLocator.get("first");
SentimentClient secondClient = clientLocator.get("second");
firstClient.call();
secondClient.call();
// output:
// Hello from the first client
// Hello from the second client
}
}
Таким образом, каждый раз, когда код хочет получить клиента по его имени, просто подключите1028 * и вызовите метод get(String name)
.
И самое главное, вы можете создать реализацию клиента столько, сколько захотите, и получить их по имени (при условии, что у каждого есть уникальное имя и заканчивается на «Клиент») без необходимости автоматически связывать их по очереди. .