Saya ingin tahu tentang bagaimana injeksi pegas menangani metode panggilan dengan @Bean
anotasi. Jika saya meletakkan @Bean
anotasi pada sebuah metode, dan mengembalikan sebuah instance, saya mengerti bahwa itu memberitahu spring untuk membuat bean dengan memanggil metode tersebut dan mendapatkan instance yang dikembalikan. Namun, terkadang kacang itu harus digunakan untuk mengirim kacang lain atau membuat kode lain. Cara yang biasa dilakukan adalah dengan memanggil @Bean
metode beranotasi untuk mendapatkan sebuah instance. Pertanyaan saya adalah, mengapa ini tidak menyebabkan ada beberapa contoh kacang yang beredar?
Misalnya lihat kode di bawah ini (diambil dari pertanyaan lain). The entryPoint()
Metode dijelaskan dengan @Bean
, jadi saya akan membayangkan musim semi akan membuat contoh baru dari BasicAuthenticationEntryPoint
sebagai kacang. Kemudian, kami memanggil entryPoint()
lagi di blok konfigurasi, tetapi sepertinya entryPoint()
mengembalikan instance kacang, dan tidak dipanggil beberapa kali (saya mencoba masuk, dan hanya mendapat satu entri log). Secara potensial kita bisa memanggil entryPoint()
beberapa kali di bagian lain dari konfigurasi, dan kita akan selalu mendapatkan contoh yang sama. Apakah pemahaman saya tentang ini benar? Apakah musim semi melakukan beberapa metode penulisan ulang ajaib yang dianotasi @Bean
?
@Bean
public BasicAuthenticationEntryPoint entryPoint() {
BasicAuthenticationEntryPoint basicAuthEntryPoint = new BasicAuthenticationEntryPoint();
basicAuthEntryPoint.setRealmName("My Realm");
return basicAuthEntryPoint;
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.exceptionHandling()
.authenticationEntryPoint(entryPoint())
.and()
.authorizeUrls()
.anyRequest().authenticated()
.and()
.httpBasic();
}
@Bean
dan@Primary
).CGLib allows us to create proxy classes at runtime by creating sub class of specified class using Byte code generation. CGLib proxies are used in the case where Proxy is to be created for those class which does not have any interfaces or have methods which are not declared in the implementing interface.
Dalam kasus ini, CGLIB membuat subclass dari kelas @Configuration dan mengganti metodenya (termasuk metode @Bean). Jadi, ketika kita memanggil metode @Bean dari metode lain, kita sebenarnya memanggil versi yang ditimpa (berkat pengikatan dinamis java).@Component
akan berfungsi jika saya menggunakan CHLIB untuk membuat proxy alih-alih java Poxy?