As I am using JSF with Spring, the beans managed by Spring are not accessible in my page, I used this Siegfried Bolz’s blog as a basis and used the facade pattern to hide access to the context.
The Spring context is loaded when the application starts using ContextLoaderListener in the apllication web.xml:
<listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener>
We need the following dependency:
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>4.0.0.RELEASE</version> </dependency>
Define the object which will reference the Spring context:
package net.classnotfound.spring.context; import org.springframework.context.ApplicationContext; public class AppContext { private static ApplicationContext ctx; /** * Injected from the class "ApplicationContextProvider" which is automatically * loaded during Spring-Initialization. */ public static void setApplicationContext(ApplicationContext applicationContext) { ctx = applicationContext; } /** * Get access to the Spring ApplicationContext from everywhere in your Application. * * @return */ public static ApplicationContext getApplicationContext() { return ctx; } }
Now, define the object that give you access to it:
package net.classnotfound.spring.context; import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; /** * This class provides an application-wide access to the * Spring ApplicationContext! The ApplicationContext is * injected in a static method of the class "AppContext". * * Use AppContext.getApplicationContext() to get access * to all Spring Beans. * * @author Siegfried Bolz * */ public class ApplicationContextProvider implements ApplicationContextAware { @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { AppContext.setApplicationContext(applicationContext); } }
And now this is the facade object which gives access to the Spring beans:
package net.classnotfound.spring.context; import org.springframework.context.ApplicationContext; public class ServiceFacade { private static ServiceFacade instance = new ServiceFacade(); private static ApplicationContext applicationContext; private ServiceFacade() { applicationContext = AppContext.getApplicationContext(); } public static ServiceFacade getInstance() { return instance; } //Add here the method to get the different services available // in the Spring Context public SpringBean getMyBean() { return (SpringBean) applicationContext.getBean("myBean"); } }
Don’t forget to ask Spring to create the bean:
<bean id="contextApplicationContextProvider" class="net.classnotfound.spring.context.ApplicationContextProvider"/>
To use it:
SpringBean bean = ServiceFacade.getInstance().getMyBean();
Done!