Visualizzazione dei risultati da 1 a 7 su 7

Hybrid View

  1. #1
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da DarthSandr Visualizza il messaggio
    codice:
    <context:component-scanbase-package="com.prove"/>
    Piccola nota: non so se è un problema di copia-incolla qui sul forum ma tra scan e base ci va almeno uno spazio, ovviamente.

    Quote Originariamente inviata da DarthSandr Visualizza il messaggio
    codice:
    package com.prove.prove1
    
    @Component
    Class A {
         
           @Autowired
           B b;
    
           public A() {
                b.faiQuesto();
           }
    }
    Questo infatti NON può funzionare. Spring PRIMA istanzia la classe tramite reflection (invocando il costruttore) e POI solo dopo sempre tramite reflection determina che il field b è annotato con @Autowired e quindi a fronte di un oggetto B che deve essere ovviamente tirato su da Spring nel contesto, allora lo "inietta" nel campo b.

    Ma tu b.faiQuesto() lo esegui nel costruttore ... quando il campo b è ancora null (e non può essere diversamente).

    Le soluzioni ovviamente ci sono ma dovresti affrontare un po' meglio il "ciclo" di vita dei bean in Spring.


    Quote Originariamente inviata da DarthSandr Visualizza il messaggio
    Il tutto funziona, invece, se utilizzo quest'altro sistema:

    Classe A
    codice:
    package com.prove.prove1
    
    @Component
    Class A {
         
           B b;
    
           public A() {
                b = B.getInstance();
                b.faiQuesto();
           }
    }
    [....altro....]
    Ok ma questo è completamente l'opposto, insomma è l'anti-Dependency-Injection ... anti-Spring. Cioè proprio quello che con Spring (e altri framework per la DI) NON si vuole e non si deve fare.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  2. #2
    Utente di HTML.it
    Registrato dal
    Oct 2007
    Messaggi
    331
    Quote Originariamente inviata da andbin Visualizza il messaggio

    Le soluzioni ovviamente ci sono ma dovresti affrontare un po' meglio il "ciclo" di vita dei bean in Spring.

    Ok ma questo è completamente l'opposto, insomma è l'anti-Dependency-Injection ... anti-Spring. Cioè proprio quello che con Spring (e altri framework per la DI) NON si vuole e non si deve fare.
    Immaginavo, dato che spring è un argomento un pò nuovo hai qualche link da consigliarmi per capire meglio il ciclo di vita dei Bean di spring?

    grazie

  3. #3
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da DarthSandr Visualizza il messaggio
    Immaginavo, dato che spring è un argomento un pò nuovo hai qualche link da consigliarmi per capire meglio il ciclo di vita dei Bean di spring?
    C'è la Reference ufficiale (vedi da qui) ma non è un "tutorial", nel senso che non è una guida passo-passo per chi inizia. Poi comunque trovi articoli sparsi in giro per la rete.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  4. #4
    Utente di HTML.it
    Registrato dal
    Oct 2007
    Messaggi
    331
    Cercando su internet ho provato questa soluzione che funziona.
    Praticamente, sempre usando le annotation, ho modificato la classe A nel seguente modo:

    codice:
    package com.prove.prove1
    
    @Configuration
    Class A {
         
           @Autowired
           B b;
    
           @PostConstruct
           public void run(){
                b.faiQuesto();
           }
    }
    E in questo modo quello che voglio implementare funziona: all'avvio del server viene chiamato il metodo run() e non ho più i problemi di null pointer e il giro funziona usando le annotation e non i metodi GetInstance() che, come giustamente mi hai fatto notare, vanno contro il concetto della dependency injection.
    Per quello che ho capito di spring in questa configurazione all'avvio del server, spring istanzia tutti i beans coinvolti (io li sto gestendo tramite annotation ma ho visto che si può agire tramite file XML di configurazione) in modo che siano disponibili senza doverli istanziare esplicitamente, è corretto quello che sto dicendo?
    Essendo spring un argomento nuovo, mi preme capire se questa soluzione è concettualmente corretta al di la del suo funzionamento.

    P.S: ho notato però che il costruttore di A viene istanziato due volte all'avvio del server, c'è qualche altro accorgimento da adottare?
    Ultima modifica di DarthSandr; 04-03-2017 a 14:59

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.