Page History
Introduktion
Denne side beskriver de regler og bedste praksis, der anvendes i forbindelse med brug af dependency injection i NSP's Java-projekter. Det fokuserer specifikt på brugen af klasser som AnnotationConfigApplicationContext, AnnotationConfigWebApplicationContext, og relaterede konfigurationsklasser i NSP's komponenter.
Info |
---|
DI.1.1 § Til Dependency Injection i NSP's komponenter skal spring frameworket benyttes. |
Konfigurationsklasser
Der oprettes en eller flere konfigurationsklasser, der er mærket med @Configuration. Dette er stederne, hvor Spring-beans (med @Bean) definerers og konfiguration af komponentene foretages. Der skal dermed på NSP anvendes konfigurationsklasser og ikke xml-filer.
Konfigurationsklasser skal være opdelt baseret på funktionalitet eller moduler. For eksempel kan der være en konfigurationsklasse for databasen, en for webservices, en for sikkerhed osv.
...
Der skal dermed ikke anvendes @Autowired i konfigurationsklasserne.
Afhængigheder og injection
Brug @Autowired for at injecte afhængigheder i HttpServletten. Dette valg er bevidst truffet for kun at implementere injektionen i denne servlet-klasse og ikke introducere yderligere kompleksitet eller struktur i andre dele af applikationen. Denne tilgang fokuserer på at holde koden inden for HttpServlet-konteksten mere kortfattet og læsbar, hvilket letter udvikling og vedligeholde vedligehold af den specifikke servlet.
Info |
---|
DI.1.5 § De definerede beans injectes med @Autowired annotationen i HttpServletten. Det er kun i HttpServletten dette må foretages. |
Herunder ses inklusionen af NotificationBrokerService-bean'en fra først nævnte førnævnte konfigurationsklasse. Derudover kan @Value annotationen bruges til properties mm.
Code Block | ||||
---|---|---|---|---|
| ||||
@WebServlet("/*")
public class NotificationBrokerServlet extends HttpServlet {
...
@Value("${dgws.headers.required}")
private boolean dgwsHeadersRequired;
...
@Autowired
private NotificationBrokerService service;
... |
Derudover skal @Value annotationen bruges til properties (kan ligeledes ses i eksemplet ovenfor). Dette gælder både for servletten og i java-konfigurationsklasserne.
Info |
---|
DI.1.6 § I java-konfigurationsklasserne og servlet-klasserne skal @Value annotation bruges til at konfigurere værdier fra properties. |
Lifecycle Management
Opret og konfigurer en ApplicationContext ved hjælp af AnnotationConfigApplicationContext / AnnotationConfigWebApplicationContext. Det skal være en af disse to for at muliggøre brugen af konfigurationsklasserne.
Info |
---|
DI.1.6 7 § Der skal anvendes een af AnnotationConfigApplicationContext / AnnotationConfigWebApplicationContext som ApplicationContext-implementationsklasse. |
...
Brug ServletContextListener-interfaces til at initialisere og rydde op i ApplicationContext i komponenten. Ligeledes skal ApplicationContext lukkes korrekt, når webapplikationen stoppes.
Info |
---|
DI.1.7 8 § ApplicationContext'en skal oprettes og nedlægges ved hhv. contextInitialized og contextDestroyed på ServletContext'en. |
Her demonstrert demonstreret ved NotificationBrokerens implementation:
...
På servlettens init-metode skal ApplicationContext’en hentes (via ServletContexten) og herigennem skal den aktuelle Servlet have sine afhængigheder injected. Dette skal foregå ved kald til autowireBean, hvor Servlet-instansen gives med. Hermed foretages den sidste sammenkædning af ApplicationContext'en, der nu er konfigureret med java-konfigurationsklasserne og Servletten. Med andre ord sørger det for, at afhængigheder injiceres i servletten ved at benytte Spring's autowiring-mekanisme baseret på konfigurationen i ApplicationContext'en.
Info |
---|
DI.1.8 9 § Servletten skal autowires programatisk via ApplicationContext'en |
...
Code Block | ||||
---|---|---|---|---|
| ||||
@WebServlet("/*") public class NotificationBrokerServlet extends HttpServlet { ... @Override public void init() throws ServletException { Object o = getServletContext().getAttribute(NotificationBrokerServletContextListener.ANNOTATION_CONFIG_CONTEXT); if(o != null && o instanceof AnnotationConfigApplicationContext) { ((AnnotationConfigApplicationContext)o).getAutowireCapableBeanFactory().autowireBean(this); } } |
Bruger man derimod en JAX-WS genereret servlet kan denne autowiring ske ved brug af @PostConstruct annotationen, demonstreret ved eksemplet her fra FGVHR:
Code Block | ||||
---|---|---|---|---|
| ||||
public abstract class AbstractFgvhrWS { @Resource protected WebServiceContext context; @PostConstruct public void init() { ServletContext servletContext = (ServletContext) context.getMessageContext().get(MessageContext.SERVLET_CONTEXT); Object o = servletContext.getAttribute(ANNOTATION_CONFIG_CONTEXT); ((AnnotationConfigApplicationContext)o).getAutowireCapableBeanFactory().autowireBean(this); } |
I eksemplet her extender klasserne der implementerer de genererede JAX-WS klasser den abstrakte klasse.
Afsluttende
Samlet set udgør dokumentet her med eksempler en vejledning til hvordan DI i NSP's java-komponenter skal håndteres med brug af konfigurationsklasser, beans, autowiring og AnnotationConfigApplicationContext / AnnotationConfigWebApplicationContext.