Artikel ini menunjukkan implementasi AOP menggunakan anotasi AspectJ dan konfigurasi XML di Spring
Berikut ini adalah proyek Java yang mengimplementasikan AOP menggunakan anotasi AspectJ
Pertama adalah file ApplicationContext.xml yang terletak di bawah ClassPath
<? XML Versi = "1.0" encoding = "utf-8"?> <beans xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/xmls xmlns: aop = "http://www.springframework.org/schema/aop" xmlns: tx = "http://www.springframework.org/schema/tx" xsi: schemalocation = "http:/schema.tx" http://www.springframework.org/schema/beans/spring-weans-2.5.xsd http://www.springframework.org/schema/aop http:/www.spramework.org/schema/aop http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"> <!-- Enable AspectJ support for Annotation --> <aop:aspectj-autoproxy/> <bean id="userManager"/> <bean ID = "SecurityHandler"/> </tobel>
Lalu ada antarmuka lapisan layanan dan kelas implementasi
paket com.jadyer.annotation; Public Interface UserManager {public void addUser (string username, string password); public void deluser (int userid); string publik findUserbyId (int userid); public void ModifyUser (int userid, string nama pengguna, kata sandi string); } / *** UserManager di atas adalah antarmuka lapisan layanan* UserManagerImpl berikut adalah kelas implementasi antarmuka lapisan layanan* / paket com.jadyer.annotation; Public Class UserManagerImpl mengimplementasikan UserManager {public void addUser (string userName, string password) {System.out.println ("------- userManagerImpl.adduser () dipanggil -----"); } public void deluser (int userid) {System.out.println ("-------- UserManagerImpl.Deluser () dipanggil ------"); } public String findUserbyId (int userId) {System.out.println ("------ UserManagerImpl.FindUserbyId () dipanggil ------"); kembalikan "kehidupan berwajah besi"; } public void ModifyUser (int userId, string username, string password) {System.out.println ("------- UserManagerImpl.ModifyUser () dipanggil ------"); }} Berikutnya adalah kelas entri yang ditandai dengan aspekj
paket com.jadyer.annotation; impor org.aspectj.lang.annotation.after; impor org.aspectj.lang.annotation.aspect; impor org.aspectj.lang.annotation.pointcut; @Aspect Public Class SecurityHandler { /** * Tentukan pointcut * @see pointcut nama pointcut adalah addAddMethod (). Metode ini tidak memiliki nilai pengembalian dan parameter* @See Metode ini adalah pengidentifikasi dan tidak menyebutnya*/@pointcut ("Eksekusi (* Tambah* (..))") // Cocokkan semua metode yang dimulai dengan menambahkan addAddMethod private void () {}; /*** Tentukan saran* @see menunjukkan langganan pointcut mana yang berlaku untuk di titik gabung*/// @sebelum ("addAddmethod ()") @after ("addAddmethod ()") void private checksecurity () {System.out.println ("------- 【CheckSecurity () {System.Out.pintln (" ------- 【Cecururity adalah Cecurity 【【【【{Systems.pintln ("------ }} Akhirnya, kelas tes klien
paket com.jadyer.annotation; impor org.springframework.context.applicationContext; impor org.springframework.context.support.classpathxmlapplicationContext; /*** Dukungan Musim Semi untuk AOP: Mengadopsi metode anotasi* @see ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Prasyarat: Karena ini adalah proxy dinamis JDK, jika Anda ingin menghasilkan proxy, kelas harus mengimplementasikan antarmuka* @see jika kelas tidak memiliki antarmuka implementasi dan masih menggunakan implementasi AOP default Spring, sehingga kesalahan akan terjadi* @Lihat Kelas yang biasanya perlu menghasilkan outs proxy adalah semua kelas level-level, sehingga suatu antarmuka akan terjadi. Yaitu, kembangkan kebiasaan pemrograman berorientasi antarmuka* @see ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Added Annotation support * @see * SPRING_HOME//dist//spring.jar * @see * SPRING_HOME//lib//log4j//log4j-1.2.14.jar * @see * SPRING_HOME//lib//jakarta-commons//commons-logging.jar * @see * SPRING_HOME//lib//aspectj//*.jar * @see 2. Modularize the cross-slicing concerns and establish SecurityHandler.java * @see 3. Use annotations to specify SecurityHandler as Aspect * @see 4. Use annotations to define Advice and Pointcut * @see 5. Enable AspectJ support for Annotation, and configure the target class and Aspect class into the IoC container* @see 6. Development client* @see --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- (UserManager) factory.getBean ("UserManager"); UserManager.adduser ("Zhang Qiling", "02200059"); }} Berikut ini adalah proyek Java yang mengimplementasikan AOP menggunakan file konfigurasi XML
Pertama adalah file ApplicationContext-CGLIB.XML yang terletak di direktori root SRC
<? XML Versi = "1.0" encoding = "utf-8"?> <beans xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/xmls xmlns: aop = "http://www.springframework.org/schema/aop" xmlns: tx = "http://www.springframework.org/schema/tx" xsi: schemalocation = "http:/schema.tx" http://www.springframework.org/schema/beans/spring-weans-2.5.xsd http://www.springframework.org/schema/aop http:/www.spramework.org/schema/aop http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd-<!-paksa proxy cglib-> <!-<aopj-aopj-aUt-autprox = id="userManager"/> <bean id="securityHandler"/> <aop:config> <aop:aspect id="securityAspect" ref="securityHandler"> <aop:pointcut id="addAddMethod" expression="execution(* add*(..))"/> <aop:before method="checkSecurity" pointcut-ref="addAddMethod"/> </aop:aspect> </aop: config> </bangs> <!- Cocokkan semua metode yang dimulai dengan add (*add*(..)) cocokkan semua metode dari semua kelas di bawah com.jadyer.servcices.impl Eksekusi Paket (*com.jadyer.servcices.impl.*.*(..)) semua metode add in com.jadyer.servcices.implic. com.jadyer.services.impl.*. Tambah*(..)) || eksekusi (*com.jadyer.services.impl.*. del*(..)) ->
Lalu ada antarmuka lapisan layanan dan kelas implementasi
paket com.jadyer.cglib; Public Interface UserManager {public void addUser (string username, string password); public void deluser (int userid); string publik findUserbyId (int userid); public void ModifyUser (int userid, string nama pengguna, kata sandi string); } / *** UserManager di atas adalah antarmuka lapisan layanan* UserManagerImpl berikut adalah kelas implementasi antarmuka lapisan layanan* / paket com.jadyer.cglib; Public Class UserManagerImpl {// mengimplementasikan UserManager {public void addUser (string username, string password) {System.out.println ("------- userManagerImpl.adduser () dipanggil -----"); } public void deluser (int userId) {System.out.println ("-------- UserManagerImpl.Deluser () dipanggil -----"); } public String findUserbyId (int userId) {System.out.println ("------ UserManagerImpl.FindUserbyId () dipanggil -----"); mengembalikan "Zhang San"; } public void ModifyUser (int userId, string username, string password) {System.out.println ("------- userManagerImpl.modifyUser () dipanggil -----"); }} Berikutnya adalah kelas entri yang ditentukan dalam ApplicationContext-cglib.xml
paket com.jadyer.cglib; impor org.aspectj.lang.joinpoint; /*** Lewati informasi panggilan klien ke saran* @see Anda dapat menambahkan parameter joinpoint ke saran untuk mendapatkan nama metode dan nilai parameter dari panggilan klien* @see di masa depan, ada lebih sedikit kasus murni menggunakan AOP untuk menulis hal -hal seperti ini. Kami terutama menggunakan transaksi yang disediakan oleh Spring* @See Anda bisa tahu tentang ini. Berikut ini adalah kode sampel */ kelas publik SecurityHandler {private void checksecurity (gabungan joinpoint) {for (int i = 0; i <joinpoint.getArgs (). Length; i ++) {System.out.println (joinpoint.getArgs () [i]); // Dapatkan nilai parameter dari metode yang dipanggil oleh klien} System.out.println (joinpoint.getSignature (). GetName ()); // Dapatkan nama metode yang dipanggil oleh klien System.out.println ("------ [CheckSecurity dipanggil] ------"); }} Akhirnya, kelas tes klien
paket com.jadyer.cglib; impor org.springframework.context.applicationContext; impor org.springframework.context.support.classpathxmlapplicationContext; /** * @melihat ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- warisan, yang terbaik adalah tidak menggunakan deklarasi akhir untuk kelas target* @see ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Karena target yang kami proxy umumnya adalah objek bisnis* @see ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- klien kelas publik {public static void main (string [] args) {applicationContext factory = new ClassPathXMLapPlicationContext ("ApplicationContext-Cglib.xml"); // Ketika UserManagerImpl mengimplementasikan antarmuka UserManager, Spring akan secara otomatis menggunakan JDK Dynamic Proxy // Jika proyek telah memperkenalkan Perpustakaan CGLIB dan memaksa penggunaan proxy CGLIB dalam file konfigurasi, Spring hanya akan menggunakan proxy cglib // userManager UserManager = (UserManager) factory.getbean. " // Karena UserManagerImpl tidak mengimplementasikan antarmuka UserManager saat ini, antarmuka UserManager tidak dapat digunakan dalam tipe penerima.//Plib Perpustakaan telah diperkenalkan dalam proyek. Meskipun proxy CGLIB tidak dipaksa untuk digunakan dalam file konfigurasi, Spring akan secara otomatis menggunakan cglib proxy userManagerImpl userManager = (userManagerImpl) factory.getBean ("userManager"); UserManager.adduser ("Wu Sansheng", "02200059"); }}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.