Как выполнить 1 метод из всех реализаций весной - PullRequest
1 голос
/ 06 мая 2020

У меня есть несколько классов ниже. Очевидно, что если я вызову printMessage в классе CustomAtm, он выполнит метод в PrinterFile, потому что я объявил его с помощью @Qualifier. Но мне интересно, есть ли способ выполнить оба метода printMessage в PrinterConsole и PrinterFile, когда я вызываю его и не объявляю @Qualifier?

Интерфейс принтера

public interface Printer {
    void printMessage(String message);
}

Класс PrinterConsole

import org.springframework.stereotype.Component;

@Component("printerConsole")
public class PrinterConsole implements Printer {
    @Override
    public void printMessage(String message) {
        System.out.println(message);
    }
}

Класс файла принтера

import org.springframework.stereotype.Component;

@Component("printerFile")
public class PrinterFile implements Printer {
    Logger logger = LoggerFactory.getLogger(PrinterFile.class);

    @Override
    public void printMessage(String message) {
        logger.info(message);
    }
}

Класс CustomAtm

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;

@Component("customAtm")
public class CustomAtm {
    @Autowired
    @Qualifier("printerFile")
    Printer printer;

    public void printCurrentMoney() {
        printer.printMessage("Current ATM money is... ");
    }
}

Ответы [ 2 ]

0 голосов
/ 06 мая 2020

Вы можете найти все экземпляры, зарегистрированные как bean-компонент, и реализовать интерфейс принтера:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component("customAtm")
public class CustomAtm {
    @Autowired 
    private ApplicationContext applicationContext;

    public void printCurrentMoney() {
        Map<String, Printer> printers = context.getBeansOfType(Printer.class);
        for(Printer printer: printers.values()){
            printer.printMessage("Current ATM money is... ");
        }
    }
}
0 голосов
/ 06 мая 2020

Метод 1 Ввести список принтеров

@Autowired(required = false)
private List<Printer> printers;


public void printAll() {
    for (Printer printer : printers) {
        printer.print();
    }
}

Метод 2 вы можете определить другой класс, который объединяет 2 компонента

@Component("printerAdapter")
public class PrinterAdapter implements Printer {

    @Autowired
    @Qualifier("printerFile")
    Printer printerFile;

    @Autowired
    @Qualifier("printerConsole")
    Printer printerConsole;

    @Override
    public void printMessage(String message) {
        printerConsole.printMessage();
        printerFile.printMessage();
    }
}

И в своем классе клиента введите новый класс принтера и используйте это

@Autowired
@Qualifier("printerAdapter")
Printer printer;
...