في بعض مشاريع Java، يتم استخدام MapperScannerConfigurer لدمج mybatis وspring. تقوم هذه الفئة تلقائيًا بإنشاء فئات الوكيل الديناميكي القائمة على الواجهة من خلال الوكيل العكسي.
في ضوء ذلك، تحلل هذه المقالة بإيجاز الوكيل الديناميكي لجافا.
تستخدم هذه المقالة وكيلاً ديناميكيًا لمحاكاة المعترض الذي يعالج المعاملات.
واجهة:
الواجهة العامة UserService { public void addUser();}فئة التنفيذ:
public class UserServiceImpl Implements UserService { public void addUser() { System.out.println("add user"); } public void RemoveUser() { System.out.println("إزالة المستخدم" } public void searchUser() { System.out.println("مستخدم البحث" }}هناك طريقتان لتنفيذ وكيل جافا الديناميكي
1. الوكيل الديناميكي الذي يأتي مع jdk
لاستخدام الوكيل الديناميكي الذي يأتي مع jdk، تحتاج إلى فهم واجهة InvocationHandler وفئة Proxy، وكلاهما ضمن الحزمة java.lang.reflect.
مقدمة معالج الاستدعاء:
InvocationHandler هي الواجهة التي ينفذها معالج الاستدعاء لمثيل الوكيل.
يحتوي كل مثيل وكيل على InvocationHandler مرتبط. عند استدعاء أسلوب على مثيل وكيل، يستدعي هذا الأسلوب أسلوب استدعاء InvocationHandler.
مقدمة الوكيل:
يوفر الوكيل أساليب ثابتة لإنشاء فئات ومثيلات الوكيل الديناميكية.
مثال (محاكاة معالجة معاملات AOP):
public class TransactionInterceptor Implements InvocationHandler { public void setTarget(Object target) { this.target = target } @Override public Object invoc(Object proxy, Method Method, Object[] args) throws Throwable { System.out.println; ("بدء المعاملة")؛ invoc(target, args);رمز الاختبار:
public class TestDynamicProxy { @Test public void testJDK() { TransactionInterceptor treatmentInterceptor = new UserService userService = new UserServiceImpl(); .getClassLoader()، userService.getClass().getInterfaces(), treatmentInterceptor); userServiceProxy.addUser();نتائج الاختبار:
ابدأ المعاملة، أضف معاملة نهاية المستخدم
من الواضح أنه عندما نقوم باستدعاء أسلوب من خلال فئة وكيل userServiceProxy، سيتم فتح المعاملة وإغلاقها قبل وبعد استدعاء الأسلوب.
2. مكتبة الطرف الثالث cglib
CGLIB هي مكتبة قوية وعالية الأداء وعالية الجودة لإنشاء الأكواد لتوسيع فئات Java وتنفيذ واجهات Java في وقت التشغيل.
الفرق الأكبر بينه وبين الوكيل الديناميكي لـ JDK هو:
الوكيل الديناميكي لـ JDK مخصص للواجهات، بينما يقوم cglib بتنفيذ الوكيل للفئات. مبدأ cglib هو إنشاء فئة فرعية للفئة المستهدفة المحددة واستبدال الطرق لتحقيق التحسين. ومع ذلك، نظرًا لاستخدام الميراث، لا يمكن أن تكون الفئة المعدلة وكيل.
رمز المثال هو كما يلي:
public class UserServiceCallBack Implements MethodInterceptor { @Override public Object Intercept(Object o, Method Method, Object[] args, MethodProxymethodProxy) throws Throwable { System.out.println("بدء المعاملة بواسطة cglib"); ); System.out.println("إنهاء المعاملة بواسطة cglib");رمز الاختبار:
public class TestDynamicProxy { @Test public void testCGLIB() { Enhancer Enhancer = new Enhancer(); Enhancer.setSuperclass(UserServiceImpl.class); ;نتائج الاختبار:
بدء المعاملة بواسطة cglibadd userend المعاملة بواسطة cglib
يمكن للقراء المهتمين اختبار الأمثلة الموجودة في هذه المقالة، وأعتقد أنهم سيستفيدون كثيرًا.