Skip to content

Spring Dependency Injection

Joe Betz edited this page Aug 28, 2013 · 14 revisions

To bind rest.li’s dependency injection to spring.


package com.linkedin.restli.server.spring;

import java.util.Map;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;

import com.linkedin.restli.internal.server.model.ResourceModel;
import com.linkedin.restli.server.resources.ResourceFactory;

/**
 * This is Spring specific {@link ResourceProvider}, which injects dependencies
 * to the resource classes, which are expressed using JSR-330 annotations.
 * This class delegates calls to the more general InjectResourceProvider, which
 * is declared in {@link com.linkedin.restli.server.resources.InjectResourceFactory}.
 * This class initialization order which occurs in Spring: first, when this class is
 * instantiated by Spring, {@link #setApplicationContext(ApplicationContext)} method is
 * invoked, later RestLi invokes {@link #setRootResources(Map)} method, which concludes
 * initialization process.
 *
 * @author jodzga
 */
public class InjectResourceFactory implements ResourceFactory, ApplicationContextAware
{
  private static final Logger log = LoggerFactory.getLogger(InjectResourceFactory.class);

  private com.linkedin.restli.server.resources.InjectResourceFactory _delegate;

  @Override
  public <R> R create(Class<R> resourceClass)
  {
    return _delegate.create(resourceClass);
  }

  @Override
  public void setApplicationContext(ApplicationContext ctx) throws BeansException
  {
    log.debug(String.format("Setting application context '%s'", ctx.getDisplayName()));
    _delegate = new com.linkedin.restli.server.resources.InjectResourceFactory(new SpringBeanProvider(ctx));
  }

  /**
   * @see com.linkedin.restli.server.spring.LinkedInSpringResourceFactory#setRootResources(java.util.Map)
   */
  @Override
  public void setRootResources(Map<String, ResourceModel> rootResources)
  {
    _delegate.setRootResources(rootResources);
  }

}

Clone this wiki locally