La maggior parte delle linee guida Java EE suggeriscono che dovremmo definire i servizi EJB astratti (API) e quindi definire le implementazioni concrete per conformarsi ai principi di progettazione OO.
Ma al punto di iniezione, l'EJB è locale o remoto, siamo costretti a fornire la classe di implementazione concreta.
Esempio:
@EJB(jndi="java:global/moduleName/ConcreteClassName:fullyQualifiedInterfaceName")
ServiceI service;
Pertanto, la domanda: come mai questa iniezione mantiene Inversion of Control e un ulteriore passo avanti: come può essere polimorfico?
EDIT:
Avendo capito che la domanda potrebbe non essere chiara, cercherò di dare un esempio.
Diamo un sistema che deve calcolare gli stipendi per i dipendenti. Esistono due tipi di stipendio per ora, è altamente possibile che un terzo arriverà:
public class Employee{
String name;
SalaryCalcService salaryService;
}
public interface SalaryCalcService {
public double abstract calculateSalary();
}
public class PerMonthCalc implements SalaryCalcService {
public double calculateSalary(){
//return salary with per month calculations
}
}
public class PerHourCalc implements SalaryCalcService {
public double calculateSalary(){
//return salary with per hour calculations
}
}
Da qualche parte nel sistema vengono creati oggetti concreti:
SalaryCalcService perMonth = new PerMonthCalc();
SalaryCalcService perHour = new PerHourCalc();
Durante il lavoro quotidiano di sistema, vengono creati nuovi dipendenti:
Employee emp1 = new Employee();
emp1.serSalaryService(perMonth);
//...
Infine, il codice cliente deve utilizzare tutte queste entità ed eseguire un calcolo per i pagamenti:
for(Employee emp : employees){
double salary = emp.getSalaryService().calculateSalary();
}
Nel codice client, non ho bisogno di sapere, né preoccuparsi di quale sia l'implementazione specifica di SalaryCalcService.
Ancora più importante, se arriverà un terzo metodo di calcolo dello stipendio. Creerò solo una terza sottoclasse di SalaryCalcService e modificherò il punto in cui vengono creati gli oggetti Concrete. NO CODICE CLIENTE VERRÀ MODIFICATO.
Come posso implementarlo in un ambiente Java EE, in cui il servizio esegue DB e altre transazioni e deve essere un EJB?