-
-
Notifications
You must be signed in to change notification settings - Fork 749
Configuring Atmosphere's Classes Creation and Injection
Starting with Atmosphere 2.1, it is possible to configure an AtmosphereObjectFactory for dependencies injection and class creation. You can define your own and pass it to the framework by defining an init-param:
<init-param>
<param-name>org.atmosphere.cpr.objectFactory</param-name>
<param-value> << an implementation of AtmosphereObjectFactory >> </param-value>
</init-param>
By default, Atmosphere doesn't support Injection, but you can enable one of the following supported framework by just dropping the artifact in your application.
For CDI, Atmosphere will use the following code for injecting/creating object:
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();
}
}
}
You can install it by adding in your pom.xml:
<dependency>
<groupId>org.atmosphere</groupId>
<artifactId>atmosphere-cdi</artifactId>
<version>2.1.0</version>
</dependency>
Atmosphere will auto-detect it and use it automatically.
For Spring, Atmosphere will use the following code for injecting/creating object:
public class SpringObjectFactory implements AtmosphereObjectFactory {
@Override
public <T> T newClassInstance(AtmosphereFramework framework, Class<T> tClass) throws InstantiationException, IllegalAccessException {
ApplicationContext context =
new AnnotationConfigApplicationContext(classToInstantiate);
T t = context.getBean(classToInstantiate);
if (t == null) {
logger.info("Unable to find {}. Creating the object directly.", classToInstantiate.getName());
return classToInstantiate.newInstance();
}
return t;
}
}
You can install it by adding in your pom.xml:
<dependency>
<groupId>org.atmosphere</groupId>
<artifactId>atmosphere-spring</artifactId>
<version>2.1.0</version>
</dependency>
For Guice, Atmosphere will use the following code for injecting/creating object:
public class GuiceObjectFactory implements AtmosphereObjectFactory {
private static final Logger logger = LoggerFactory.getLogger(GuiceObjectFactory.class);
private static Injector injector;
static {
injector = Guice.createInjector(new AbstractModule() {
@Override
protected void configure() {
}
});
}
@Override
public <T> T newClassInstance(AtmosphereFramework framework, Class<T> classToInstantiate) throws InstantiationException, IllegalAccessException {
com.google.inject.Injector servletInjector = (com.google.inject.Injector)
framework.getServletContext().getAttribute(com.google.inject.Injector.class.getName());
if (servletInjector != null) {
injector = servletInjector;
}
if (injector == null) {
logger.warn("No Guice Injector found in current ServletContext. Are you using {}", AtmosphereGuiceServlet.class.getName());
logger.trace("Unable to find {}. Creating the object directly.", classToInstantiate.getName());
return classToInstantiate.newInstance();
}
return injector.getInstance(classToInstantiate);
}
}
You can install it by adding in your pom.xml:
<dependency>
<groupId>org.atmosphere</groupId>
<artifactId>atmosphere-guice</artifactId>
<version>2.1.0</version>
</dependency>
- Understanding Atmosphere
- Understanding @ManagedService
- Using javax.inject.Inject and javax.inject.PostConstruct annotation
- Understanding Atmosphere's Annotation
- Understanding AtmosphereResource
- Understanding AtmosphereHandler
- Understanding WebSocketHandler
- Understanding Broadcaster
- Understanding BroadcasterCache
- Understanding Meteor
- Understanding BroadcastFilter
- Understanding Atmosphere's Events Listeners
- Understanding AtmosphereInterceptor
- Configuring Atmosphere for Performance
- Understanding JavaScript functions
- Understanding AtmosphereResourceSession
- Improving Performance by using the PoolableBroadcasterFactory
- Using Atmosphere Jersey API
- Using Meteor API
- Using AtmosphereHandler API
- Using Socket.IO
- Using GWT
- Writing HTML5 Server-Sent Events
- Using STOMP protocol
- Streaming WebSocket messages
- Configuring Atmosphere's Classes Creation and Injection
- Using AtmosphereInterceptor to customize Atmosphere Framework
- Writing WebSocket sub protocol
- Configuring Atmosphere for the Cloud
- Injecting Atmosphere's Components in Jersey
- Sharing connection between Browser's windows and tabs
- Understanding AtmosphereResourceSession
- Manage installed services
- Server Side: javadoc API
- Server Side: atmosphere.xml and web.xml configuration
- Client Side: atmosphere.js API