2016-02-25 19 views
8

Sono confuso da this section della documentazione di primavera.Contesto di primavera come dipendenza di runtime

Ad esempio, per creare un contesto di applicazione e utilizzare l'iniezione di dipendenza per configurare un'applicazione, le dipendenze Maven sarà simile a questo:

<dependencies> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-context</artifactId> 
     <version>4.2.5.RELEASE</version> 
     <scope>runtime</scope> 
    </dependency> 
</dependencies> 

Nota la portata può essere dichiarato come runtime se si don' È necessario compilare le API Spring, che è in genere il caso per i casi di utilizzo dell'iniezione di dipendenza di base.

Conosco JSR 330 (annotazioni DI). Ma come si disfa dalla classe ApplicationContext? E se lo si disaccoppia perché allora dipende ancora dalla primavera?

Come, ad esempio, è possibile riscrivere spring-context come dipendenza di runtime? O quale sarebbe il "caso d'uso dell'iniezione di dipendenza di base"?

risposta

4

Penso che il "caso dell'uso di base" si riferisca a contesti applicativi basati su XML. Tale documentazione dice che se non si utilizzano direttamente le librerie Spring nel proprio codice, non sarà necessario includere tali librerie nel percorso di classe della compilation. Questo è il caso delle configurazioni XML, dato che tutto ciò che riguarda Spring è configurato in XML e quindi non è compilato.

All'avvio rapido collegato, l'autore utilizza la configurazione del contesto dell'applicazione basata sull'annotazione, che richiede l'inclusione delle librerie Spring sia in fase di compilazione che in fase di esecuzione.

Esempio di configurazione XML: http://www.springbyexample.org/examples/intro-to-ioc-creating-a-spring-application.html

ci dovrebbe essere solo un paio di punti chiave in cui il codice dell'applicazione deve accedere direttamente al contenitore CIO [...]. Se si sta sviluppando un'applicazione Web, potrebbe non essere necessario accedere direttamente al contenitore IoC poiché gestirà automaticamente l'istanza del controller e tutti i bean necessari.

Non mi è completamente familiare, ma sembra anche che si possa usare JSR330 come suggerito con una configurazione XML per rendere automatici i bean usando le annotazioni. Vedere here. Ciò consentirebbe l'uso di annotazioni, ma senza la necessità di includere Spring nelle configurazioni in fase di compilazione.

-1

È possibile implementare i bean con una dipendenza su javax.inject (@Named, @Inject) in un bundle separato. Saranno utilizzabili dal progetto basato sulla primavera o da qualsiasi altro contenitore che abbia la propria implementazione DI.

Ecco campione di componenti a base di primavera rielaborazione di javax.inject (senza progetto scissione a diversi fasci) http://www.mkyong.com/spring3/spring-3-and-jsr-330-inject-and-named-example/

-1

Se ho capito bene si sono fondamentalmente chiedendo come l'iniettore dipendenza viene inizializzato e come si può iniettare il dipendenze nelle tue classi. Nell'esempio di avvio rapido fornito il contesto dell'applicazione viene creato manualmente nella classe principale.

ApplicationContext context = 
     new AnnotationConfigApplicationContext(Application.class); 

Secondo il contesto applicativo standalone documentation

, accettando classi annotate come input - in classi configurazione annotata particolare @, ma anche strisciamento tipi @Component e JSR-330 classi compatibili con javax.inject annotazioni. Consente di registrare le classi uno a uno utilizzando registro (classe ...), così come per la scansione classpath utilizzando scansione (String ...)

Un modo alternativo per inizializzare la primavera è all'interno del vostro web.xml, dove si utilizza lo ContextLoaderListner che eseguirà il bootstrap del contesto dell'applicazione Spring per l'utente all'avvio dei programmi.

La domanda su come avviare la primavera in web.xml è già stata risolta here.

3

Prima di tutto, parliamo di DI.

Nota del Spring Doc,

gestione delle dipendenze e l'iniezione di dipendenza sono cose diverse.

  • La gestione delle dipendenze è "assemblare tutte le librerie necessarie (file JAR) e farli sul vostro percorso di classe in fase di esecuzione, e, eventualmente, al momento della compilazione".
  • L'iniezione di dipendenza è, supponiamo che tu voglia un oggetto Service nella classe, invece di crearlo usando service = new Service();, lasci che il framework di primavera gestisca il ciclo di vita di quel bean.

