Autowired e getBean()

di il
4 risposte

Autowired e getBean()

Ciao,
causa alcuni problemi su alcune classi, mi è venuto un dubbio e vorrei una conferma da voi esperti.
Se ho 10 classi, ed in ognuna di queste vado ad iniettare con la annotation Autowired una istanza della classe A, il container di spring si preoccuperà d'andare ad istanziare un'unica volta la classe A e poi le 10 classi utilizzeranno la stessa istanza. E' corretto?
E se invece uso il getBean(), ogni volta mi viene restituita una istanza o anche in questo caso è sempre la stessa per tutte e 10?

Esempio primo caso, 10 classi in cui ho:
@Service
public class MyClass {

	@Autowired
	private MyBean myBean ;
}
Esempio secondo caso, 10 classi in cui ho:
@Service
public class MyClass {

	@Autowired
	private BeanFactory beanFactory;

MyBean  myBean = beanFactory.getBean(MyBean .class);	 
}

4 Risposte

  • Re: Autowired e getBean()

    Test90 ha scritto:


    Se ho 10 classi, ed in ognuna di queste vado ad iniettare con la annotation Autowired una istanza della classe A, il container di spring si preoccuperà d'andare ad istanziare un'unica volta la classe A e poi le 10 classi utilizzeranno la stessa istanza. E' corretto?
    E se invece uso il getBean(), ogni volta mi viene restituita una istanza o anche in questo caso è sempre la stessa per tutte e 10?
    Per default i bean Spring hanno scope "singleton", quindi esiste un solo oggetto creato di quel bean all'interno dei container Spring. E ad ogni (auto)wiring (o getBean()) viene iniettato/fornito lo STESSO oggetto, essendo appunto singleton.

    Discorso diverso per lo scope "prototype":
    @Component
    @Scope("prototype")
    public class ClasseX {
        // ...
    }
    In tal caso ad OGNI distinto (auto)wiring (o getBean()) viene creato un nuovo oggetto di ClasseX e iniettato/fornito dove serve.
  • Re: Autowired e getBean()

    andbin ha scritto:



    Discorso diverso per lo scope "prototype":
    @Component
    @Scope("prototype")
    public class ClasseX {
        // ...
    }
    In tal caso ad OGNI distinto (auto)wiring (o getBean()) viene creato un nuovo oggetto di ClasseX e iniettato/fornito dove serve.
    Perfetto, grazie mille per le delucidazioni.
    Ho notato, grazie a te, che la classe che stiamo analizzando in effetti ha lo scope "prototype", non c'è la annotation Component ma la Service:
    @Service
    @Scope("prototype")
    public class ClasseX {
    }
    quindi anche in questo caso và a creare un nuove oggetto ad ogni getBean(), anche se è dichiarata specificatamente come service ?
  • Re: Autowired e getBean()

    Test90 ha scritto:


    non c'è la annotation Component ma la Service:
    Non ha importanza per lo scope. @Controller, @Service, @Repository sono semplicemente derivazioni "concettuali" di @Component.
    Ma delineano comunque tutti un "bean" di Spring.

    Test90 ha scritto:


    quindi anche in questo caso và a creare un nuove oggetto ad ogni getBean(), anche se è dichiarata specificatamente come service ?
    Sì.

    P.S. comunque avere dei @Service come "prototype" è un pochettino inusuale ...
  • Re: Autowired e getBean()

    andbin ha scritto:


    Sì.

    P.S. comunque avere dei @Service come "prototype" è un pochettino inusuale ...
    Guarda, è probabile che chi ha scritto le classi abbia fatto un copia incolla portandosi dietro la annotation con scope a prototype.
Devi accedere o registrarti per scrivere nel forum
4 risposte