You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 7 Next »

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.

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 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. 

DI.1.2 § Der skal benyttes java-konfigurationsklasser annoteret med @Configuration. Disse skal være logisk opdelt og navngivet

Herunder eksmpel på en konfigurationsklasse fra NAS projektet.

Configuration
@Configuration
@PropertySource("classpath:notificationbroker.properties")
public class NotificationBrokerSetup {

	public static final String SERVICE_NAME = "notificationbroker";

	private static final Properties properties = Config.load(SERVICE_NAME);

	@Bean
	public Properties properties() {
		return properties;
	}


	@Bean
	public NotificationBrokerService notificationBrokerService(TopicMappingDAO topicMappingDao, Publisher publisher, AuditBuilderFactory auditBuilderFactory) {
		return new NotificationBrokerServiceImpl(topicMappingDao, publisher, auditBuilderFactory);
	}
...


@Bean-metoder:
Brug @Bean-metoder i konfigurationsklasserne til at definere Spring-beans.
Navngiv metoder og beans fornuftigt, så det er nemt at forstå, hvilken rolle de spiller i applikationen (DAO, WsdlResponseGenerator, StatusResponseGenerator mm.) - i eksmplet fra NAS ovenfor Properties og notificationBrokerService.


Ved flere klasser samles de ved brug af @Import i en enkelt klasse. Her samler NotificationBrokerServerSetup således konfigurationsklassen ovenfor og bla. en Database-konfigurationsklasse.

Import
@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;
	}
...

Afhængigheder og injection:
Brug @Autowired for at injecte afhængigheder i HttpServletten. Herunder ses inklusionen af NotificationBrokerService-bean'en fra først nævnte konfigurationsklasse. Derudover kan @Value annotationen bruges til properties mm.

Autowired & Value
@WebServlet("/*")
public class NotificationBrokerServlet extends HttpServlet {

...
	@Value("${dgws.headers.required}")
	private boolean dgwsHeadersRequired;

...

    @Autowired
	private NotificationBrokerService service;

...

ApplicationContext:
Opret og konfigurer en ApplicationContext ved hjælp af AnnotationConfigApplicationContext.
Denne skal konfigureres med de konfigurationsklasser der er relevante
Gem ApplicationContext i ServletContext for at gøre det tilgængeligt for resten af applikationen.


Lifecycle Management:
Brug ServletContextListener-interfaces til at initialisere og rydde op i ApplicationContext i komponenten. Sørg for, at ApplicationContext lukkes korrekt, når webapplikationen stoppes.


Injection i servlets:
På servlettens init-metode skal AnnotationConfigApplicationContext’en hentes (via ServletContexten) og herigennem skal den aktuelle Servlet have sine afhængigheder injected. Dette skal foregå ved kald til autowireBean og give Servlet-instansen med.


  • No labels