วันนี้ฉันยังคงใช้ AOP ต่อไป โดยส่วนตัวแล้วฉันคิดว่ามันเป็นวิธีที่ยืดหยุ่นและขยายได้มากที่สุด ใช้การจัดการบันทึกเป็นตัวอย่างโดยใช้แบบฟอร์มคำอธิบายประกอบฤดูใบไม้ผลิ AOP ที่กำหนดเองเพื่อใช้การจัดการบันทึก โดยไม่ต้องกังวลใจต่อไปเริ่มทันที! - -
ฉันจะพูดอีกครั้งเกี่ยวกับการกำหนดค่า
สิ่งที่ต้องเพิ่มใน ApplicationContext-mvc.xml
<MVC: คำอธิบายประกอบที่ขับเคลื่อนด้วย /> <!-เปิดใช้งานฟังก์ชั่นการสแกนส่วนประกอบ, สแกนส่วนประกอบโดยอัตโนมัติที่กำหนดค่าผ่านคำอธิบายประกอบภายใต้แพ็คเกจ com.gcx และแพ็คเกจย่อย-> <บริบท: ส่วนประกอบ-สแกนแพ็คเกจ = "com.gcx" /> <! Proxy-target-class เป็นเท็จโดยค่าเริ่มต้น หากคลาสของคุณใช้อินเทอร์เฟซให้ไปที่พร็อกซี JDK ถ้าไม่ไปที่ CGLIB Proxy-> <!-หมายเหตุ: ขอแนะนำให้ใช้พร็อกซี CGLIB สำหรับโหมดกำไรอย่างง่าย แม้ว่าพร็อกซีไดนามิกของ JDK นั้นเร็วกว่าพร็อกซี CGLIB แต่ประสิทธิภาพของมันก็ไม่ดีเท่ากับ cglib-> <!-ถ้าคุณไม่เขียนพร็อกซี-เป้าหมาย-เป้าหมาย = "จริง" ประโยคก็โอเค-> <aop: Aspectj-autopproxy proxy-taret-class = "True"/> <
ถัดไปเริ่มเขียนรหัส
สร้างเอนทิตีบันทึก
SystemLog คลาสสาธารณะ {รหัสสตริงส่วนตัว; คำอธิบายสตริงส่วนตัว; วิธีสตริงส่วนตัว Logtype ยาวส่วนตัว; การร้องขอสตริงส่วนตัว; รหัสข้อยกเว้นสตริงส่วนตัว; ข้อยกเว้นสตริงส่วนตัว พารามิเตอร์สตริงส่วนตัว; สตริงส่วนตัว createby; วันที่ส่วนตัวสร้างขึ้น สตริงสาธารณะ getId () {return id; } โมฆะสาธารณะ setId (string id) {this.id = id == null? null: id.trim (); } สตริงสาธารณะ getDescription () {return คำอธิบาย; } โมฆะสาธารณะ setDescription (คำอธิบายสตริง) {this.description = คำอธิบาย == null? null: description.trim (); } สตริงสาธารณะ getMethod () {วิธีการส่งคืน; } โมฆะสาธารณะ setMethod (วิธีการสตริง) {this.method = method == null? null: method.trim (); } สาธารณะยาว getLogType () {return logType; } โมฆะสาธารณะ setLogType (Long LogType) {this.logType = logType; } สตริงสาธารณะ getRequestip () {return requestip; } โมฆะสาธารณะ setRequestip (requestip สตริง) {this.requestip = requestip == null? null: requestip.trim (); } สตริงสาธารณะ getExceptionCode () {return exceptionCode; } โมฆะสาธารณะ setExceptionCode (String ExceptionCode) {this.exceptionCode = ExceptionCode == NULL? NULL: ExceptionCode.Trim (); } สตริงสาธารณะ getExceptionDetail () {return exceptionDetail; } โมฆะสาธารณะ setExceptionDetail (String ExceptionDetail) {this.exceptionDetail = ExceptionDetail == null? NULL: ExceptionDetail.Trim (); } สตริงสาธารณะ getParams () {return params; } โมฆะสาธารณะ setParams (พารามิเตอร์สตริง) {this.params = params == null? null: params.trim (); } สตริงสาธารณะ getCreateBy () {return createBy; } โมฆะสาธารณะ setCreateBy (String createBy) {this.createBy = createBy == null? null: createby.trim (); } วันที่สาธารณะ getCreatedate () {return complementate; } โมฆะสาธารณะ setCreatedate (วันที่ที่สร้างขึ้น) {this.createdate = สร้างขึ้น; -การเขียนอินเทอร์เฟซ DAO
แพ็คเกจ com.gcx.dao; นำเข้า com.gcx.entity.systemlog; อินเตอร์เฟสสาธารณะ SystemlogMapper {int deleteByPrimaryKey (รหัสสตริง); int insert (Systemlog Record); int insertSelective (SystemLog Record); Systemlog SelectByPrimaryKey (String ID); intupterbyPrimaryKey (SystemLog Record);}การเขียนเลเยอร์บริการ
แพ็คเกจ com.gcx.service; นำเข้า com.gcx.entity.systemlog; Interface SystemlogService {int deletesystemlog (String ID); int insert (Systemlog Record); int inserttest (Systemlog Record); SystemLog SelectSystemLog (String ID); int updatesystemlog (Systemlog Record);}เขียนคลาสการใช้บริการการใช้งาน ServiceImpl
แพ็คเกจ com.gcx.service.impl; นำเข้า Javax.annotation.resource; นำเข้า org.springframework.stereotype.service; นำเข้า com.gcx.annotation.log; นำเข้า com.gcx.dao.systemlogmapper; com.gcx.service.systemlogservice; @Service ("SystemLogService") ระดับสาธารณะ SystemlogServiceImpl ใช้ SystemLogService {@Resource Private SystemlogMapper SystemlogMapper; @Override public int deletesystemlog (String id) {return systemlogmapper.deleteByPrimaryKey (id); } @Override INT INT สาธารณะ (SystemLog Record) {ส่งคืน SystemLogMapper.InsertSelective (บันทึก); } @Override Public Systemlog SelectSystemLog (String ID) {ส่งคืน SystemLogMapper.SelectByPrimaryKey (ID); } @Override Public Int UpdatesystemLog (SystemLog Record) {ส่งคืน SystemLogMapper.updateByPrimaryKeySelective (บันทึก); } @Override public int intertest (SystemLog Record) {return systemlogmapper.insert (บันทึก); -ที่นี่โปรแกรมพื้นฐานเสร็จสิ้น
ด้านล่างนี้เป็นคำอธิบายประกอบที่กำหนดเอง
แพ็คเกจ com.gcx.annotation; นำเข้า java.lang.annotation.*; @target ({elementtype.parameter, elementtype.method}) @retention / ** การดำเนินการเฉพาะที่จะดำเนินการเช่น: เพิ่มผู้ใช้ **/ การดำเนินการสตริงสาธารณะ () ค่าเริ่มต้น "";}เขียนตัดด้านล่าง
แพ็คเกจ com.gcx.annotation; นำเข้า java.lang.reflect.method; นำเข้า java.util.date; นำเข้า java.util.uuid; นำเข้า javax.annotation.resource; นำเข้า Javax.servlet.http.httpservlequest; org.aspectj.lang.joinpoint; นำเข้า org.aspectj.lang.proceedingjoinpoint; นำเข้า org.aspectj.lang.annotation.after; นำเข้า org.aspectj.lang.annotation.Anturning; org.aspectj.lang.annotation.aspect; นำเข้า org.aspectj.lang.annotation.before; นำเข้า org.aspectj.lang.annotation.pointcut; นำเข้า org.slf4j.logger; นำเข้า org.slf4j.loggerforthory; com.gcx.entity.systemlog; นำเข้า com.gcx.entity.user; นำเข้า com.gcx.service.systemlogservice; นำเข้า com.gcx.util.jsonutil;/** * @author Yang Jian * @e-mail: อีเมล คลาส*/ @ASPASS @ComponentPublic คลาส SystemLogaspect {// Inject Service เพื่อบันทึกบันทึกลงในฐานข้อมูล @Resource // ฉันใช้คำอธิบายประกอบทรัพยากรที่นี่โดยทั่วไปโดยใช้ @Autowired ความแตกต่างของพวกเขา ถ้าฉันมีเวลาฉันจะเขียน SystemLogService SystemLogService ส่วนตัวในบล็อกที่ตามมา Logger Logger สุดท้ายคงที่ส่วนตัว = loggerFactory.getLogger (SystemLogaspect. class); // Layer Layer Tangent Point @PointCut ("Execution (* com.gcx.controller ..*.* (.. )") โมฆะสาธารณะคอนโทรลเลอร์สปริด () {}/*** การแจ้งเตือนล่วงหน้าจะใช้เพื่อสกัดกั้นเลเยอร์คอนโทรลเลอร์) System.out.println ("=================================================================================================================== - - - - - - System.out.println ("======================================================================================================== (การดำเนินการ joinpoint). proceed (); System.out.println ("============================================================================= logger.info ("รอบ" + joinpoint + " /tuse เวลา:" + (end - start) + "MS ยกเว้น:" + e.getMessage ()); HttpservletRequest Request = (servletrequestattributes) requestcontextholder.getRequestattributes ()). getRequest (); = ผู้ใช้ใหม่ (); class.forname (TargetName); Method.getannotation (log.class) .OperationType (); System.out.println ("วิธีการร้องขอ:" + (joinpoint.getTarget (). getClass (). getName () + "." + joinpoint.getSignature (). getName () + "()") System.out.println ("ขอ IP:" IP); log.setMethod ((joinpoint.getTarget (). getClass (). getName () + "." + joinpoint.getSignature (). getName () + "()") + " + OperationType); log.setexceptiondetail (null); Catch (Exception E) {// บันทึก logger logs log.error ("== ข้อยกเว้นหลังการแจ้งเตือน =="); System.out.println ("====== Execute Controller Post-Return Notification ========); ถ้า (logger.isinfoenabled ()) {logger.info (" AfterReturn " + joinPoint);}} / ** ** * "ControllerAspect ()", การโยน = "e") โมฆะสาธารณะ doafterthrowing (joinpoint joinpoint, tholdable e) { /*httpservletrequest Request = (servletrequestattributes) requestcontextholder.getRequestattributes () Session.getAttribute (WebConstants.current_user); (joinpoint.getArgs ()! = null && joinpoint.getArgs (). ความยาว> 0) {สำหรับ (int i = 0; i <joinpoint.getArgs (). ความยาว; joinpoint.getTarget (). getClass (). getName (); {ถ้า method.getName (). เท่ากับ (เมธอด)) {คลาส [] clazzs = method.getParameterTypes (); /*============== เอาท์พุทคอนโซล ========* / System.out.println ("================ การแจ้งเตือนข้อยกเว้น start ======================================================================================================== - - - System.out.println ("ข้อมูลข้อยกเว้น:" + e.getMessage ()); System.out.println ("ผู้ร้องขอ:" + user.getName ()); log.setId (uuid.randomuuid (). toString ()); log.setMethod (joinpoint.getTarget (). getClass (). getName () + "." SystemLogService.Insert (log); System.out.println ("======== การแจ้งเตือนข้อยกเว้นสิ้นสุด ==========================; Ex.getMessage ());} /*==========================* / logger.error ("วิธีการยกเว้น: {} รหัสข้อยกเว้น: {} ข้อมูลข้อยกเว้น: {} พารามิเตอร์: {}" e.getClass (). getName (), e.getClass (). getName (), params);ฉันได้เขียนไว้มากมายที่นี่รวมถึงการแจ้งเตือนล่วงหน้าการแจ้งเตือนรอบ ๆ การแจ้งเตือนหลังการแจ้งเตือนข้อยกเว้นและการแจ้งเตือนหลังการทำอาหาร ไม่เป็นไรถ้าฉันไม่เขียนทั้งหมดในการเขียนจริงของเรา ฉันเคยเขียนตรรกะของการบันทึกในโพสต์ล็อก ฉันเห็นว่าการแจ้งเตือนล่วงหน้าบางส่วนนั้นรวมอยู่ในการแจ้งเตือนล่วงหน้าบนอินเทอร์เน็ต แต่ฉันรู้สึกว่ามันดีกว่าที่จะเขียนในการแจ้งเตือนหลังล็อก
มาเริ่มเพิ่มคำอธิบายประกอบที่กำหนดเองให้กับคอนโทรลเลอร์! -
แพ็คเกจ com.gcx.controller; นำเข้า org.springframework.beans.factory.annotation.autowired; นำเข้า org.springframework.stereotype.controller; นำเข้า org.springframework.web.bind.annotation. com.gcx.service.userservice;@controller@requestmapping ("usercontroller") คลาสสาธารณะ userController {@autoWired Userservice Userservice; @RequestMapping ("testaop") @log (OperationType = "เพิ่มการดำเนินการ:", OperationName = "เพิ่มผู้ใช้") โมฆะสาธารณะ Testaop (ชื่อผู้ใช้สตริง, รหัสผ่านสตริง) {userservice.adduser (ชื่อผู้ใช้, รหัสผ่าน); -เขียนคลาสทดสอบด้านล่าง
@Test โมฆะสาธารณะ Public Testaop1 () {// เริ่มต้นสปริงคอนเทนเนอร์ ApplicationContext CTX = ใหม่ classPathxMlApplicationContext (สตริงใหม่ [] {"classPath: ApplicationContext-mvc.xml", "classpath: ApplicationContext-datasource.xml"}); // รับบริการหรือส่วนประกอบคอนโทรลเลอร์ userController userController = (userController) ctx.getBean ("usercontroller"); usercontroller.testaop ("จาง", "123456"); -ข้อมูลฐานข้อมูล:
ตอนแรกฉันต้องการเขียนสองจุดแทนเจนต์หนึ่งคือเลเยอร์บริการและอีกอันคือเลเยอร์คอนโทรลเลอร์ เลเยอร์บริการใช้เพื่อบันทึกข้อมูลข้อยกเว้นในขณะที่เลเยอร์คอนโทรลเลอร์ถูกใช้เพื่อบันทึกฟังก์ชั่น ผลการทำงานมีดังนี้
หากคุณทำสิ่งนี้ฉันไม่ทราบว่าประสิทธิภาพการดำเนินงานดีในโครงการจริงหรือไม่ โปรดดู Daniu ของบล็อกที่นี่เพื่อให้คำแนะนำ! -
ตัวอย่างข้างต้นคำอธิบายของวิธีการอธิบายประกอบฤดูใบไม้ผลิ AOP ที่กำหนดเองเพื่อใช้การจัดการบันทึกเป็นเนื้อหาทั้งหมดที่ฉันแบ่งปันกับคุณ ฉันหวังว่าคุณจะให้ข้อมูลอ้างอิงและฉันหวังว่าคุณจะสนับสนุน wulin.com มากขึ้น