Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

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 bør 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. 

...

Info

DI.1.4 § Skal flere klasser samles logisk bruges @Import i en samlende java-klasse

Her Eksempelvis samler NotificationBrokerServerSetup således konfigurationsklassen ovenfor og bla. en Database-konfigurationsklasse.

Code Block
languagejava
titleImport
@Configuration
@Import({ NotificationBrokerSetup.class, PublisherSetup.class, DatabaseSetup.class })
public class NotificationBrokerServerSetup {

	@Bean
	public DataSource primaryDataSource(@Value("${datasource.jndi}") String jndiName) {
		JndiDataSourceLookup dataSourceLookup = new JndiDataSourceLookup();
		DataSource dataSource = dataSourceLookup.getDataSource(jndiName);
		return dataSource;
	}
...

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 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
languagejava
titleAutowired & Value
@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
languagejava
titleInitialisering af autowiring
@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
languagejava
titleInitialisering af autowiring
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.