esempio di gestione Dipendenza:

<dependencies> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-context</artifactId> 
     <version>4.2.5.RELEASE</version> 
    </dependency> 
</dependencies> 

Per avere tutti questi file jar nel progetto.

spring-context-4.2.5.RELEASE.jar 
spring-aop-4.2.5.RELEASE.jar 
spring-beans-4.2.5.RELEASE.jar 
spring-core-4.2.5.RELEASE.jar 

Esempio di Dependency Injection:

Nel vostro quick-start esempio, si inietta MessageService in MessagePrinter utilizzando iniezione costruttore. Non hai creato uno MessageService ovunque. Il contenitore Spring lo crea per te.

@Component 
public class MessagePrinter { 
    final private MessageService service; 
    @Autowired 
    public MessagePrinter(MessageService service) { 
     this.service = service; 
    } 
    public void printMessage() { 
     System.out.println(this.service.getMessage()); 
    } 
} 

@Configuration 
@ComponentScan 
public class Application { 
    @Bean 
    MessageService mockMessageService() { 
     return new MessageService() { 
      public String getMessage() { 
       return "Hello World!"; 
      } 
     }; 
    } 
    ... 
} 

Ora parliamo di transitive dependency and run-time dependency.

transitiva dipendenza

Significa scoprire le librerie che le proprie dipendenze richiedono e tra di loro automaticamente.
Ad esempio, se sono state specificate le dipendenze A e B in pom.xml. E A dipende da C, D. B dipende da E. Non è necessario includere C, D, E nella configurazione. A causa della dipendenza transitiva, C, D, E saranno inclusi automaticamente.

dipendenza runtime

Si tratta di un tipo di oscilloscopi dipendenza per limitare la dipendenza transitiva.

"di tale scopo indica che la dipendenza non è richiesto per compilazione, ma è per l'esecuzione. È nel runtime e prova percorsi di classe, ma non il percorso di classe di compilazione."

Ora la domanda è: esiste un caso che per DI "non è necessario compilare contro Primavera API", invece è possibile impostare il campo di applicazione runtime? Domanda simile here.

Sì, un esempio che posso pensare è l'applicazione web. Supponiamo che io stia usando Strtuts con il plugin Spring.(sotto l'esempio viene da "Struts 2 in Action" di Manning)

Voglio dire a Spring di creare un'istanza della classe Login da utilizzare come oggetto azione per la richiesta.

aggiungere un listener primavera contesto web per web.xml

<listener> 
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
</listener> 

definire un fagiolo Login chiamato come springManagedLoginAction in applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"> 
    <bean id="portfolioService" class="manning.chapterNine.utils.PortfolioServiceJPAImpl"/> 
    <bean id="springManagedLoginAction" class="manning.chapterNine.Login" scope="prototype"> 
     <property name="portfolioService" ref="portfolioService"/> 
    </bean> 
</beans> 

uso questo fagiolo nella classe azione struts-config-login.xml

<action name="Login" class="springManagedLoginAction"> 
    <result type="redirectAction"> 
     <param name="actionName">AdminPortfolio</param> 
     <param name="namespace">/chapterEight/secure</param> 
    </result> 
    <result name="input">/chapterEight/Login.jsp</result> 
</action> 
+0

'; tldr' Spazzatura legacy. La configurazione XML crea dipendenza implicita dalla primavera. 'ApplicationContext' può essere istanziato dall'ambiente di esecuzione a molla. – user2418306

0

Non sono sicuro di aver capito correttamente la tua domanda, ma mi sembra che tu stia chiedendo perché devi avere una dipendenza dal contesto di primavera se stai usando le annotazioni JSR-330.

Bene, la risposta dal mio punto di vista è che in realtà non hai bisogno della dipendenza da Spring se stai usando solo annotazioni JSR-330 ma per farli funzionare, hai bisogno di una libreria che li capisca e che sia correttamente crea il grafico delle dipendenze per te e spring-context è una di queste librerie.

Il motivo per cui si tratta di una dipendenza di runtime è perché è possibile passare questo provider in fase di runtime, almeno in teoria.

+0

Ho già menzionato più volte le mie preoccupazioni sull'assenza di dipendenza dall'implementazione concreta di JSR-330. Sono felice che il tuo * parere * corrisponda al mio. Ma sto cercando la giustificazione di questo errore logico. – user2418306

Problemi correlati