Kata pengantar
Dengan meningkatnya popularitas boot musim semi, sebagian besar konfigurasi dalam aplikasi disembunyikan. Kami hanya perlu peduli dengan konten bisnis, pengontrol, layanan, repositori, dan ketika Anda mengambil keyboard, Anda dapat menggunakan salinan kode bisnis. Pemindaian komponen spesifik, tampilan, placeholder ... dapat ditinggalkan. Namun pada kenyataannya, konfigurasi nol ini tidak lama dalam pengembangan aplikasi Java. "Sulit untuk beralih dari yang luar biasa menjadi berhemat." Banyak pengembang telah mengalami konfigurasi XML musim semi yang panjang, dan sangat sulit untuk kembali ke konfigurasi ini.
Tetapi kadang -kadang, karena konten konfigurasi tidak diimplementasikan dengan baik dalam konfigurasi nol seperti Spring Boot, kita harus tetap menggunakan formulir konfigurasi XML dan kemudian mengimpor Sumber. Atau beberapa proyek dipengaruhi oleh lingkungan dan tidak dikembangkan menggunakan boot, sehingga mereka juga perlu memiliki pemahaman tertentu tentang konfigurasi.
Kemudian mari kita lihat kembali beberapa konten skema khusus dalam konfigurasi XML, bagaimana beberapa konten skema khusus diintegrasikan ke dalam pegas untuk konfigurasi. Misalnya:
Data pegas
dubbo
Ada banyak contoh seperti itu sehingga kami tidak akan mencantumkannya satu per satu. Tetapi melalui dua angka di atas, kami menemukan fitur umum:
Jadi kapan konfigurasi khusus ini berfungsi? Bagaimana cara memverifikasi apakah konfigurasinya benar?
Mari kita lihat musim semi yang berisi file bernama spring.handlers. Semua ekstensi khusus mulai berlaku melalui file ini. Pejabat AOP dan TX Spring juga memiliki prinsip ini.
Dimana file ini?
Seperti yang ditunjukkan pada gambar di atas, itu adalah meta-inf/spring.handlers. Konten file juga sangat sederhana:
http/: //www.springframework.org/schema/data/elasticsearch=org.springframework.data.elasticsearch.config.elasticsearchnamespaceAdler
Yang pertama adalah awalan dari setiap skema, dan yang berikutnya adalah kelas parsing yang sesuai dengan skema. Kapan file spring.handlers dimuat?
Ini juga terjadi ketika mem -parsing file konfigurasi khusus. Ada proses tekad. Pada saat ini, semua file Spring.Handlers yang sesuai dengan ClassLoader saat ini akan dimuat.
Mari kita lihat kelas analisis ini lagi, kontennya adalah sebagai berikut:
Kelas Publik ElasticsearchamespaceHandler memperluas namespaceHandlersupport {public elasticsearchnamespaceHandler () {} public void init () {repositoryConfigurationextension extension = elasticsearchrepositoryConfigextension baru (); RepositoryBeandefinitionParser parser = RepositoryBeandefinitionParser baru (ekstensi); this.registerbeandefinitionParser ("repositories", parser); this.registerbeandefinitionParser ("node-client", nodeclientBeandefinitionParser ()) baru; this.registerbeandefinitionParser ("Transport-Client", TransportClientBeandFinitionParser ()) baru; }} Pertama, ini diwarisi dari NameSapeHandlersupport
Kemudian serangkaian parser terdaftar dalam metode init yang ditulis ulang. Setiap parser sesuai dengan string, yang merupakan konten khusus yang kami gunakan dalam file konfigurasi XML, seperti konfigurasi ES di atas
<Elasticsearch: Transport-Client ID = "client" cluster-nodes = "192.168.73.186:9300" Cluster "
Konfigurasi di sini pada akhirnya akan diuraikan melalui TransportClientBandefinitionParser
Parser yang disebutkan di atas disimpan dalam peta dalam metode init
peta akhir pribadi <string, beandefinitionParser> parsers = hashmap baru ();
Yang disebut pendaftaran parsers adalah untuk menempatkan peta parser ini.
Melihat ke belakang, apa konten inti paling banyak di musim semi? Itu kacang. Bahkan, konten yang kami konfigurasi dalam XML pada akhirnya akan dihasilkan dalam kacang yang sesuai. Semua konfigurasi hanya untuk menghasilkan kacang. Konfigurasi khusus ini disebut beandefinition.
Oleh karena itu, ketika Spring mem -parsing file konfigurasi, akan ada penilaian berikut: apakah itu defaultNeSespace. Jika tidak, buka CustomElementParse
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)) {this.parsedefaultElement (ele, delegate); } else {delegate.parsecustomelement (ELE); }}}} else {delegate.parsecustomelement (root); }} Sebaliknya, penilaian yang bukan defaultNamespace lebih langsung: apakah namespace uri memiliki konten, atau apakah itu pernyataan biji musim semi
public boolean isDefaultNamespace (string namespaceuri) {return! stringutils.haslength (namespaceuri) || "http://www.springframework.org/schema/beans".equals(namespaceuri); } Jadi permintaan semua pergi ke parsecustomelement, dan analisis konfigurasi dimulai di sini. Saat parse, pawang yang sesuai ditemukan melalui uriresolver
PUBLEFINITION PARSECUSTOMELEMENT (Element ele, beandefinition containsbd) {string namespaceuri = this.getnamespaceuri (ele); NamespaceHandler handler = this.readercontext.getNamespaceHandLerReSolver (). Resolve (namespaceuri); if (handler == null) {this.error ("Tidak dapat menemukan spring namespaceHandler untuk skema xml namespace [" + namespaceuri + "]", ele); kembali nol; } else {return handler.parse (ele, new parsercontext (this.readercontext, this, containingBd)); }} Pada saat ini, satu -satunya hal yang dikembalikan adalah pawang yang dikonfigurasi di Spring.handlers, dan masing -masing pawang mendaftarkan banyak parse, dan proses mendapatkan parser diperlukan.
Public Beandefinition Parse (Element Element, Parsercontext ParserContext) {return this.findParserForElement (elemen, parsercontext) .parse (elemen, parsercontext); } private beandefinitionParser findParserForElement (elemen elemen, parsercontext parsercontext) {string localname = parsercontext.getDelegate (). getLocalName (elemen); BeandefinitionParser parser = (beandefinitionParser) this.parsers.get (localname); if (parser == null) {parsercontext.getreaderContext (). fatal ("tidak dapat menemukan beandefinitionParser untuk elemen [" + localname + "]", elemen); } return parser; } Proses mendapatkan ini adalah untuk mendapatkan parser yang sesuai di peta yang kita mulai nyatakan melalui string yang dilewati, dan kemudian gunakan untuk parsing konfigurasi.
Dengan Parser, proses pembuatan beandefinition diikuti.
Kami melihat bahwa parser ini diwarisi dari AbstractBeandefinitionParser, atau mengimplementasikan antarmuka BeandefinitionParser. Metode parse antarmuka adalah pintu masuk ke parsing terpadu.
Public TransportClientBeandefinitionParser memperluas AbstractBeandefinitionParser {Public TransportClientBeandefinitionParser () {} Protected AbstractBeAndefinition Parseinternal (elemen elemen, parsercontext parsercontex BeandefinitionBuilder.rootbeandefinition (TransportClientFactoryBean.class); this.setConfigurations (elemen, pembangun); kembalikan this.getSourcedBeandefinition (builder, elemen, parsercontext); }} Dalam metode parseinternal yang ditulis ulang, kembalikan lefinisi beanden yang sesuai setelah mem -parsing konfigurasi. Ini juga merupakan tempat di mana berbagai kerangka kerja diabstraksikan secara bebas. Misalnya, beberapa kerangka kerja sederhana dan mudah, sementara beberapa akan menerapkan beberapa pola desain seperti strategi dan dekorator untuk memberikan lebih banyak fleksibilitas.
Setelah mendapatkan seefinisi beand, masukkan ke dalam seluruh konteks untuk menghasilkan konten kacang musim semi, dan kami akan menganalisisnya nanti.
Meringkaskan
Di atas adalah seluruh konten artikel ini. Saya berharap konten artikel ini memiliki nilai referensi tertentu untuk studi atau pekerjaan semua orang. Jika Anda memiliki pertanyaan, Anda dapat meninggalkan pesan untuk berkomunikasi. Terima kasih atas dukungan Anda ke wulin.com.