Lingkup kacang tanpa kewarganegaraan adalah contoh tunggal. Jika kita menyuntikkan kacang B dari prototipe ke dalam kacang A dari singleton dan berharap bahwa kacang baru dapat dikembalikan setiap kali getBeanb () dari kacang A dipanggil, persyaratan ini tidak dapat dicapai dengan menggunakan metode injeksi tradisional. Karena aksi suntikan kacang singleton yang terkait hanya terjadi sekali, meskipun lingkup kacang B adalah tipe prototipe, objek yang dikembalikan melalui getBeanb () masih merupakan kacang B yang disuntikkan pada awalnya.
Jadi, jika Anda ingin mengembalikan BeanB baru setiap kali Anda memanggil Beana's GetBeanB (), solusi opsional adalah membiarkan Beana mengimplementasikan antarmuka BeanfactoryAware, sehingga Anda dapat mengakses wadah, dan kemudian mengimplementasikannya dengan cara berikut.
Pertama kali konfigurasi xml:
<bean id = "penulis" scope = "prototipe"/> <bean id = "book" p: name = "veil"> </tac>
Lingkup Penulis Bean diatur ke prototipe.
Kelas buku mengimplementasikan antarmuka beanfactororyAware:
Buku kelas publik mengimplementasikan beanfactoryAware {...@overridepublic void setBeanFactory (beanfactory beanfactory) melempar beansexception {this.factory = beanfactory;} public author getPrototyPeauthor () {return (worsor) factory.getbean (""); }}Tes unit:
ApplicationContext Context; @beforemethodpublic void setup () melempar Exception {context = new ClassPathXMLapPlicationContext ("Beans5-5.xml");}@testpublic void test () {Book Book = (Book) Context.getBean ("Book"); System.out.println (book.getAuthor (). HashCode ()); System.out.println (book.getAuthor (). HashCode ()); System.out.println (book.getPrototyPeauthor (). HashCode ()); System.out.println (book.getPrototyPeauthor (). HashCode ());Hasil tes
Dari hasilnya, kita dapat melihat bahwa hanya contoh penulis yang diperoleh dari beanfactory yang berbeda.
Implementasi ini mengikat aplikasi dengan kerangka kerja Spring. Apakah ada solusi yang lebih baik? Ya, itu adalah metode injeksi.
1 metode injeksi
Kontainer musim semi mengandalkan perpustakaan CGLIB, sehingga bytecode kelas dapat dioperasikan secara dinamis selama runtime, seperti secara dinamis membuat subclass atau kelas implementasi kacang.
Antarmuka BookInterface:
Buku Public Interface BookInterface {Penulis GetAuthor ();}Konfigurasi XML:
<!-Metode Injeksi-> <bean id = "penulis" scope = "prototipe" p: name = "maugham"/> <bean id = "book2"> <lookup-method name = "getAuthor" bean = "penulis"/> </bean>
Tes unit:
BookInterface Book = (BookInterface) Context.getBean ("Book2"); Assert.asserTequals ("Maugham", book.getauthor (). GetName ()); assert.asserttrue (book.getauthor (). HashCode ()! = Book.getauthor (). Hashcode ();Melalui metode konfigurasi ini, implementasi dinamis dapat disediakan untuk antarmuka, dan kacang yang dikembalikan dengan cara ini adalah semua contoh baru.
Oleh karena itu, jika Anda ingin mendapatkan kacang prototipe dalam kacang singleton, Anda dapat menggunakan pencarian untuk mengimplementasikan metode injeksi.
2 metode penggantian
Di musim semi, Anda dapat menggunakan metode kacang tertentu untuk menggantikan metode kacang lainnya.
Misalkan ada metode getName () dalam buku untuk mendapatkan judul:
/*** judul buku*/nama string pribadi; string publik getName () {return name;}Kami sekarang membuat kacang baru, yang mengimplementasikan antarmuka MethodReplacer untuk menggantikan metode getName () dalam buku:
Kelas publik Book4 mengimplementasikan MethodReplacer {@Override Public Object Reimplement (Object Obj, Metode Metode, Object [] args) melempar Throwable {return "Alive"; }}Konfigurasi:
<bean id = "book3" p: name = "Bright Thousand Suns"> <diganti-metode nama = "getName" Replacer = "book4"/> </ bean> <bean id = "book4"/>
tes:
Buku buku = (buku) context.getBean ("book3"); assertequals ("living", book.getname ()); Meringkaskan
Di atas adalah implementasi metode injeksi atau penggantian dalam kerangka musim semi yang diperkenalkan oleh editor. Saya harap ini akan membantu semua orang. Jika Anda memiliki pertanyaan, silakan tinggalkan saya pesan. Editor akan membalas semua orang tepat waktu!