2015-08-19 8 views
6

Nachdem ich in .NET war, bin ich sehr versiert in der Unterstützung, die Micro-Web-Frameworks wie NancyFX und Web-API für IoC-Container haben.Bietet Java Spark Unterstützung für Abhängigkeitsinjektion oder IoC-Container?

In ähnlichen Frameworks in Ruby wie Sinatra (NancyFX basiert auf Sinatra) scheint es, als ob Sie die Fähigkeit zur Abhängigkeitsinjektion haben.

Von was ich sehe, weil Java-Spark-Anwendungen als Hauptmethode ausgeführt werden, scheint es nicht so, als könnten Sie Ihre Abhängigkeiten oder IoC-Container übergeben.

Ich habe eine harte Zeit zu verstehen, wie ein solches Framework nützlich sein könnte, ohne dies zu unterstützen.

Wenn dieses Framework nicht, gibt es ein anderes leichtgewichtiges Framework (Spring ist nicht leicht von dem, woran ich mich erinnere, aber vielleicht haben sich die Dinge geändert), die dies unterstützt?

+0

Spring * kann als Lightweight-DI verwendet werden, indem die XML-Beans konfiguriert werden und keine Bibliotheken außerhalb des Kerns verwendet werden. Obwohl ich es nicht persönlich verwendet habe, gibt es die Annotation [@Inject] (http://www.vogella.com/tutorials/DependencyInjection/article.html), falls das wie etwas auf der Straße aussieht. –

+1

Sie können Pippo Webframework versuchen. Es hat Unterstützung für Frühling, Guice und Schweißen cdi –

Antwort

0

Ich habe in letzter Zeit mit Spark gearbeitet, und es enthält nicht einen IoC-Anbieter out of the Box, aber Sie könnten leicht Spring oder Guice Kern, und das wäre eine leichte Lösung.

Alles, was Sie tun müssen, ist, die Abhängigkeit zu Maven hinzuzufügen und es zu benutzen.

Als Alternative würden Sie Ninja betrachten, die ein Full-Stack-Framework ist und Guice, JPA/Hibernate out-of-the-Box enthält.

8

Feder kann einfach in Spark integriert werden. z.B.

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()); 
    } 

} 

Mehr erfahren Sie finden auf https://github.com/pmackowski/spring-boot-spark-java

2

Es ist ganz einfach Guice mit Java Funken zu verwenden. Grundsätzlich müssen Sie die SparkFilter auf folgende Weise erweitern, um den Guice Injektor zu erstellen.

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; 
    } 
} 

Dann brauchen Sie einen web.xml und haben Ihre Spark-Anwendung als eine normale war Anwendung mit Jetty oder andere Servlet-Container auszuführen:

<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> 

Allerdings gibt es einige Einschränkungen mit diesem Ansatz. Sie können keine anforderungsbasierten oder Sitzungsbereiche mit Guice verwenden. Wenn Sie das nicht benötigen, dann können Sie Guice Servlet Extensions integrieren und das GuiceFilter in Ihrem web.xml wie in the official Guice documentation beschrieben hinzufügen. Sie müssen auch sicherstellen, dass Sie die gleiche Injektorinstanz in GuiceFilter und die SparkGuiceFilter verwenden, damit Sie eine GuiceServletContextListener in Ihrem web.xml wie beschrieben here definieren können.

Sie hier ein voll funktionsfähiges Beispiel in meinem GitHub finden https://github.com/devng/demo/tree/master/sparkjava-guice

1

experimentiere ich tatsächlich mit Funken und Guice und soweit ich sehen kann, Dependency Injection mit beiden ist sehr einfach, zumindest ab heute (August 2017).

Alles, was Sie tun müssen, ist die folgende:

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()); 
    } 
} 

Es scheint tatsächlich so einfach wie das zu sein. Ich folgte nur dem Guice Getting Started Führer und es funktioniert. Wenn ich Spark starte und http://localhost:4567 in meinem Browser öffne, wird der String angezeigt, der von meiner Methode zurückgegeben wird.

0

Eigenständig arbeiten IoC with Guice. Es arbeitet mit nicht viel Code finden;) -Link:https://github.com/Romain-P/SparkJava-JFast

Kein guice Modul standardmäßig erforderlich, die automatische Erkennung Bindungs ​​Objekte erkannt werden.

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(); 
    } 
} 
Verwandte Themen