2015-08-19 3 views
6

Будучи в .NET, я хорошо разбираюсь в поддержке того, что микро-веб-фреймворки, такие как NancyFX и Web API, предназначены для контейнеров IoC.Является ли Java Spark любой поддержкой для инъекций зависимостей или контейнеров IoC?

В аналогичных рамках Ruby, таких как Sinatra (NancyFX основан на Sinatra), похоже, что у вас есть возможность для инъекций зависимости.

Из того, что я вижу, поскольку Java-искровые приложения работают как основной метод, похоже, что вы не можете проходить в своих зависимостях или контейнерах IoC.

public class HelloWorld { 
    public static void main(String[] args) { 
     get("/hello", (req, res) -> "Hello World"); 
    } 
} 

Мне сложно понять, как такая структура может быть полезной, не поддерживая это.

Если этого не существует, есть ли еще одна облегченная структура (весна не легка из того, что я помню, но, может быть, все изменилось), которая поддерживает это?

+0

Spring * can * можно использовать как легкий DI путем настройки XML-компонентов и не использовать библиотеки вне ядра. Хотя я не использовал его лично, есть аннота [@Inject] (http://www.vogella.com/tutorials/DependencyInjection/article.html), если это похоже на что-то в вашем переулке. –

+1

Вы можете попробовать веб-страницу Pippo. Он имеет опору для пружины, поворота и сварки cdi –

ответ

0

В последнее время я работаю с Spark, и он не включает поставщика IoC из коробки, однако вы можете легко включить Spring или Guice ядро ​​, и это будет легкое решение.

Все, что вам нужно сделать, это добавить зависимость к Maven и начать использовать ее.

В качестве альтернативы вы можете посмотреть Ninja, который представляет собой полную структуру стека и включает в себя Guice, JPA/Hibernate из коробки.

8

Весна может быть просто интегрирована с Spark. например

public interface Spark { 

    /** 
    * adds filters, routes, exceptions, websockets and others 
    */ 
    void register(); 

} 

@Configuration 
public class SparkConfiguration { 

    @Autowired(required = false) 
    private List<Spark> sparks = new ArrayList<>(); 

    @Bean 
    CommandLineRunner sparkRunner() { 
     return args -> sparks.stream().forEach(spark -> spark.register()); 
    } 

} 

@Component 
public class HelloSpark implements Spark { 

    @Autowired 
    private HelloWorldService helloWorldService; 

    @Override 
    public void register() { 
     get("/hello", (request, response) -> helloWorldService.hello()); 
    } 

} 

Вы можете найти больше https://github.com/pmackowski/spring-boot-spark-java

2

Это довольно проста в использовании Guice с Java Спарк. В основном вам необходимо расширить SparkFilter следующим образом, чтобы создать форсунку Guice.

public class SparkGuiceFilter extends SparkFilter { 

    private Injector injector = null; 

    @Override 
    protected SparkApplication[] getApplications(final FilterConfig filterConfig) throws ServletException { 
     final SparkApplication[] applications = super.getApplications(filterConfig); 

     if (this.injector == null) { 
      this.injector = Guice.createInjector(new MainModule()); 
     } 

     if (applications != null && applications.length != 0) { 
      for (SparkApplication application : applications) { 
       this.injector.injectMembers(application); 
      } 
     } 

     return applications; 
    } 
} 

Затем вам нужно web.xml и должны запустить приложение Спарк как обычный war приложения с использованием Jetty или любой другой контейнер сервлетов:

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" 
     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 
     version="3.0"> 

    <filter> 
     <filter-name>SparkGuiceFilter</filter-name> 
     <filter-class>com.devng.spark.guice.SparkGuiceFilter</filter-class> 
     <init-param> 
      <param-name>applicationClass</param-name> 
      <param-value>com.devng.spark.SparkApp</param-value> 
     </init-param> 
    </filter> 
    <filter-mapping> 
     <filter-name>SparkGuiceFilter</filter-name> 
     <url-pattern>/*</url-pattern> 
    </filter-mapping> 
</web-app> 

Однако, есть некоторые ограничения, связанные с этим подходом. Вы не можете использовать области запроса или сеанса связи с Guice. Если вам это не нужно, тогда вам хорошо идти, иначе вам нужно интегрировать расширения Guice Servlet и добавить GuiceFilter в ваш web.xml, как описано в the official Guice documentation. Вам также необходимо убедиться, что вы используете тот же экземпляр инжектора в GuiceFilter и SparkGuiceFilter, чтобы сделать это, чтобы определить GuiceServletContextListener в вашем web.xml, как описано here.

Вы можете найти полностью рабочий пример в моем GitHub здесь https://github.com/devng/demo/tree/master/sparkjava-guice

1

Я на самом деле, экспериментируя с искрой и Guice и насколько я могу видеть, используя зависимость инъекций с использованием как очень просто, по крайней мере, из сегодня (август 2017 года).

Все, что вам нужно сделать, это следующее:

public class MySparkApplication { 

    public static void main(String[] args) { 

     Injector injector = Guice.createInjector(); 
     SomeClass someClass = injector.getInstance(SomeClass.class); 

     get("/hello", (req, res) -> someClass.getSomeString()); 
    } 
} 

Это на самом деле, кажется, так просто. Я просто следовал руководству Guice Getting Started, и он работает. Когда я запускаю Spark и открываю http://localhost:4567 в своем браузере, отображается строка, возвращаемая из моего метода.

0

Работаю самостоятельно IoC with Guice. Он работает найти с не много кода;) Ссылки:https://github.com/Romain-P/SparkJava-JFast

Нет модуля Guice по умолчанию требуется, автоматическое обнаружение связывания объектов обнаружены.

public class Main { 
    public static void main(String[] args) { 
     /* give a class as argument for package scanning from its path recursively */ 
     Injector injector = SparkApplication.init(Application.class); 
     injector.getInstance(Application.class).initialize(); 
    } 
} 

@Binding 
public class Application { 
    @Inject Service http; 
    @Inject HelloController helloController; 

    public void initialize() { 
     http.port(8080); 
     http.get("/hello", (req, res) -> helloController.hello()); 
    } 
} 

@Binding 
public class HelloController { 
    @Inject HelloService service; 

    public Object hello() { 
     //business logic 
     return service.hello(); 
    } 
} 

@Binding 
@Slf4j 
public class HelloService { 
    public Object hello() { 
     log.info("hello"); 
     return new Object(); 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^