@Override public void contextInitialized(ServletContextEvent sce) { try { AbstractRefreshableWebApplicationContext wac = (AbstractRefreshableWebApplicationContext) WebApplicationContextUtils .getWebApplicationContext(sce.getServletContext()); if (wac == null) { contextLoader = new ContextLoader(); createSpringApplicationContext(sce.getServletContext()); } else { WebApplicationContextHolder.set(wac); enhanceExistingSpringWebApplicationContext(sce, wac); } } catch (Exception t) { LOGGER.error("Exception occured", t); } }
private void enhanceExistingSpringWebApplicationContext(ServletContextEvent sce, WebApplicationContext wac) { LOGGER.info("Enhancing existing Spring application context..."); String cosmoContextLocation = sce.getServletContext().getInitParameter(CONTEXT_PARAM_NAME); @SuppressWarnings("resource") GenericXmlApplicationContext cosmoAppCtxt = new GenericXmlApplicationContext(); cosmoAppCtxt.setEnvironment((ConfigurableEnvironment) wac.getEnvironment()); cosmoAppCtxt.load(cosmoContextLocation); cosmoAppCtxt.refresh(); cosmoAppCtxt.start(); //make beans that are required from web components (as delegating filter proxy) accesible ((AbstractRefreshableWebApplicationContext)wac).getBeanFactory().setParentBeanFactory(cosmoAppCtxt.getBeanFactory()); LOGGER.info("Enhanced existing Spring application context started"); }
@Test public void xmlWebApplicationContext() { AbstractRefreshableWebApplicationContext ctx = new XmlWebApplicationContext(); ctx.setConfigLocation("classpath:" + XML_PATH); ctx.setEnvironment(prodWebEnv); ctx.refresh(); assertHasEnvironment(ctx, prodWebEnv); assertEnvironmentBeanRegistered(ctx); assertEnvironmentAwareInvoked(ctx, prodWebEnv); assertThat(ctx.containsBean(DEV_BEAN_NAME), is(false)); assertThat(ctx.containsBean(PROD_BEAN_NAME), is(true)); }
@Override protected void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) { SdcctServletConfig servletConfig = new SdcctServletConfig(); this.setServletConfig(servletConfig); beanFactory.registerSingleton(AbstractRefreshableWebApplicationContext.SERVLET_CONFIG_BEAN_NAME, servletConfig); beanFactory.ignoreDependencyInterface(ServletConfigAware.class); super.postProcessBeanFactory(beanFactory); }
@Override protected void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) { CrigttServletConfig servletConfig = new CrigttServletConfig(); this.setServletConfig(servletConfig); beanFactory.registerSingleton(AbstractRefreshableWebApplicationContext.SERVLET_CONFIG_BEAN_NAME, servletConfig); beanFactory.ignoreDependencyInterface(ServletConfigAware.class); super.postProcessBeanFactory(beanFactory); }
@Test public void registerServletParamPropertySources_AbstractRefreshableWebApplicationContext() { MockServletContext servletContext = new MockServletContext(); servletContext.addInitParameter("pCommon", "pCommonContextValue"); servletContext.addInitParameter("pContext1", "pContext1Value"); MockServletConfig servletConfig = new MockServletConfig(servletContext); servletConfig.addInitParameter("pCommon", "pCommonConfigValue"); servletConfig.addInitParameter("pConfig1", "pConfig1Value"); AbstractRefreshableWebApplicationContext ctx = new AnnotationConfigWebApplicationContext(); ctx.setConfigLocation(EnvironmentAwareBean.class.getName()); ctx.setServletConfig(servletConfig); ctx.refresh(); ConfigurableEnvironment environment = ctx.getEnvironment(); assertThat(environment, instanceOf(StandardServletEnvironment.class)); MutablePropertySources propertySources = environment.getPropertySources(); assertThat(propertySources.contains(StandardServletEnvironment.SERVLET_CONTEXT_PROPERTY_SOURCE_NAME), is(true)); assertThat(propertySources.contains(StandardServletEnvironment.SERVLET_CONFIG_PROPERTY_SOURCE_NAME), is(true)); // ServletConfig gets precedence assertThat(environment.getProperty("pCommon"), is("pCommonConfigValue")); assertThat(propertySources.precedenceOf(PropertySource.named(StandardServletEnvironment.SERVLET_CONFIG_PROPERTY_SOURCE_NAME)), lessThan(propertySources.precedenceOf(PropertySource.named(StandardServletEnvironment.SERVLET_CONTEXT_PROPERTY_SOURCE_NAME)))); // but all params are available assertThat(environment.getProperty("pContext1"), is("pContext1Value")); assertThat(environment.getProperty("pConfig1"), is("pConfig1Value")); // Servlet* PropertySources have precedence over System* PropertySources assertThat(propertySources.precedenceOf(PropertySource.named(StandardServletEnvironment.SERVLET_CONFIG_PROPERTY_SOURCE_NAME)), lessThan(propertySources.precedenceOf(PropertySource.named(StandardEnvironment.SYSTEM_PROPERTIES_PROPERTY_SOURCE_NAME)))); // Replace system properties with a mock property source for convenience MockPropertySource mockSystemProperties = new MockPropertySource(StandardEnvironment.SYSTEM_PROPERTIES_PROPERTY_SOURCE_NAME); mockSystemProperties.setProperty("pCommon", "pCommonSysPropsValue"); mockSystemProperties.setProperty("pSysProps1", "pSysProps1Value"); propertySources.replace(StandardEnvironment.SYSTEM_PROPERTIES_PROPERTY_SOURCE_NAME, mockSystemProperties); // assert that servletconfig params resolve with higher precedence than sysprops assertThat(environment.getProperty("pCommon"), is("pCommonConfigValue")); assertThat(environment.getProperty("pSysProps1"), is("pSysProps1Value")); }