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

Compare with Current View Page History

« Previous Version 2 Next »

Til Dependency Injection i NSP's komponenter benyttes spring frameworket.


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 toppicMappingDao, Publisher publisher, AuditBuilderFactory auditBuilderFactory) {
		return new NotificationBrokerServiceImpl(toppicMappingDao, 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.

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

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