Kata pengantar
Saat ini, hampir sebagian besar aplikasi Java, seperti Tomcat, Struts2, Netty, dll., Yang kami kenal, tidak dapat menghitungnya,
Untuk memenuhi universalitas, file konfigurasi disediakan bagi pengguna untuk menyesuaikan fungsi.
Bahkan ada beberapa kerangka kerja jaringan seperti Netty yang hampir sepenuhnya dikonfigurasi, dan kami biasanya menyebut perangkat lunak tersebut "arsitektur microker".
Apa pun yang Anda konfigurasinya, itu adalah apa adanya.
Itu adalah apa yang Anda konfigurasikan.
Format file konfigurasi yang paling umum adalah XML, properti, dan file lainnya.
Artikel ini membahas skenario yang paling umum dan umum dalam memuat konfigurasi, yaitu memetakan file konfigurasi ke objek POJO di Java.
Dan mendiskusikan cara menerapkan berbagai cara pemuatan. Misalnya, beberapa konfigurasi dimuat dari file XML lokal, sementara beberapa konfigurasi perlu dimuat dari file properti lokal, dan lebih dari itu, beberapa konfigurasi perlu dimuat melalui jaringan.
Cara menerapkan mekanisme pemuatan konfigurasi semacam itu sehingga setelah kita memiliki mekanisme ini, konfigurasi pemuatan kode tidak akan disebarkan di mana -mana, dan dapat diukur dan dikelola.
Konfigurasikan loader
Pertama, kita memerlukan pemuat konfigurasi, dan pemuat konfigurasi ini dapat memiliki banyak metode pemuatan yang berbeda. Oleh karena itu, kami menggunakan antarmuka untuk menggambarkannya sebagai berikut:
/** * * * @author bean * @date 21 Januari 2016 jam 11:47:12 AM * @Version 1.0 * */Antarmuka publik IconfigLoader <T> {/** * Muat konfigurasi yang diketik oleh t * * @return * @throws configException */public t load () melempar ConfigException;} Tetapi mengapa kita perlu mendeklarasikan generik <T> pada antarmuka ini?
Jelas, ketika kami ingin menggunakan loader konfigurasi, Anda harus memberi tahu loader konfigurasi ini hasil apa yang perlu Anda dapatkan setelah memuat.
Misalnya, jika Anda ingin memuat konfigurasi dan mendapatkan objek Appleconfig, Anda dapat menggunakan antarmuka yang ditentukan di atas:
IconfigLoader <Plipeconfig> loader = new AppleconfigLoader <Plipeconfig> (); Appleconfig config = loader.load ();
Jadi Anda mengonversi informasi dalam file konfigurasi menjadi objek Appleconfig, dan Anda bisa mendapatkan contoh objek Appleconfig ini.
Sejauh ini, tampaknya selama AppleconfigLoader kami mengimplementasikan tenaga kerja spesifik tentang cara memuat file konfigurasi, kami dapat dengan mudah memuat konfigurasi.
Dapat dikatakan bahwa, tetapi bukan karena konfigurasi dapat dimuat dengan cara yang berbeda, seperti memuat melalui properti, DOM, SAX, atau memuat melalui beberapa pustaka sumber terbuka pihak ketiga.
Oleh karena itu, selain mengkonfigurasi loader, kami juga membutuhkan peran lain, penyedia mengkonfigurasi metode pemuatan. Sebut saja IconfigProvider.
Konfigurasikan penyedia metode pemuatan
Penyedia metode pemuatan konfigurasi dapat memberikan metode pemuatan ke pemuat konfigurasi, dengan kata lain, memberikan objek ke pemuat konfigurasi.
Jika dimuat melalui DOM, penyedia memberikan objek dokumen ke loader.
Jika dimuat melalui properti, penyedia menyediakan objek properti ke loader. Jika dimuat melalui metode yang disediakan oleh perpustakaan kelas pihak ketiga, seperti Apache-Commons-Digester3 (pemuatan konfigurasi TomCAT), penyedia memberikan objek digester kepada penyedia loader adalah untuk menyediakannya, itu saja, hanya menyediakan objek yang diperlukan untuk mengonfigurasi loader, tetapi itu sendiri tidak berpartisipasi dalam tenaga kerja mengkonfigurasi pemuatan.
Kami menggunakan antarmuka IconfigProvider untuk mendefinisikan penyedia ini
/** * * * @author bean * @Date 21 Januari 2016 jam 11:54:28 AM * @Version 1.0 * */Antarmuka publik IconfigProvider <T> {/** * menyediakan sumber konfigurasi yang digunakan untuk memuat konfigurasi * * @return * @throws ConfigException */Public T menyediakan () ThrowsException; Mengapa ada <T> di sini untuk menyatakan obat generik?
Jika Anda membutuhkan penyedia, maka setidaknya Anda harus memberi tahu penyedia apa yang harus disediakannya.
Oleh karena itu, apa yang akan diberikan penyedia ditentukan oleh ini.
Pada saat yang sama, pertama -tama kita dapat membangun pabrik dan membiarkannya menghasilkan penyedia spesifik:
/** * * * @author bean * @date 21 Januari 2016 jam 11:56:28 AM * @Version 1.0 * */kelas publik configReproviderFactory {private configProviderFactory () {throw GetSportedOpersException baru ("tidak dapat menginisialisasi kelas pabrik:" + getSclass (). } public static iconfigProvider <Document> createDocumentProvider (string filePath) {return new DocumentProvider (FilePath); } public static iconfigProvider <Properties> createProPertiesProvider (string filePath) {return new New PropertiesProvider (filepath); } public static iconfigProvider <Gigester> createdigesterprovider (string filepath) {return new DigesterProvider (filepath); }}Bisakah Anda mulai mengimplementasikan loader konfigurasi tertentu?
Belum baik -baik saja!
Pada titik ini, misalkan kita memiliki file konfigurasi yang disebut apple.xml. Dan kita perlu memuat apple.xml ini ke objek Appleconfig melalui DOM.
Jadi, pertama -tama, saya ingin membuat penyedia yang dapat memberikan dokumen melalui pabrik penyedia. Lalu saya mendapatkan penyedia ini dan saya bisa memanggil metode menyediakannya untuk mendapatkan objek dokumen.
Dengan objek dokumen, saya dapat mulai memuat konfigurasi.
Namun, jika Anda ingin memuat pisangonfig, pearconfig ......, langkah -langkahnya sama. Oleh karena itu, kami juga membutuhkan kelas abstrak untuk mengimplementasikan beberapa perilaku umum default.
/** * * * @author bean * @date 21 Januari 2016 jam 11:59:19 AM * @Version 1.0 * */Public Abstract Class AbstractConfigLoader <T, u> mengimplementasikan IconfigLoader <T> {Protected IconfigProvider <u> penyedia; protected abstractConfigLoader (iconfigProvider <u> penyedia) {this.provider = penyedia; } / * * @see iconfigloader#load () * / @Override public t load () melempar configException {return load (getProvider (). tersedia ()); } public abstrak t load (U loaderSource) melempar ConfigException; IConfigProvider yang Dilindungi <u> getProvider () {return this.provider; }}Setiap loader konfigurasi memiliki konstruktor parameter yang menerima penyedia.
Generik menunjukkan apakah saya ingin memuat Appleconfig atau Bananconfig. <u> generik menunjukkan metode pemuatan mana yang akan dimuat, apakah itu dokumen, properti, atau yang lainnya.
Contoh aplikasi praktis
Ada pasar konfigurasi pasar sayuran.xml, yang mengonfigurasi produk -produk pasar sayuran, termasuk dua produk, yaitu apel dan telur.
<marker> <parple> <nolor> merah </olor> <price> 100 </setil> </pesple> <gelek> <dobe> 200 </boight> </gelang> </parker>
Ada juga file konfigurasi untuk nama bos di setiap kios, pemilik.properties
port1 = steve jobsport2 = bill gatesport3 = kobe bryant
Mari kita tentukan kelas -kelas berikut terlebih dahulu:
MarketConfig.java
/** * * * @author bean * @date 21 Januari 2016 jam 11:03:37 PM * @Version 1.0 * */kelas publik MarketConfig {private appleconfig appleconfig; Eggconfig Private Eggconfig; Ownerconfig Private Ownerconfig; appleconfig publik getAppleConfig () {return appleconfig; } public void setappleConfig (appleconfig appleconfig) {this.appleConfig = appleconfig; } public eggconfig geteggconfig () {return eggconfig; } public void seteggconfig (Eggconfig EggConfig) {this.eggConfig = EggConfig; } public OwnerConfig getownerConfig () {return OwnerConfig; } public void setownerConfig (OwnerConfig OwnerConfig) {this.ownerConfig = OwnerConfig; }}Appleconfig.java
/** * * * @author bean * @date 21 Januari 2016 jam 11:03:45 pm * @Version 1.0 * */kelas publik appleconfig {private int price; warna string pribadi; public void setPrice (int price) {this.price = harga; } public int getPrice () {return this.price; } public void setColor (string color) {this.color = color; } public String getColor () {return this.color; }}Eggconfig.java
/** * * * @author bean * @date 21 Januari 2016 jam 11:03:58 PM * @Version 1.0 * */kelas publik Eggconfig {private int weight; public void setWeight (int weight) {this.weight = weight; } public int getWeight () {return this.weight; }} Ownerconfig.java
/** * * * @author bean * @date 21 Januari 2016 jam 11:04:06 PM * @Version 1.0 * */kelas publik OwnerConfig {private Map <String, String> Owner = HashMap baru <String, String> (); public void addOWNER (string portname, string wown) {this.owner.put (portname, pemilik); } public string getOwnerByportName (string portName) {return this.Owner.get (portName); } peta publik <string, string> getOwners () {return collections.unmodifiblemap (this.owner); }} Ada dua metode pemuatan konfigurasi untuk contoh ini, yaitu metode pemuatan DOM dan properti.
Jadi penyedia kami perlu membangun pabrik dengan dua penyedia.
Dan dua loader konfigurasi perlu ditentukan, yaitu:
OwnerConfigLoader
/** * * * @author bean * @date 21 Januari 2016 jam 11:24:50 PM * @Version 1.0 * */kelas publik OwnerConfigLoader memperluas abstractConfigLoader <OwnerConfig, Properties> {/** * @param penyedia */Provected OwnerConfigLoader (iconfigProver <poperties; Properties; Properties; Properties; Properties; Properties; Properties; Properties; Propertie (IconfigProvider (IconfigProvider (IconfigRovider; } / * * @See AbstractConfigLoader#load (java.lang.Object) * / @Override Public OwnerConfig Load (Properties Props) Melempar ConfigException {OwnerConfig OwnerConfig = OwnerConfig baru (); / ** * Gunakan alat peraga untuk mengatur nilai properti dari OwnerConfig * * Kode di sini dihilangkan */ return OwnerConfig; }}Lalu ada MarketConfigLoader
import org.w3c.dom.Document;/** * * @author Bean * @date January 21, 2016 at 11:18:56 pm * @version 1.0 * */public class MarketConfigLoader extends AbstractConfigLoader<MarketConfig, Document> { /** * @param provider */ protected MarketConfigLoader(IConfigProvider<Document> provider) { super(provider); } / * * AbstractConfigLoader#load (java.lang.Object) * / @Override Public MarketConfig Load (dokumen dokumen) melempar ConfigException {MarketConfig MarketConfig = new MarketConfig (); Appleconfig appleconfig = appleconfig baru (); Eggconfig Eggconfig = EggConfig baru (); / ** * Proses dokumen di sini, dan kemudian Anda bisa mendapatkan * appleconfig dan eggconfg * * Kode di sini dihilangkan */ marketConfig.setappleConfig (appleconfig); marketConfig.seteggconfig (Eggconfig); / ** * Karena OwnerConfig membutuhkan properti untuk dimuat, itu bukan xml * jadi di sini kita perlu membuat OwnerConfigLoader baru dan mendelegasikannya untuk memuat OwnerConfig */ OwnerConfigLoader OwnerConfigLoader = OwnerConfigLoader (configroviderfactory.createProperiDerer (configroverprovidory. OwnerConfig OwnerConfig = OwnerConfigLoader.Load (); marketConfig.setownerconfig (Ownerconfig); Return MarketConfig; }}Lalu, bagaimana kita mendapatkan MarketConfig di tingkat aplikasi?
MarketConfigLoader MarketConfigLoader = MarketConfigLoader baru (configProviderFactory.createDocumentProvider (you_file_path));
MarketConfig MarketConfig = MarketConfigLoader.Load ();
Mungkin ada tempat di mana orang mungkin terkejut. Jelas ada empat kelas konfigurasi, jadi mengapa hanya ada dua pemuat konfigurasi?
Karena MarketConfig, Eggconfig dan Appleconfig semuanya dimuat dari file konfigurasi XML yang sama, selama objek dokumen digunakan, dapat dimuat melalui MarketConfigLoader.
OwnerConfig adalah metode pemuatan yang berbeda, sehingga diperlukan pemuat lain.
akhir
Mekanisme pemuatan konfigurasi yang diusulkan dalam artikel ini tidak dapat benar -benar membantu memuat konfigurasi. Ini harus diserahkan kepada DOM, SAX, dan beberapa perpustakaan open source lainnya seperti DOM4J dan Digester.
Namun, mekanisme pemuatan konfigurasi yang diusulkan dalam artikel ini dapat membuat mekanisme pemuatan konfigurasi lebih fleksibel dan mudah diperluas, dan dapat mengintegrasikan beberapa metode pemuatan konfigurasi, mengintegrasikannya ke dalam satu mekanisme, dan memainkan poin mereka sendiri.
Faktanya, beberapa perangkat lunak sering perlu memuat konfigurasi dari file konfigurasi dalam beberapa format berbeda secara bersamaan, seperti Struts2, dan perangkat lunak middleware basis data open source domestik yang telah saya teliti dan muntah darah baru -baru ini.
Jika tidak ada mekanisme pemuatan konfigurasi lengkap, kode akan lebih tersebar dan kurang dapat dipelihara. Ini dapat dengan mudah menyebabkan orang muntah darah.