توضح هذه المقالة تنفيذ AOP باستخدام توضيح الجوانب وتكوين XML في الربيع
ما يلي هو مشروع Java الذي ينفذ AOP باستخدام التعليقات التوضيحية الجانبية
الأول هو ملف ApplicationContext.xml الموجود تحت ClassPath
<؟ xmlns: aop = "http://www.springframework.org/schema/aop" http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/Aop/Aop-2 http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5 id = "SecurityHandler"/> </bans>
ثم هناك واجهة طبقة الخدمة وفئة التنفيذ
حزمة com.jadyer.annotation ؛ الواجهة العامة usermanager {public void adduser (اسم المستخدم ، كلمة مرور السلسلة) ؛ Deluser public void (int userId) ؛ السلسلة العامة FindUserById (int userId) ؛ ModifyUser public void (int userId ، اسم مستخدم السلسلة ، كلمة مرور السلسلة) ؛ } / *** usermanager أعلاه هو واجهة طبقة الخدمة* usermanagerimpl التالية هي فئة التنفيذ لواجهة طبقة الخدمة* / package com.jadyer.annotation ؛ الطبقة العامة usermanagerimpl تنفذ usermanager {public void adduser (اسم المستخدم سلسلة ، كلمة مرور السلسلة) {system.out.println ("------- usermanagerimpl.adduser () تم استدعاء -----") ؛ } public void deluser (int userId) {system.out.println ("-------- usermanagerimpl.deluser () تم استدعاء ------") ؛ } السلسلة العامة FindUserById (int userId) {system.out.println ("------ usermanagerimpl.finduserbyid () تم استدعاؤها ------") ؛ العودة "الحياة ذات الوجه الحديد" ؛ } public void modifyUser (int userId ، اسم مستخدم السلسلة ، كلمة مرور السلسلة) {system.out.println ("------- usermanagerimpl.modifyuser () تم استدعاء ------") ؛ }} التالي هو فئة الدخول التي تحمل علامة مع SideJ
حزمة com.jadyer.annotation ؛ استيراد org.aspectj.lang.annotation.after ؛ استيراد org.aspectj.lang.annotation.Aspect ؛ استيراد org.aspectj.lang.annotation.pointCut ؛ Aspect Public Class SecurityHandler { /** * حدد PointCut * see @pointcut اسم pointcut هو addaddmethod (). لا تحتوي هذه الطريقة على قيمة الإرجاع والمعلمات* see هذه الطريقة هي معرف ولا تسميها*/ @pointcut ("التنفيذ (* إضافة* (..))") /*** تحديد النصيحة* يشير see إلى الاشتراكات التي تنطبق عليها نصيحاتنا على نقاط Joinpoints*/// @ @قبل ("addaddmethod ()") @بعد AddaddMethod () ") private void checksecurity () }} أخيرًا ، فئة اختبار العميل
حزمة com.jadyer.annotation ؛ استيراد org.springframework.context.applicationContext ؛ استيراد org.springframework.context.support.classpathxmlapplicationContext ؛ /*** دعم الربيع لـ AOP: يعتمد طريقة التعليقات التوضيحية* seee -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- But there is a prerequisite: نظرًا لأنه وكيل ديناميكي JDK ، إذا كنت ترغب في إنشاء وكيل ، فيجب على الفصل تنفيذ واجهة* see @إذا لم يكن لدى الفصل واجهة الأدوات ولا تزال تستخدم تطبيق AOP الافتراضي في Spring ، فسيحدث خطأ* @Seee الفصول التي عادة ما تحتاج إلى إنشاء وكيل من الفصول الدراسية على مستوى الخدمة. وهذا هو ، تطوير عادة البرمجة الموجهة للواجهة* seee --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- تمت إضافة دعم التعليقات التوضيحية * spring_home // dist // spring.jar * seee * spring_home // lib // log4j // log4j-1.2.14.jar * spring_home // lib // jakarta-commons // commons-logging.jar * @spring_home // lib // الشواغل المتبادلة وتأسيس SecurityHandler.java * see 3. استخدم التعليقات التوضيحية لتحديد SecurityHandler كجوانب * see 4. استخدم التعليقات التوضيحية لتحديد المشورة و pointcut * see 5. --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- (UserManager) Factory.getBean ("UserManager") ؛ usermanager.adduser ("Zhang Qiling" ، "02200059") ؛ }} فيما يلي مشروع Java الذي ينفذ AOP باستخدام ملفات تكوين XML
الأول هو ملف ApplicationContext-cglib.xml الموجود في الدليل الجذر لـ SRC
<؟ xmlns: aop = "http://www.springframework.org/schema/aop" http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/Aop/Aop-2 http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd "> <! id = "usermanager"/> <bean id = "securityHandler"/> <aOP: config> <aop: side id = "securityaspect" ref = "securityHandler"> <aop: pointcut id = "addaddmethod" expression = "execution (* ..)) </aop: config> </beans> <!- تطابق جميع الطرق بدءًا من إضافة (*إضافة*(..)) تطابق جميع طرق جميع الفئات تحت com.jadyer.servcices.impl تنفيذ الحزمة (*com.jadyer.servcices.impl.*.*(..)) com.jadyer.services.impl.*. إضافة*(..)) || التنفيذ (*com.jadyer.services.impl.*. del*(..)) ->
ثم هناك واجهة طبقة الخدمة وفئة التنفيذ
حزمة com.jadyer.cglib ؛ الواجهة العامة usermanager {public void adduser (اسم المستخدم ، كلمة مرور السلسلة) ؛ Deluser public void (int userId) ؛ السلسلة العامة FindUserById (int userId) ؛ ModifyUser public void (int userId ، اسم مستخدم السلسلة ، كلمة مرور السلسلة) ؛ } / *** usermanager أعلاه هو واجهة طبقة الخدمة* usermanagerimpl التالية هي فئة التنفيذ لواجهة طبقة الخدمة* / package com.jadyer.cglib ؛ الفئة العامة usermanagerimpl {// تنفذ usermanager {public void adduser (string username ، string password) {system.out.println ("------- usermanagerimpl.adduser () تم استدعاء -----") ؛ } public void deluser (int userId) {system.out.println ("-------- usermanagerimpl.deluser () تم استدعاء -----") ؛ } السلسلة العامة FindUserById (int userId) {system.out.println ("------ usermanagerimpl.finduserbyid () تم استدعاؤها -----") ؛ إرجاع "Zhang San" ؛ } public void modifyuser (int userId ، اسم مستخدم السلسلة ، كلمة مرور السلسلة) {system.out.println ("------- usermanagerimpl.modifyuser () تم استدعاء -----") ؛ }} التالي هو فئة الإدخال المحددة في ApplicationContext-cglib.xml
حزمة com.jadyer.cglib ؛ استيراد org.aspectj.lang.joinpoint ؛ /*** قم بتمرير معلومات استدعاء العميل إلى النصيحة* see ، يمكنك إضافة معلمة JoinPoint إلى النصيحة للحصول على اسم الطريقة وقيمة المعلمة لمكالمة العميل* see في المستقبل ، هناك عدد أقل من حالات AOP الكاملة لكتابة أشياء مثل هذا. نستخدم المعاملات التي توفرها SPRING* see بشكل أساسي. فيما يلي نموذج رمز */ الفئة العامة SecurityHandler {private void checksecurity (JoinPoint JoinPoint) {for (int i = 0 ؛ i <joinpoint.getargs (). // احصل على قيمة المعلمة للطريقة التي يطلق عليها العميل} system.out.println (JoinPoint.getSignature (). getName ()) ؛ // احصل على اسم الأسلوب الذي يطلق عليه نظام العميل. }} أخيرًا ، فئة اختبار العميل
حزمة com.jadyer.cglib ؛ استيراد org.springframework.context.applicationContext ؛ استيراد org.springframework.context.support.classpathxmlapplicationContext ؛ /** * @يرى ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ Since it is الميراث ، من الأفضل عدم استخدام الإعلان النهائي للفئة المستهدفة* seee ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- لأن الأهداف التي نقوم بالوكالة هي عمومًا كائنات عمل* @see --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ Client Client {public static void main (string [] args) {applicationContext factory = new ClassPathxMlapplicationContext ("ApplicationContext-cglib.xml") ؛ // عندما يقوم UserManagerImpl بتنفيذ واجهة UserManager ، سيستخدم Spring تلقائيًا الوكيل الديناميكي JDK // إذا كان المشروع قد قدم مكتبة CGLIB وأجبر على استخدام وكيل CGLIB في ملف التكوين ، فإن Spring سوف يستخدم فقط cglib proxy // usermanager usermer = (usermanager). // نظرًا لأن UserManagerImpl لا تنفذ واجهة UserManager في هذا الوقت ، فلا يمكن استخدام واجهة UserManager في نوع الاستقبال. على الرغم من أن وكيل CGLIB لا يجبر على استخدامه في ملف التكوين ، إلا أن Spring سيستخدم تلقائيًا CGLIB Proxy UserManagerImpl UserManager = (UserManagerimpl) Factory.getBean ("Usermanager") ؛ usermanager.adduser ("Wu Sansheng" ، "02200059") ؛ }}ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.