作成およびロードAbstractPrinter
オブジェクトの工場を、コンテナの起動時に以下に示すように、動的にそれぞれのAbstractPrinter
年代を呼び出すことができますprint()
(または独自の方法)入力パラメータ(コントローラから来る)に基づいてサービスに。
PrinterServiceImpl
クラスの下のコードでは、主なポイントは、List<AbstractPrinter>
のすべてがSpringコンテナによって注入されることです(HPPrinterなどのようにいくつの実装クラスを提供するかによって異なります)。次に、コンテナの起動時にprinterTypeをキーにして、これらのBeanをMap
にロードします。
@Controller
public class YourController {
@Autowired
private PrinterService printerService;
public X myMethod(@RequestParam("input") String input) {
printerService.myServiceMethod(input);
//return X
}
}
PrinterServiceImplクラス:
public class PrinterServiceImpl implements PrinterService {
@Autowired
private List<AbstractPrinter> abstractPrinters;
private static final Map<String,AbstractPrinter> myPrinters = new HashMap<>();
@PostConstruct
public void loadPrinters() {
for(AbstractPrinter printer : abstractPrinters) {
myPrinters.put(printer.getPrinterType(), printer);
}
}
//Add your other Autowired dependencies here
@Override
public void myServiceMethod(String input){//get input from controller
AbstractPrinter abstractPrinter= myPrinters.get(input);
abstractPrinter.print();//dynamically calls print() depending on input
}
}
HPPrinterクラス:
@Component
public class HPPrinter implements AbstractPrinter {
@Override
public String getPrinterType() {
return "HP";
}
@Override
public void print() {
// Your print code
}
}
FilePrinterクラス:
@Component
public class FilePrinter implements AbstractPrinter {
@Override
public String getPrinterType() {
return "FILE";
}
@Override
public void print() {
// Your print code
}
}
依存関係は1回だけ注入されることになっています。異なるリクエストパラメータ値で多くのリクエストを受け取るとどうなりますか?あなたはいつも別のプリンタを手に入れますか? – Isukthar
はい、インスタンス化されたプリンタはリクエストオブジェクトに依存します。プリンタオブジェクトが作成されると、同じパラメータで他のリクエストに再利用できます – sudshekhar
しかし、異なるパラメータで別のリクエストを受け取った場合、別のプリンタが必要です。あなたはすでにそれを持っている場合はどこに保管することができますか?または前のものを置き換えますか? – Isukthar