2010-12-14 22 views
1

Au printemps 3, il est impossible de définir @Autowired soit dans les champs statiques ou méthodes, de sorte que je veux déclarer une classe utilitaire tel que:classe Util pour accesing un service au printemps 3

public class SchoolYearServiceUtil { 
    private static SchoolYearService schoolYearService; 

    public static SchoolYear getSchoolYear(Long id) { 
     return schoolYearService.get(id); 
    } 
} 

à évitez d'injecter le schoolYearService partout (jsp, command class ...) dans lequel j'en ai besoin. Dans ce cas, je n'ai pas besoin d'une interface pour être implémentée par SchoolYearServiceUtil.

Je ne veux pas avoir à initialiser l'objet par le biais du code mais à obtenir la même instance que celle du Spring.

Quelle serait la meilleure option pour implémenter getSchoolYear en tant que méthode statique?

Merci.

Serait-ce conceptuellement mal ?:

@Component 
public class SchoolYearServiceUtil { 

private static SchoolYearService schoolYearService; 

@Autowired(required = true) 
private SchoolYearServiceUtil(@Qualifier("schoolYearServiceImpl") SchoolYearService schoolYearService) { 
    SchoolYearServiceUtil.schoolYearService = schoolYearService; 
} 

public static SchoolYearService getSchoolYearService() { 
    return schoolYearService; 
} 

public static SchoolYear getSchoolYear(Long id) { 

    return getSchoolYearService().get(id); 
} 
} 

je dois faire en sorte que seuls les appels du printemps une fois que le constructeur et le constructeur est appelé nulle part ailleurs, c'est pourquoi je déclarais le constructeur comme privé.

+3

Il vous manque le point d'injection de dépendance, qui consiste à * injecter le service partout où cela est nécessaire. Ce que vous décrivez est le modèle Service Locator, qui est le contraire de DI. Le printemps ne vous aidera pas là-bas. – skaffman

+0

@Juan: Ce n'est pas conceptuellement "faux", ce n'est pas la façon dont Spring fait les choses. Le printemps est construit autour de DI, et ce que vous décrivez n'est pas DI. – skaffman

+0

@skaffman Que pensez-vous de la solution que j'ai posté ?? Je comprends ce que tu dis mais je veux que la classe util puisse appeler le service initialisé par Spring. Donc, à la fois, les appels au Service où cela est injecté et les appels au Service via ServiceUtil sont traités par la même instance. –

Répondre

1

Je suis entièrement d'accord avec le commentaire de skaffman. Vous n'avez pas besoin de champs static avec DI. Vous venez de définir un bean de portée singleton (par défaut).

Il existe un moyen d'obtenir un haricot statiquement, mais vous devez savoir qu'il ne doit pas être utilisé dans des situations normales. (il y a quelques applications valides). Il est d'utiliser le WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext)

Vous remarquez que vous devez passer un argument ServletContext.