Bagaimana cara kerja ComponentScan?

@ComponentScan akan memberi Anda daftar semua kelas dengan anotasi @Component dalam sebuah paket (atau @Service/@Repository). Untuk melakukan ini saya membayangkan mereka menggunakan refleksi untuk menghitung semua kelas dalam sebuah paket dan menemukan kelas dengan anotasi itu.

Namun menurut jawaban StackOverflow lainnya Anda bisa tidak dapat menghitung semua kelas dalam sebuah paket dengan andal karena cara kerja ClassLoader. Jadi bagaimana @ComponentScan tampaknya berhasil mencapai hal ini?


person David says Reinstate Monica    schedule 07.06.2017    source sumber
comment
Dengan bantuan ClassPathScanningCandidateComponentProvider   -  person harshavmb    schedule 07.06.2017
comment
Kelas di atas memiliki metode findCandidateComponents menerima basePackage sebagai argumen masukan dan kemudian ResourcePatternResolver instance membaca semua file classpath dengan akhiran .class. Semoga ini membantu!   -  person harshavmb    schedule 07.06.2017
comment
@harshavmb, jika Anda mengubah komentar Anda menjadi jawaban, saya akan memberi suara positif.   -  person Noel Yap    schedule 28.05.2020
comment
@NoelYap, kamu baik sekali! Saya merasa sudah terlambat untuk menjawabnya karena saya hampir lupa Java & Spring. Maaf mengecewakan!   -  person harshavmb    schedule 28.05.2020


Jawaban (1)


@ComponentScan bekerja secara berbeda. Alur kerja segera dibuat seperti ini:

  • Temukan semua file .class di folder yang sama dan semua subfolder
  • Baca file .class dan bungkus menjadi objek Resource
  • Periksa apakah kelas memiliki anotasi yang menjadikannya kandidat yang baik
  • Jika kelas adalah kandidat yang baik, buatlah kacang dari kelas tersebut.

Kelas dari kode sumber Spring untuk dilihat:

  • ComponentScanAnnotationParser
  • AnnotationConfigUtils
  • ClassPathBeanDefinitionScanner
  • BeanDefinitionReaderUtils
  • DefaultListableBeanFactory
person almirp    schedule 07.06.2017