You could also use Spring AOP and Configurable annotation. I think that's the best solution if you can use load time weaver on your application server.
Here is an example I referenced earlier. It works only with reference impl.
Code:
package test;
import javax.faces.context.FacesContext;
import javax.servlet.ServletContext;
import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;
import com.sun.faces.spi.InjectionProvider;
import com.sun.faces.spi.InjectionProviderException;
import com.sun.faces.vendor.WebContainerInjectionProvider;
public class SpringInjectionProvider implements InjectionProvider {
private static final WebContainerInjectionProvider con = new WebContainerInjectionProvider();
public void inject(Object managedBean) throws InjectionProviderException {
con.inject(managedBean);
}
public void invokePostConstruct(Object managedBean)
throws InjectionProviderException {
ServletContext context = (ServletContext)FacesContext.getCurrentInstance().getExternalContext().getContext();
WebApplicationContext wCtx = WebApplicationContextUtils.getWebApplicationContext(context);
if(wCtx != null) {
try {
wCtx.getAutowireCapableBeanFactory().autowireBeanProperties(managedBean, AutowireCapableBeanFactory.AUTOWIRE_AUTODETECT, false);
} catch(Exception ex) {
ex.printStackTrace();
}
}
con.invokePostConstruct(managedBean);
}
public void invokePreDestroy(Object managedBean) throws InjectionProviderException {
con.invokePreDestroy(managedBean);
}
}