Skip to content

Configuring Atmosphere's Classes Creation and Injection

Jeanfrancois Arcand edited this page Oct 3, 2013 · 21 revisions

Starting with Atmosphere 2.1, it is possible to configure a AtmosphereObjectFactory and configure Atmosphere to use it. All you need to do is to define an init-param:

<init-param>
  <param-name>org.atmosphere.cpr.objectFactory</param-name>
  <param-value> << an implementation of AtmosphereObjectFactory >> </param-value>
</init-param>

Foe example, using CDI

public class CDIObjectFactory implements AtmosphereObjectFactory {
    @Override
    @SuppressWarnings("unchecked")
    public <T> T newClassInstance(AtmosphereFramework framework, Class<T> classToInstantiate) throws InstantiationException, IllegalAccessException {
        CreationalContext cc = null;

        final BeanManager bm;
        try {
            bm = (BeanManager) new InitialContext().lookup("java:comp/BeanManager");
            final Iterator<Bean<?>> i = bm.getBeans(classToInstantiate).iterator();
            if (!i.hasNext()) {
                return classToInstantiate.newInstance();
            }
            Bean<T> bean = (Bean<T>) i.next();
            CreationalContext<T> ctx = bm.createCreationalContext(bean);
            T dao = (T) bm.getReference(bean, classToInstantiate, ctx);
            return dao;
        } catch (Exception e) {
            // Log ME. Fallback to normal.
            return classToInstantiate.newInstance();
        } finally {
            if (cc != null) cc.release();
        }
    }
}

For Spring, you can define:

public class SpringObjectFactory implements AtmosphereObjectFactory {

    @Override
    public <T> T newClassInstance(AtmosphereFramework framework, Class<T> tClass) throws InstantiationException, IllegalAccessException {
        return WebApplicationContextUtils.getWebApplicationContext(framework.getServletContext()).getBean(tClass);
    }
}

For Guice, you can do:

public class GuiceObjectFactory implements AtmosphereObjectFactory {
    @Override
    public <T> T newClassInstance(AtmosphereFramework framework, Class<T> tClass) throws InstantiationException, IllegalAccessException {
        com.google.inject.Injector injector = (com.google.inject.Injector)
                framework.getServletContext().getAttribute(com.google.inject.Injector.class.getName());
        if (injector == null)
            throw new IllegalStateException("No Guice Injector found in current ServletContext !");
        return injector.getInstance(tClass);
    }
}

The Atmosphere's extension project contains both Guice and Spring integration as explained above and can be adding the atmosphere-spring/guice dependency.

Step by Step Tutorials

Concepts & Architecture

15 Minutes Tutorial

Advanced Topics

API

Known WebServer Issues

References

External Documentations

githalytics.com alpha

Clone this wiki locally