Ho dichiarato due bean dello stesso tipo di classe. Inizializzati come @Lazy
. @Autowiring
un bean di essi inizializzava automaticamente anche l'altro bean. Sono stato sorpreso di vedere quel comportamento. Solo curioso di sapere di più sul meccanismo.Caricamento lazy primaverile - caricamento di un bean su tutti i bean @Lazy di quella classe
Codice
//bean
public class HelloWorld {
public HelloWorld(String msg){
System.out.println(msg + ", " + this);
}
}
@Configuration
@Lazy
public class SpringAppContext {
@Bean(name="helloworld1")
public HelloWorld helloworld1(){
return new HelloWorld("helloworld1");
}
@Bean(name="helloworld2")
public HelloWorld helloworld2(){
return new HelloWorld("helloworld2");
}
}
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes={SpringAppContext.class})
public class SpringBeanLazyLoadTest {
@Autowired
private HelloWorld helloworld2;
@Test // this test is lame but just trying out.
public void print(){
System.out.println("Autowired: " + helloworld2);
}
}
uscita
helloworld2, [email protected]
helloworld1, [email protected] // why was helloworld1 initialized?
Autowired: [email protected]
Se si osserva l'uscita, si può notare che il fagiolo helloworld1
viene inizializzato quando helloworld2
è @Autowired
.
Ho provato rimuovendo @Autowired
e ha prodotto risultati attesi: nessuno dei fagioli inizializzato.
mi sarei aspettato il test a fallire. '@ Autowired' esegue l'iniezione per tipo e non per nome. Quindi, data la natura 'byType', tutti i bean di quel tipo verranno istanziati. Tuttavia, dato che hai un solo campo '@ Autowired', mi sarei aspettato che fallisse con un messaggio che ti diceva che si aspettava 1 bean ma 2. –