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

Compare with Current View Page History

« Previous Version 5 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.

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. 

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