Hari ini saya terus mengimplementasikan AOP. Saya pribadi berpikir itu adalah cara yang paling fleksibel dan dapat diperluas. Ambil manajemen log sebagai contoh, menggunakan Formulir Anotasi Kustom Spring AOP untuk mengimplementasikan manajemen log. Tanpa basa -basi lagi, mulailah segera! Lai Lai
Saya akan mengatakan lagi tentang konfigurasi.
Apa yang harus ditambahkan di ApplicationContext-Mvc.xml
<MVC: Anotasi-Didorong /> <!-Mengaktifkan fungsi pemindaian komponen, secara otomatis memindai komponen yang dikonfigurasi melalui anotasi di bawah paket com.gcx dan subpackages-nya-> <konteks: komponen-scan-package basis = "com.gcx" /> <target-targets mana yang mendukung @Aspectj annotation-> <! Proxy-Target-Class false secara default. Jika kelas Anda mengimplementasikan antarmuka, buka proxy JDK. Jika tidak, buka CGLIB Proxy-> <!-Catatan: Disarankan untuk menggunakan proxy CGLIB untuk mode laba sederhana. Meskipun proxy dinamis JDK lebih cepat dari proxy cglib, kinerjanya tidak sebagus cglib-> <!-jika Anda tidak menulis proxy-target-class = "true" kalimatnya ok-> <aop: aspekj-autopproxy proxy-target-class = "true"/<!-bagian-> <bean id = "
Selanjutnya, mulailah menulis kode.
Buat entitas log
Public Class SystemLog {Private String ID; deskripsi string pribadi; metode string pribadi; LogType Panjang Pribadi; permintaan string pribadi; Private String ExceptionCode; string private exceptionDetail; Private String Params; Private String CreateBy; tanggal pribadi dibuat; string publik getId () {return id; } public void setid (string id) {this.id = id == null? null: id.trim (); } public String getDescription () {return description; } public void setDescription (string description) {this.description = description == null? null: description.trim (); } public String getMethod () {return Method; } public void setMethod (Metode String) {this.method = Method == null? null: method.trim (); } public long getLogType () {return logType; } public void setLogType (Long LogType) {this.logType = logType; } public string getRequestip () {return revandIp; } public void setRequStip (String requestip) {this.requestip = requestip == null? null: requestip.trim (); } public String getExceptionCode () {return ExceptionCode; } public void setExceptionCode (String ExceptionCode) {this.excepticode = exceptionCode == null? null: excepticode.trim (); } public String getExceptionDetail () {return exceptionDetail; } public void setExceptionDetail (string exceptionDetail) {this.exceptionDetail = exceptionDetail == null? null: exceptiondetail.trim (); } public string getParams () {return params; } public void setParams (string params) {this.params = params == null? null: params.trim (); } public String getCreateBy () {return createBy; } public void setCreateBy (String createBy) {this.createBy = createBy == null? null: createBy.trim (); } tanggal publik getCreateDate () {return createdate; } public void setCreateDate (tanggal dibuat) {this.createdate = createdate; }}Menulis Antarmuka DAO
Paket com.gcx.dao; import com.gcx.entity.systemlog; antarmuka publik SystemLogMapper {int deletebyprimarykey (ID string); int insert (SystemLog Record); int insertSelective (SystemLog Record); SystemLog SelectByPrimaryKey (ID String); int updateByPrimaryKey (SystemLog Record);}Menulis Lapisan Layanan
paket com.gcx.service; import com.gcx.entity.systemlog; antarmuka publik SystemLogService {int deletesystemlog (string id); int insert (SystemLog Record); int insertest (SystemLog Record); SystemLog SelectSystemlog (ID String); int updateSystemlog (SystemLog Record);}Tulis Layanan Implementasi Layanan Kelas IMPL
Paket com.gcx.service.impl; import javax.annotation.resource; impor org.springframework.stereotype.service; import com.gcx.annotation.log; import com.gcx.dao.systemlogmapper; impor com.gcx.entity.system.systemlogmapper; impor com.gcx.entity.systemlog; com.gcx.service.systemlogservice; @service ("SystemLogService") SystemLogServiceImpl mengimplementasikan SystemLogService {@Resource Private SystemLogMapper SystemLogMapper; @Override public int deletesystemlog (string id) {return systemlogmapper.deletyprimarykey (id); } @Override Insert int publik (SystemLog Record) {return systemlogmapper.insertSelective (Record); } @Override Public SystemLog SelectSyStemLog (ID String) {return SystemLogMapper.SelectByPrimaryKey (id); } @Override Public Int updateSystemLog (SystemLog Record) {return SystemLogMapper.UpdateByPrimaryKeyselective (Record); } @Override Public int insertTest (SystemLog Record) {return systemlogmapper.insert (Record); }}Di sini program dasar sudah selesai
Di bawah ini adalah anotasi khusus
Paket com.gcx.annotation; import java.lang.annotation.*; @target ({elementType.parameter, elementType.method}) @retention (retentionPolicy.runtime) @documented public @interface log { / ** Jenis operasi yang harus dilakukan, seperti: seperti: Operasi Public { / ** Jenis Operasi yang akan dilakukan, seperti: seperti: Operasi Public ** Public { / ** Jenis operasi yang harus dilakukan, seperti: seperti: Operasi Public ** Public (); / ** Operasi spesifik yang akan dilakukan, seperti: tambahkan pengguna **/ public string OperationName () default "";}Tuliskan potongan di bawah ini
Paket com.gcx.annotation; import java.lang.reflect.method; import java.util.date; import java.util.uuid; javax.annotation.resource; impor javax.servlet.http.httpservlete; org.aspectj.lang.joinpoint; impor org.aspectj.lang.proedingjointpoint; impor org.aspectj.lang.annotation.after; impor org.aspectj.lang.annotation.afterreturning; impor org.aspectj.Lang.annotation.AfterThrowing; org.aPoroids; org.aspectj.lang.annotation.aspect; impor org.aspectj.lang.annotation.Before; impor org.aspectj.lang.annotation.pointcut; import org.slf4j.logger; impor org.slf4j.loggerFactory; impor org.sperperfram.slf4j.loggerFactory; impor org.springfringfringfring.slf4j.loggerFactory; impor org.sperpringfringfram.slf4j.loggerFactory; impor org.springfringfringfring.slf4j.loggerFactory; impor org.springfringfringfring.slf4j.loggerFactory; impor org.springfringfringfring. com.gcx.entity.systemlog; import com.gcx.entity.user; import com.gcx.service.systemlogservice; import com.gcx.util.jsonutil;/** * @Author Yang Jian * @e-mail: email * @version dibuat waktu: 2015-10-19 kelas*/ @aspek @componentpublic kelas SystemLogaspect {// menyuntikkan layanan untuk menyimpan log ke database @resource // Saya menggunakan anotasi sumber daya di sini, umumnya menggunakan @Autowired. Perbedaan mereka. Jika saya punya waktu, saya akan menulis SystemLogService SystemLogService pribadi di blog berikutnya; private static final Logger Logger = LoggerFactory.getLogger (SystemLogaspect. Kelas); // Lapisan Pengontrol Titik Tangen @Pointcut ("Eksekusi (* com.gcx.controller ..*.* (..)")) public void controlleraspect () {}/*** pra-notification digunakan untuk mencegat @before ("@param pointpoint point point pointpoint (" @Before ("@param pointpoint point point @param) (" @Before ("@param pointpoint point @param pointpoint (" @before ("@param pointpoint point @param point @param) { System.out.println ("============================================================================================================================================= ================================================================ ================================================================ ================================================================ ================================================================ ================================================================ ================================================================= System.out.println ("================================================================================================================================ (ProsedingJoInpoint). System.out.println ("========================================================================================================================================================= Logger.info ("sekitar" + joinpoint + " /tuse time:" + (end - start) + "ms dengan pengecualian:" + e.getMessage ()); Httpservletrequest request = (servletRequestAttribute) requestContextholder.getRequestAttributes ()). GetRequest (); = User (); Class.forname (TargetName); method.getAnnotation (log.class) .OperationType (); System.out.println ("Metode Permintaan:" + (joinpoint.getTarget (). GetClass (). GetName () + "." + Joinpoint.getSignature (). GetName () + "()") + "." System. System.out.println (Permintaan IP: " + IP); LOG.SetMethod ((joinpoint.getTarget (). getClass (). getName () + "." + joinpoint.getSignature (). getName () + "()") + "." log.setParams (null); Log Logger.Error ("== Exception Post-Notification =="); System.out.println ("======= Jalankan pengontrol pemberitahuan pasca-return =========); if (logger.isInfoEnabled ()) {logger.info (" afterreturn " + pointpoint);}} / ** ** * Pemberitahuan pengecualian digunakan untuk mengintegrasikan log pengecualian * * PARPOP @PARPOP @param * PARPOP @paraP @paraP @parpoP @parap * "ControllerAspect ()", Throwing = "E") public void doafterthrowing (gabungan gabungan, lempar e) { /*httpservletRequest request = ((servletRequestAttributes) wista contextholder.getRequespession (getRequest (); sesi (joinpoint.getArgs ()! = null && joinpoint.getArgs (). Panjang> 0) {untuk (int i = 0; i <joinpoint.getArgs (). Length; i ++) {params += jsonutil.getjsonstr (ground.getArgs () [i]) +";"; Joinpoint.getTarget (). GetClass (). GetName (); (Mething.getName (). Equals (MethodName)) {class [] clazzs = method.getParameterTypes () /*============== output konsol =========* / System.out.println ("================ Pemberitahuan Pengecualian Pengecualian mulai =========================================================================================================================== ================================================================================================================================================================== ================================================================================================================================================================== ================================================================================================================================================================== System.out.println ("Informasi Pengecualian:" + E.GetMessage ()); OperationName); log.setid (uuid.randomuuid (). ToString ()); Log.setMethod ((joinpoint.getTarget (). getSclass (). getName () + "." + joinpoint.getSignature (). GetName () + "())); SystemLogService.Insert (log); System.out.println ("======== Pemberitahuan Pengecualian =========================;} {Pengecualian Excleon (// Logger LOGGER (" == {Pengecualian (Pengecualian, ex.getMessage ());} /*========================* / Logger.Error ("Metode Pengecualian: {} Kode Pengecualian: {} GetPlaps: {} Parameter: {}", getpoint.gettarget (). joinpoint.getSignature (). getName (), e.getClass (). getName (), e.getClass (). getName (), params);Saya telah banyak menulis di sini, termasuk pra-pemberitahuan, pemberitahuan surround, pasca-pemberitahuan, pemberitahuan pengecualian, dan pemberitahuan pasca-makanan. Tidak apa -apa jika saya tidak menulis semuanya dalam tulisan kami yang sebenarnya. Saya terbiasa menulis logika logging di post-log. Saya melihat bahwa beberapa pemberitahuan pra-log juga termasuk dalam pemberitahuan pra-log di internet, tetapi saya merasa lebih baik menulisnya dalam pemberitahuan pasca-log.
Mari kita mulai menambahkan anotasi khusus ke pengontrol! Lai
Paket com.gcx.controller; impor org.springframework.beans.factory.annotation.Autowired; impor org.springframework.stereotype.controller; impor org.springframework.web.bind.annotation.requestMapping; impor com.annnework.web.bind.annotation.requestMappappapping; Impor com.annan.annot.bind.annotation.requestMapping; impor com.annan.annot.notation com.gcx.service.userservice;@controller@requestMapping ("usercontroller") kelas publik usercontroller {@Autowired private userserverService UserService; @RequestMapping ("testaop") @log (OperationType = "Tambahkan Operasi:", OperationName = "Tambahkan Pengguna") public void testaop (string username, string password) {UserserVice.adduser (username, password); }}Tulis kelas tes di bawah ini
@Test public void testAop1 () {// Mulai Spring Container ApplicationContext ctx = new ClassPathXMLapPlicationContext (string baru [] {"classpath: applicationContext-mvc.xml", "classpath: applicationContext-datasource.xml"}); // Dapatkan Layanan atau Komponen Pengontrol UserController UserController = (UserController) ctx.getBean ("usercontroller"); usercontroller.testaop ("zhangsan", "123456"); }Data database:
Saya awalnya ingin menulis dua titik tangen, satu adalah lapisan layanan dan yang lainnya adalah lapisan pengontrol. Lapisan layanan digunakan untuk merekam informasi pengecualian, sedangkan lapisan pengontrol digunakan untuk merekam fungsi. Hasil berjalan adalah sebagai berikut.
Jika Anda melakukan ini, saya tidak tahu apakah efisiensi operasi baik dalam proyek yang sebenarnya. Silakan lihat daniu blog di sini untuk memberikan beberapa saran! Lai
Contoh penjelasan di atas dari metode anotasi kustom pegas AOP untuk mengimplementasikan manajemen log adalah semua konten yang saya bagikan dengan Anda. Saya harap Anda dapat memberi Anda referensi dan saya harap Anda dapat mendukung wulin.com lebih lanjut.