Lifecycle
Při refreshi CPS se uzavírají kontexty (metoda close()) všech aplikačních kontextů stromu a z paměti by se měly instance kontextů časem odstranit. Pro novou instanci CPS vzniká nový root kontext a nové podřízené kontexty všech modulů. Tím pádem je zajištěn skutečně čistý start všech modulů z bodu nula.
Springové moduly musí implementovat rozhranní com.fg.webapp.cps.v1.modules.spring.CpsSpringModule,
respektive velmi doporučuji vyjít z předimplementované abstraktní třídy
com.fg.webapp.cps.v1.modules.spring.CpsSpringModuleAbstract,
která obsahuje následující metody:
- getOverridableConfigLocations - touto metodou modul specifikuje seznam XML souborů, jejichž načtením se má vytvořit aplikační kontext modulu
- getJavaConfig - touto metodou modul specifikuje seznam Java konfiguračních souborů, jejichž načtením se má vytvořit aplikační kontext modulu
Modul může kombinovat XML a Java konfiguraci. Konfiguraci v Java třídách je možné přetížit / modifikovat pouze jinými Java třídami. XML konfigurace lze přetěžovat na úrovni sitemap.xml přes tzv. přetížení konfigurace.
Abstraktní předek má taktéž následující callback metody životního cyklu:
- parseModuleConfiguration - metoda je volána na začátku inicializace modulu a jejím cílem je rozparsování XML konfigurace modulu a vrácení POJO instance, která obsahuje úplnou "uživatelskou" konfiguraci modulu
- setupModuleBeforeSpringInitialization - metoda je volána ještě před vlastním vytvořením aplikačního kontextu (voláním getConfigLocations) - v této metodě doporučuji parsovat XML konfiguraci modulu ze sitemap.xml
- setupModuleContextBeforeRefresh - metoda je volána ve chvíli, kdy je již vytvoření aplikační kontext, pro který však ještě neproběhl REFRESH (tj. vytvoření instancí bean)
- setupModuleAfterSpringInitialization - metoda je volána po kompletní inicializaci Spring kontextu včetně provedení úspěšného refreshe aplikačního kontextu
- destroyModuleBeforeSpringDestruction - metoda je volána v destrukční fázi před vlastním uzavřením aplikačního kontextu
- destroyModuleAfterSpringDestruction - metoda je volána v destrukční fázi po uzavřen aplikačního kontextu
- metody podporující lokalizaci modulu - getDefaultModuleMessageSources, getDefaultModuleMessageSourcesEncoding, getReloadableResourceBundleMessageSource (viz. kapitola Podpora lokalizace)
- metody umožňující přístup k základním objektům - getApplicationEventMulticasterClass, getEventMulticaster, getModuleContext, getMessageSource
Konfigurační soubory
Konfigurační soubory v XML umožňují přetížení na úrovni sitemap.xml i když se toto příliš nedoporučuje:
Ukázka:
public class MyModule extends CpsSpringModuleAbstract { protected SpringConfigurationItem[] getOverridableConfigLocations() { return new SpringConfigurationItem[] { new SpringConfigurationItem("core", "classpath:/META-INF/myModule/spring/core.xml"), new SpringConfigurationItem("autoupdate", "classpath:/META-INF/myModule/spring/autoupdate.xml") }; } } Konfigurace pomocí anotací
Konfigurační soubory je možné také deklarovat pomocí anotace
com.fg.webapp.cps.v1.modules.spring.annotation.SpringConfiguration.
Anotace umožňuje i deklarativní podmínečné použití daných konfiguračních souborů.
Ukázka:
@SpringConfiguration({ @SpringConfigurationItem(id = "core", resource = "classpath:/META-INF/myModule/spring/core.xml"), @SpringConfigurationItem(id = "skipped", resource = "classpath:/META-INF/myModule/spring/skipped.xml", condition = "configuration.false == true"), @SpringConfigurationItem(id = "empty", resource = "classpath:/META-INF/myModule/spring/autoupdate.xml")})public class MyModule extends CpsSpringModuleAbstract { protected SpringConfigurationItem[] getOverridableConfigLocations() { return new SpringConfigurationItem[] { new SpringConfigurationItem("core", "classpath:/META-INF/myModule/spring/core.xml"), new SpringConfigurationItem("autoupdate", "classpath:/META-INF/myModule/spring/autoupdate.xml") }; } } Java konfigurace
Pro konfiguraci Spring modulů je možné používat i Java konfiguraci.
Postačuje k tomu v metodě getJavaConfig vrátit sadu tříd, které jsou označeny anotaci @Configuration. Anotace
@Configuration může být umístěna i přímo na třídě modulu.
Ukázka:
public class MyModule extends CpsSpringModuleAbstract { public Class[] getJavaConfig() { return new Class[] { MyModuleConfiguration.class, AnotherModuleConfiguration.class }; } }Ukázka druhého přístupu:
@Configuration@Import({com.fg.module.AnotherConfiguration})public class MyModule extends CpsSpringModuleAbstract { @Bean public MyService getMyService() { return new MyService(); } }