Ketika kami mengembangkan aplikasi berdasarkan pegas, kami biasanya menempatkan konfigurasi basis data di file Properties.
Ringkasan poin pengetahuan yang terlibat dalam analisis kode:
1.NeSpaceHandler Parses Kustom Namespace di File Konfigurasi XML
2.ContextNeTespaceHandler Parser terkait konteks, di sini mendefinisikan parser spesifik untuk parsing property-placeHolder
3.AndefinitionParser parses antarmuka definisi kacang
4.BeanFactoryPostProcessor Setelah memuat definisi kacang, itu dapat dimodifikasi.
5.PropertySourcesplaceHolderConfigurer menangani placeholder dalam definisi kacang
Mari kita lihat penggunaan spesifik terlebih dahulu
Penggunaan properti
Konfigurasikan file properti dalam file xml
<? XML Versi = "1.0" encoding = "utf-8"?> <beans xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/xmls xmlns: context = "http://www.springframework.org/schema/context" xsi: schemalocation = "http://www.springframework.org/schema/beans http://wwww.spramework.org/schema/beans/beans http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd "> <context: property-placeHolder =" classpath: foo.properter "
Dengan cara ini, file /src/main/resources/foo.properties akan dimuat oleh pegas
Jika Anda ingin menggunakan beberapa file konfigurasi, Anda dapat menambahkan bidang pesanan untuk mengurutkan
Gunakan PropertiesSource untuk membuat anotasi konfigurasi
Spring 3.1 telah menambahkan anotasi @PropertySource untuk memfasilitasi penambahan file properti ke lingkungan.
@Configuration @propertiesource ("classpath: foo.properties") Properti kelas publikwithJavAconfig {@bean public static SoursourcesplaceFolderConfigurer PropertiesSourcesplaceHolderConfigurer () {return New PropertiesSourcesplaceHolderConfigurer (); }}Injeksi dan penggunaan properti
1. Gunakan anotasi @Value untuk mendapatkan di java
@Value ("$ {jdbc.url}") Private String JDBCURL;Anda juga dapat menambahkan nilai default
@Value ("$ {jdbc.url: adefaultUrl}") string pribadi jdbcurl;1. Dapatkan di file konfigurasi XML Spring
<bean id = "DataSource"> <name properti = "url" value = "$ {jdbc.url}" /> < /bean>Analisis Kode Sumber
Memuat Informasi Konfigurasi Properties
Spring akan memulai inisialisasi wadah bekerja melalui AbstractApplicationContext#Refresh at Startup, dan selama periode ini, LoadBeAndefinitions akan dipercayakan untuk menguraikan file konfigurasi XML.
final void final refreshBeanFactory () melempar beansException {if (hasbeanfactory ()) {dasharbeans (); closeBeanFactory (); } coba {defaultListableBeanFactory beanFactory = createBeanFactory (); beanfactory.seterializationId (getId ()); CustomizeBeanFactory (BeanFactory); loadbeandefinitions (beanfactory); disinkronkan (this.beanFactoryMonitor) {this.beanFactory = beanfactory; }} catch (ioException ex) {throw new ApplicationContextException ("I/O Error Parsing Bean Definition Source untuk" + getDisplayName (), ex); }}loadBeandefinitions melalui delegasi lapisan demi lapis, temukan defaultBandefinitionDocumentReader#parsebeandefinition untuk mengurai kacang spesifik
Parsebeandefinitions void yang dilindungi (elemen root, beandefinitionParserDelegate delegate) {if (delegate.isDefaultNamespace (root)) {nodelist nl = root.getChildNodes (); untuk (int i = 0; i <nl.getLength (); i ++) {node node = nl.item (i); if (node instanceof elemen) {elemen ele = (element) node; if (delegate.isdefaultNamespace (ele)) {parsedefaultElement (ele, delegate); } else {delegate.parsecustomelement (ELE); }}}} else {delegate.parsecustomelement (root); }} Karena ini bukan definisi kelas standar, itu mempercayakan BeandefinitionParserDelegate untuk diurai
Temukan prosesor yang sesuai melalui namespaceHandler untuk menemukan ContextNeSpaceHandler, dan kemudian temukan PropertyplaceHolderbeFinitionParser Analisis Parser melalui ID
@Override public void init () {// Ini adalah parser yang kami cari untuk registerbeandefinitionParser ("Property-PlaceHolder", New PropertyplaceHolderbeandefinitionParser ()); RegisterBeandefinitionParser ("Properti-override", PropertyOverrideBeandeFinitionParser ()) baru; RegisterBeandefinitionParser ("Annotation-Config", New AnnotationConfigBeandefinitionParser ()); RegisterBeandefinitionParser ("Component-Scan", ComponentsCanBeandefinitionParser ()); RegisterBeandefinitionParser ("Weaver-Time-Weaver", LoadTimeWeAverbeAndefinitionParser ()) baru; RegisterBeandefinitionParser ("Spring-Configured", SpringconfiguredBeandFinitionParser ()) baru; RegisterBeandefinitionParser ("MBean-Export", MBeanExportBeandefinitionParser ()) baru; registerbeandefinitionParser ("Mbean-Server", MBeanserverBeandefinitionParser ()) baru; } PropertyplaceHolderbeDefinitionParser adalah fokus dari putaran analisis kode ini.
Mari kita lihat kelas induknya.
1. BandefinitionParser
Digunakan oleh defaultBeandefinitionDocumentReader untuk menguraikan tag yang dipersonalisasi
Hanya API parse yang elemen parses didefinisikan di sini
Public Interface BeandefinitionParser {beandefinition parse (elemen elemen, parsercontext parsercontext);} 2.abstractbeandefinitionParser
Implementasi abstrak default dari antarmuka BeandefinitionParser. Musim semi bagus dalam hal itu. Ini menyediakan banyak API yang nyaman di sini, dan menggunakan pola desain metode template untuk memberikan kait implementasi khusus untuk subclass.
Mari kita lihat logika pemrosesan spesifik saat parse: hubungi parseinternal parse hook
3. AbstractsinglebeandefinitionParser
Menganalisis, mendefinisikan kelas induk abstrak dari satu beandefinition tunggal
Di parseinternal, parse parse name, beanclass, source; dan merangkum menggunakan BeandefinitionBuilder
4. AbstrakPropertyLoadingBeandefinitionParser
Menganalisis properti terkait properti, seperti lokasi, properti-ref, pengkodean file, pesanan, dll.
5.PropertyplaceHolderbeandefinitionParser
Tidak banyak hal yang harus ditangani di sini, cukup atur-inore-tidak dapat diselesaikan dan mode-mode-properti-mode
Memuat file properti, instantiasi kacang
Selanjutnya, mari kita lihat kapan kacang ini dipakai. Ada dua jenis instantiasi kelas umum. Seseorang dipakai ketika sistem singleton dimulai; Yang lain dipakai ketika non-Singleton (atau singleton malas memuat) ketika getbean dipakai.
Pemicu di sini adalah melalui BeanfcatoryPostProcessor.
BeanFactoryPostProcessor memodifikasi definisi kacang sebelum instantiasi kacang. Misalnya, placeholder dalam definisi kacang diselesaikan di sini, dan sifat -sifat yang kami gunakan sekarang juga diselesaikan di sini.
Ini diimplementasikan melalui postprocessor registrationDelegate#InvokeBeanFactoryPostProcesorsors.
Pindai BeanfactoryPostProcessor dalam wadah, temukan properti yang dibutuhkan oleh PropertiesSourcesplaceConfigurer di sini, dan instantiate melalui getbean dari wadah
void yang dilindungi voidFactoryPostProcessors (configurableListableBeanFactory beanFactory) {postprocessorrationDelegate.InvokeBeanFactoryPostProcessors (beanfactory, getBeanFactoryPostProcessors ()); }Setelah instantiasi PropertiesSourcesplaceHolderConfigurer selesai, itu akan dipicu secara langsung dan dimuat informasi.
OrderComparator.sort (PriorityOrderedPostProcessors); InvokeBeanFactoryPostProcessors (Prioritas ProciTrocessorsors, BeanFactory);
Mari kita lihat sistem warisan properti -sumber tempat penempatan
1.BeanFactoryPostProcessor
Tentukan antarmuka untuk memodifikasi sifat -sifat definisi kacang dalam wadah. Kelas implementasinya dipakai sebelum kelas umum digunakan dan sifat -sifat kelas lain dimodifikasi.
Ini jelas berbeda dari beanpostprocessor, yang memodifikasi instance kacang.
2.ProPertiesLoaderSupport
Kelas abstrak yang memuat file properti.
Logika pemuatan spesifik di sini adalah untuk mempercayakan PropertiesLoaderutils#FillProperties untuk diimplementasikan
3.PropertyResourCeconfigurer
Penggantian placeholder dalam definisi kacang diimplementasikan oleh kelas abstrak ini.
Implementasikan BeanFactoryPostProcessor#PostProcessBeanFactory, beralih ke definisi kelas dalam wadah, dan memodifikasinya
Cara memodifikasinya diimplementasikan dengan menyerahkannya ke subkelas melalui Hook ProcessProperties
4.PlaceHolderConfigurersupport
Gunakan pola desain pengunjung untuk memperbarui properti melalui BeandefinitionVisitor dan StringValueResolver
StringValueResolver adalah antarmuka yang mengonversi data tipe string. Implementasi API yang benar -benar memperbarui properti sebenarnya
PropertyplaceHolderhelper#parsestringValue
5.PropertySourcesplaceHolderConfigurer
Mengesampingkan proses parsing definisi API postprocessorbeanfactory
Di atas adalah semua konten artikel ini. Saya berharap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.