Tujuan yang pasti
Izinkan saya menjelaskan secara singkat masalah yang ingin diselesaikan oleh artikel ini: Bagaimana cara tidak lagi menggunakan Spring untuk membuat instance kacang di musim semi, tetapi mentransfer proses penciptaan kacang ke pengembang.
Pemikiran yang jelas
Cara membuat instance kacang:
1) melalui konstruktor (dengan atau tanpa parameter)
Metode: <bean id=""/>
2) melalui metode pabrik statis
Metode: <bean id="" factory-method="静态工厂方法"/>
Catatan: Instance kelas pabrik tidak dibuat
3) Melalui metode pabrik instan (metode non-statis)
Jalan:
<bean id="factory"/>
<bean id="" factory-bean="factory" factory-method="实例工厂方法"/>
Catatan: Instance kelas pabrik dibuat
Metode praktis
Contoh 1 :
membutuhkan:
1 Saya tidak ingin instantiate bean ketika bean.xml dimuat, tetapi saya ingin memisahkan kacang.xml yang dimuat dari objek yang sedang berlangsung.
2 Menerapkan Singleton Bean
Dalam situasi di atas, kacang dapat dibuat melalui metode pabrik.
Dengan cara ini, ketika bean.xml dimuat, kacang tidak akan dipakai secara langsung, tetapi hanya akan mulai benar-benar dipakai ketika metode yang dimaksud dengan metode pabrik dipanggil.
Implementasi: Buat kacang singleton melalui metode pabrik musim semi
Pertama -tama buat objek singleton melalui kelas dalam statis
Paket com.spring.test.factorymethod; panggung kelas publik {public void perform () {System.out.println ("Show Start ..."); } private stage () {} private static class stageSingLeTonHolder {static stage instance = new stage (); } public static stage getInstance () {Return StageSingLeTonHolder.Instance; }}Tentukan metode pemuatan dalam file konfigurasi pegas getInstance
<? Xml Version = "1.0" encoding = "UTF-8"?> <beans xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance" xmlns = "http://www.springframework/org/orga/beans" XSI: schemalocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> <bean id = "thestage" factory = "method =" method = "method =" method = "factore =" factore = "factore =" method = "factore =" factore = "factore ="
Dapatkan contoh dengan memanggil kacang dalam konteks aplikasi
Paket com.spring.test.factorymethod; impor org.springframework.context.appLicationContext; impor org.springframework.context.support.classpathxmlapplicationContext; public class test {public static main (string [] args) {applicationcextc; public class {public static Main Main (string [] args) {applicationcextcer ClasspathxmlapplicationContext ("bean.xml"); Tahap tahap = ((tahap) ctx.getBean ("thestage")); //. GetInstance (); stage.perform (); }}Hasil eksekusi
24 Januari 2015 6:38:18 PM org.springframework.context.support.AbstracTapplicationContext PrepareFresh Informasi: menyegarkan org.springframework.context.support.classpathxmlappLicationContext@512dbd1a: startup.DaspathxmlappLicationContext@512Dbd1a: startup date startup ([email protected]: startup date startup ([email protected]: startup date startup (classpathxmlicationcontext@512dbd1a: startup kencan 24 18 Root of Context Hierarchyjan 24, 2015 6:38:19 PM org.springframework.beans.factory.xml.xmlbeandefinitionReader LoadBeAndefinitions Informasi: Memuat Definisi Kacang XML dari Kelas Sumber Daya [Bean.xml] Januari 2015 6:3:3: PM Kelas [Bean.xml] Januari 2015 6:3: 2:38: PM Class [Bean.xml] Januari 2015 6:3: PM Class [Bean.xml] Januari 2015 6:3: 2 Januari 6:3: PM Class [Bean.xml] Januari 2015 6:3: 2 Januari 2015 6:3: PM Class [Bean.xml] Januari 2015 6:3: 2015 6:3: 2 Januari 2015 6:3: 2 Januari 2015 6:3: 2 Januari 2015 6:3: org.springframework.beans.factory.support.DefaultListableBeanFactory preinstantiateateLeTon Information: pra-instansiasi singleton di org.springframework.beans.factory.support.defaultlistableBeanfactory@2d1879AApory: defining2aAnse2AneStListableBeanFactory@2d1879AeAcport: defining2aans [defining2aApor2AnEpory @2d18799AApory: defining2aApor2AnEpore2aAporyFactory@2d1879AeAckor2 Root of Factory Kinerja hierarki dimulai ...
Pengantar metode penciptaan metode pabrik
1. Buat kacang menggunakan metode pabrik statis
Saat membuat instance kacang menggunakan metode pabrik statis, atribut kelas juga harus ditentukan, tetapi pada saat ini atribut kelas bukan kelas implementasi yang menentukan instance kacang, tetapi kelas pabrik statis. Karena musim semi perlu mengetahui pabrik mana yang akan digunakan untuk membuat instance kacang. Selain itu, Anda perlu menggunakan metode pabrik untuk menentukan nama metode pabrik statis. Spring akan memanggil metode pabrik statis (dapat berisi satu set parameter) untuk mengembalikan instance kacang. Setelah instance kacang yang ditentukan diperoleh, langkah pemrosesan setelah musim semi persis sama dengan membuat instance kacang menggunakan metode biasa. Perlu dicatat bahwa ketika menggunakan metode pabrik statis untuk membuat kacang, metode pabrik ini harus statis. Bagian ini terdengar sedikit pusing, tanpa banyak bicara, tolong tambahkan kodenya:
Pertama -tama tentukan antarmuka, dan metode statis akan menghasilkan instance antarmuka:
Hewan Antarmuka Publik {public void wayshello ();}Berikut adalah dua kelas implementasi antarmuka:
Kelas Publik mengimplementasikan hewan {msg string pribadi; // metode setter yang diperlukan selama ketergantungan injeksi public void setMSG (string msg) {this.msg = msg; } @Override public void wayshello () {System.out.println (msg + ", meow ~ meow ~"); }} Kelas publik mengimplementasikan hewan {private string msg; // metode setter yang diperlukan selama ketergantungan injeksi public void setMSG (string msg) {this.msg = msg; } @Override public void sayshello () {System.out.println (msg + ", kuat ~ kuat ~"); }}Pabrik AnimalFactory di bawah ini berisi metode statis getanimal, yang akan menentukan objek mana yang akan dibuat berdasarkan parameter yang diteruskan. Ini adalah pola desain pabrik statis yang khas.
clas public animalfactory {public static hewan getanimal (tipe string) {if ("cat" .equalsignorecase (type)) {return new cat (); } else {return new dog (); }}}Jika Anda perlu menentukan bahwa Spring menggunakan AnimalFactory untuk menghasilkan objek hewan, Anda dapat mengonfigurasi yang berikut dalam file konfigurasi pegas:
<!-- Configure the getAnimalFactory's getAnimal method to generate Cat --><bean id="cat" factory-method="getAnimal"> <!-- Configure the parameters of the static factory method, the getAnimal method will generate Cat-type objects --> <constructor-arg value="cat" /> <!-- Normal properties injected through setter--> <property name="msg" value="cat" /> </ bean> <!-Mengkonfigurasi metode getanimal getanimalctory untuk menghasilkan anjing-> <bean id = "dog"-factory-method = "getanimal"> <!-Mengkonfigurasi parameter metode pabrik statis, "norma normal" name = "msg" value = "dog" /> </t bean>
Dari konfigurasi di atas, kita dapat melihat bahwa kelas dan metode pabrik dari dua konfigurasi kacang kucing dan anjing persis sama, karena kedua contoh dihasilkan menggunakan kelas pabrik statis yang sama dan metode pabrik statis yang sama. Hanya saja parameter yang ditentukan untuk metode pabrik statis ini berbeda, gunakan elemen <constructor-arg /> untuk menentukan parameter untuk metode pabrik statis.
Metode program utama untuk mendapatkan dua instance kacang kucing dan anjing tetap tidak berubah. Anda hanya perlu memanggil getbean () dari wadah musim semi:
tes kelas publik {public static void main (string args []) {applicationContext context = new ClassPathXMLapPlicationContext ("ApplicationContext.xml"); Hewan a1 = context.getbean ("kucing", hewan.class); a1.sayhello (); Hewan a2 = context.getbean ("dog", animal.class); a2.sayhello (); }}Hasil output:
<code> kucing, meow ~ meow ~ dog, kuat ~ kuat ~ </code>
Saat membuat instance menggunakan metode pabrik statis, Anda harus menyediakan kelas pabrik dan metode pabrik statis yang menghasilkan instance. Saat membuat instance melalui metode pabrik statis, Anda perlu membuat perubahan berikut pada file konfigurasi pegas;
Atribut kelas bukan kelas implementasi dari instance kacang, tetapi kelas pabrik statis yang menghasilkan instance kacang
Gunakan metode pabrik untuk menentukan metode pabrik statis untuk menghasilkan instance kacang
Jika metode pabrik statis membutuhkan parameter, gunakan elemen <constructor-Arg /> untuk mengonfigurasinya
Ketika kami menentukan bahwa Spring menggunakan metode pabrik statis untuk membuat instance bean, Spring pertama -tama akan menguraikan file konfigurasi, dan memanggil metode pabrik statis dari kelas pabrik statis melalui refleksi berdasarkan informasi yang ditentukan oleh file konfigurasi, dan menggunakan nilai pengembalian metode pabrik statis sebagai contoh bean. Dalam proses ini, Spring tidak lagi bertanggung jawab untuk membuat instance kacang, dan instance kacang disediakan oleh metode pabrik statis yang disediakan oleh pengguna.
2. Buat kacang menggunakan metode pabrik instance
Metode pabrik instan hanya sedikit berbeda dari metode pabrik statis: memanggil metode pabrik statis hanya membutuhkan menggunakan kelas pabrik, dan memanggil metode instance factory harus menggunakan instance pabrik. Oleh karena itu, hanya ada satu perbedaan dalam konfigurasi pegas: Mengkonfigurasi metode pabrik statis untuk menentukan kelas pabrik statis, dan mengkonfigurasi metode instance pabrik untuk menentukan instance pabrik. Contoh yang sama di atas mengubah animalFactory menjadi:
Public CLAS AnimalFactory {hewan publik getanimal (tipe string) {// Di sini, kata kunci statis hanya dihapus if ("cat" .equalSignorecase (type)) {return new Cat (); } else {return new dog (); }}}File pegas dimodifikasi menjadi:
<!-Mengkonfigurasi kelas pabrik terlebih dahulu-> <bean id = "animalFactory" /> <!-Di sini kita menggunakan kacang pabrik untuk menentukan objek kelas pabrik instance-> <bean id = "cat" bean-bean = "animalFactory" factory-method = "getanimal"> <!-juga menentukan parameter-factory-method = "getanimal"> <! value = "Cat" /> </ bean> <bean id = "dog" factory-bean = "animalFactory" factory-method = "getanimal"> <constructor-arg value = "dog" /> <name properti = "msg" value = "dog" /> </ bean>
Kelas uji tidak perlu dimodifikasi, hasil output sama seperti di atas.
Dalam banyak kasus, <bean id = "bean1" class = "..." /> digunakan untuk mendefinisikan kacang. Cara ini Spring akan memanggil konstruktor tanpa parameter default untuk membuat instance kacang. Selain itu, Anda juga dapat menggunakan pabrik untuk membuat instance kacang untuk memisahkan penciptaan dan penggunaan kacang, dan menyerahkan karya penciptaan kacang kepada pabrik untuk diselesaikan.
Ada tiga cara untuk mengonfigurasi kacang pabrik.
Antarmuka Abstrak:
antarmuka publik imusicbox {public void play (); } 1. Dapatkan contoh kacang untuk metode pabrik statis
Kategori pabrik:
Public Class MusicBoxFactory {public static iMusicBox createMusicBox () {return new iMusicBox () {public void play () {System.out.println ("Play piano ..."); }}; }}File Konfigurasi:
<bean id = "musicbox" factory-method = "createMusicbox" />
Kelas Tes:
public static void main (string [] args) {applicationContext ctx = new classpathxmlapplicationContext ("bean-config.xml"); IMUSICBOX MUSICBOX = (IMUSICBOX) CTX.GetBean ("MusicBox"); musicbox.play (); }2. Metode instance pabrik memperoleh instance kacang
Kategori pabrik:
Public Class MusicBoxFactory {public imusicbox createMusicBox () {// Tidak ada modifikasi statis mengembalikan iMusicBox baru () {public void play () {System.out.println ("Play piano ..."); }}; }}File Konfigurasi:
<bean id = "factorybean" /> <bean id = "musicbox" factory-bean = "factorybean" factory-method = "createMusicbox" />
Atribut "Bean-Bean" menentukan kacang pabrik, dan atribut "Method pabrik" menentukan metode pabrik untuk mendapatkan instance Bean.
Kelas Tes:
public static void main (string [] args) {applicationContext ctx = new classpathxmlapplicationContext ("bean-config.xml"); IMUSICBOX MUSICBOX = (IMUSICBOX) CTX.GetBean ("MusicBox"); musicbox.play (); } 3. Kelas pabrik mengimplementasikan org.springframework.beans.factory.facotrybean antarmuka
Kategori pabrik:
impor org.springframework.beans.factory.factorybean; Public Class MusicBoxFactory2 mengimplementasikan factorybean {public object getObject () melempar Exception {return new iMusicBox () {public void play () {System.out.println ("Play piano ..."); }}; } kelas publik getObjectType () {return imusicbox.class; } public boolean issingleton () {return false; }}File Konfigurasi:
<bean id = "musicbox"/>
Kelas Tes:
public static void main (string [] args) {applicationContext ctx = new classpathxmlapplicationContext ("bean-config.xml"); // tidak ditambahkan & mengembalikan "produk" dari pabrik imusicbox musicbox = (imusicbox) ctx.getBean ("MusicBox"); musicbox.play (); // Tambah & Mengembalikan objek instance kelas pabrik obj = ctx.getBean ("& musicbox"); System.out.println (obj.getClass (). GetName ()); }Kelas yang menerapkan antarmuka pabrik tidak akan dianggap sebagai kacang biasa, musim semi akan secara otomatis mendeteksi mereka, dan memanggil metode GetObject untuk mendapatkan instance kacang.
Meringkaskan
Ini adalah akhir dari pengantar instantiating bean instance dalam metode pabrik musim semi. Jika Anda memiliki kekurangan, Anda dapat meninggalkan pesan untuk ditunjukkan. Terima kasih teman atas dukungan Anda untuk situs ini!