1. Режим агента
Прокси -модель называется прокси или суррогатом на английском языке, и оба могут быть переведены как «агент» на китайском языке. Так называемый прокси означает, что один человек или учреждение принимают меры от имени другого лица или другого учреждения. В некоторых случаях клиент не хочет или не может напрямую ссылаться на объект, а объект прокси может действовать как посредник между клиентом и целевым объектом.
Объясните различия между различными агентами, просто моделируя процесс выполнения транзакций
1.1 Статический прокси
Исходный код создается программистами или автоматически генерируется конкретными инструментами, а затем скомпилируется. Перед запуском программы файл .class класса прокси уже существует.
общественный интерфейс persondao {void saveperson ();} открытый класс persondaoimpl реализует Persondao {@Override public void saidperson () {System.out.println ("Save Person"); }} Открытый класс транзакция {void begintransaction () {System.out.println ("Begin Transaction"); } void commit () {System.out.println ("Commit"); }}Далее напишите статический класс прокси --- Реализуйте интерфейс Persondao
/*** Статический прокси -класс* @author qjc*/persondaoproxy реализует Persondao {persondao persondao; Транзакция транзакции; public persondaoproxy (persondao persondao, транзакция транзакции) {this.persondao = persondao; this.transaction = транзакция; } @Override public void saveperson () {this.transaction.beginTransaction (); this.persondao.saveperson (); this.transaction.commit (); }}тест
/*** Тест статический прокси* @author QJC*/public Class TestpersonProxy {@test public void testsave () {persondao persondao = new persondaoimpl (); Транзакция транзакции = новая транзакция (); Persondaoproxy proxy = new persondaoproxy (persondao, транзакция); proxy.saveperson (); }}Суммировать:
1. Статический прокси -режим не использует транзакции
2. Предположим, есть 100 классов и 100 прокси. Сколько методов в интерфейсе, сколько методов должно быть реализовано на прокси -слое, и сколько транзакций должно быть открыто и представлено столько методов.
3. Если прокси реализует несколько интерфейсов, если один из интерфейсов изменяется (добавляется метод), то прокси также необходимо соответствующим образом измениться.
1.2 JDK Dynamic Proxy
Динамический класс прокси: он создается динамически с использованием механизма отражения при запуске программы.
Динамический прокси JDK должен соответствовать четырем условиям: 1. Целевой интерфейс 2.
Использование интерфейса Persondao, класса Persondaoimpl и класса транзакций в предыдущем примере
Напишите перехватчик
Импорт java.lang.reflect.invocationHandler; импортировать java.lang.reflect.method;/** * Interceptor * 1. Импорт целевой класс в * 2. Импорт вещей в * 3. Завершение: начало транзакции, вызовите метод целевого объекта и коммит -транзакцию * * @author qjc */public class interceptor inferment ulcements upocation justectordler {private object jempoce weart j; // Целевой класс частной транзакции транзакции; Public Interceptor (цель объекта, транзакция транзакции) {this.Target = target; this.transaction = транзакция; } / *** @param Proxy экземпляр прокси -класса класса прокси целевого объекта* @param, соответствующий экземпляру метода, который вызывает метод интерфейса в экземпляре прокси* @param Args Агности {String methodname = method.getName (); if ("saveperson" .equals (methodname) || "deleteperson" .equals (methodname) || "updateperson" .equals (methodname)) {this.transaction.beginTransaction (); // включить метод транзакции.invoke (target); // Вызовите целевой метод this.transaction.commit (); // отправить транзакцию} else {method.invoke (target); } return null; }}тест
/*** Тест jdk dynamic proxy* @author qjc*/public class testjdkproxy {@test public void testsave () {/*** 1. Создать целевой объект* 2. Создать транзакцию* 3. Создать Interceptor* 4. Динамически генерировать объект Proxy*/object gust = new persondaImpl (); Транзакция транзакции = новая транзакция (); Interceptor Interceptor = новый Interceptor (Target, Transaction); /*** Параметр 1: Установите загрузчик класса, используемый кодом, который обычно использует тот же загрузок класса, что и целевой класс* Параметр 2: Установите интерфейс, реализованный классом Proxy, и используйте тот же интерфейс, что и целевой класс* Параметр 3: Установите объект Callback. Когда вызывается метод прокси -объекта, метод вызова указанного объекта будет называться*/ persondao persondao = (persondao) proxy.newproxyinstance (target.getClass (). GetClassLoader (), target.getClass (). GetInterfaces (), receptor); persondao.saveperson (); }}Суммировать :
1. Поскольку класс прокси, сгенерированный JDKProxy, реализует интерфейс, все методы в целевом классе включены в класс прокси.
2. Все методы сгенерированного прокси -класса перехватывают все методы целевого класса. Содержание метода Invoke в перехватчике является именно точной композицией каждого метода класса прокси.
3. Интерфейсы должны существовать при использовании jdkproxy.
4. Три параметра в методе Invoke могут получить доступ к API вызываемого метода, параметров вызываемого метода и типа возврата вызываемого метода целевого класса.
недостаток:
1. В перехватчике, за исключением вызова целевого метода целевого объекта, функция относительно одиночна. В этом примере можно обработать только транзакции.
2. Если утверждение о суждении метода Anloke в перехватчике ненадежно в реальной среде разработки, потому что, как только есть много операторов, его необходимо записано.
1.3 CGLIB Dynamic Proxy
Используйте класс Persondaoimpl и класс транзакций в предыдущем примере (без интерфейса)
Напишите классы перехватчиков
Импорт net.sf.cglib.proxy.enhancer; import net.sf.cglib.proxy.methodinterceptor; import net.sf.cglib.proxy.methodproxy;/*** Cglib Proxy Interceptor* @Author QJC*/Public Class Interceptors MethodInterceptor MethodInterceptor {private объектный целевой объект; // Прокси -целевой класс частной транзакции транзакции; Public Interceptor (цель объекта, транзакция транзакции) {this.Target = target; this.transaction = транзакция; } / ** * Создание прокси -объекта целевого объекта * * @return * / public объект createProxy () {// Enhancer Enhancer Enhancer = New Enhancer (); // Этот класс используется для генерации Enhancer.SectCallback (это) прокси -объекта (это); // Параметр является eNhancer Interceptor.setSuperClass (target.getClass ()); // Установить возвращение родительского класса Enhancer.create (); // Создать прокси -объект}/ *** @param obj экземпляр целевого объекта Proxy Class* @param Метод метода, который вызывает метод родительского класса в экземпляре Proxy* @param Argise Массив объектов, передаваемых в значения параметра метода на методе Proxy* @param. Args, MethodProxy MethodProxy) бросает Throwable {this.Transaction.BeginTransaction (); Method.invoke (Target); this.transaction.commit (); вернуть ноль; }}тест
/*** Тест CGLIB Dynamic Proxy* Прокси -объект, сгенерированный через CGLIB, класс прокси является подклассом целевого класса* @Author QJC*/Public Class TestCglibProxy {@Test public void testSave () {объект Target = new CersondAoImpl (); Транзакция транзакции = новая транзакция (); Interceptor Interceptor = новый Interceptor (Target, Transaction); Persondaoimpl persondaoimpl = (persondaoimpl) receptor.createProxy (); persondaoimpl.saveperson (); }}Суммировать:
1. CGlib-это мощная, высокопроизводительная и высококачественная библиотека классов Code Generation. Он может расширить классы Java и внедрить Java Interfaces во время выполнения.
2. Используйте CGLIB для генерации класса прокси в качестве подкласса целевого класса.
3. Интерфейс не требуется для генерации классов прокси с использованием cglib
4. Прокси -класс, сгенерированный CGLIB, переопределяет методы родительского класса.
5. Содержание метода перехвата в перехватчике - это именно то разница между методом корпуса CGLIB и динамического прокси JDK в классе прокси:
JDK:
Целевой класс и класс прокси реализуют общий интерфейс
Перехватчик должен реализовать интерфейс InvocationHandler, а содержание тела метода Invoke в этом интерфейсе является содержанием тела метода Proxy объекта.
Cglib:
Целевой класс - это родительский класс прокси -класса
Перехватчик должен реализовать интерфейс MethodInterceptor, а метод перехвата в интерфейсе представляет собой тело метода класса прокси, а механизм улучшения байт -кода используется для создания объекта прокси.
2. ориентированное ориентированное программирование
ООП (объектно-ориентированное программирование): инкапсуляция, наследование, полиморфизм, абстракция
Инкапсуляция, базовое и модульное управление кодом. Каждый класс может иметь свои функции. Если что -то пойдет не так, просто ищите кого -нибудь, чтобы обсудить этот вопрос. С точки зрения модификации, может быть рискованно изменять код напрямую. Это не долгосрочное решение. Самое естественное, чтобы измениться от инкапсуляции типа. Однако, как интегрировать новые типы и старые системы, поэтому необходимо установить кровь между классами. Тогда это требование наследования. Благодаря наследованию вы можете обнаружить, что эти классы связаны, и между ними существуют отношения отца и сына. Затем, на основе наследования, полиморфизмы имеют решающие характеристики. Следовательно, обычно считается, что наиболее основной особенностью объектно-ориентированной на самом деле является полиморфизм. Первые несколько - все закладывают основу. Полиморфизм является его основной особенностью. Метод перезаписывания в подклассе представляет расширение этого уровня, и он может быть интегрирован в старую систему и может работать нормально. Это повторное использование этого уровня, новые методы, старые системы, расширения и повторное использование.
AOP (программирование, ориентированное на раздел):
Основное программирование - это технология, которая динамически добавляет функции в программы без изменения исходного кода с помощью предварительно скомпилированного динамического прокси.
Разница между ООП и AOP:
ООП: Абстрактная инкапсуляция осуществляется на организациях и их свойствах и поведении процесса обработки бизнеса для получения более четкого разделения логических единиц.
AOP: извлекает логику поперечного обрезания в бизнес-процессе. Он сталкивается с определенным шагом или стадией в процессе, чтобы получить низкий эффект выделения связи между частями логического процесса. Эти две идеи дизайна имеют существенные различия в целях. AOP достиг повторного использования кодовых блоков.
Прокси -механизм Spring AOP:
1. Если целевой объект реализует несколько интерфейсов, Spring использует JDK Java.lang.Reflect.proxy Class Proxy.
Преимущества: Поскольку есть интерфейс, система более слабо связана
Недостатки: создайте интерфейсы для каждого целевого класса
2. Если целевой объект не реализует какой -либо интерфейс, Spring использует библиотеку CGLIB для генерации подкласса целевого объекта.
Преимущества: Поскольку класс прокси и целевой класс наследуется, нет необходимости существовать интерфейс.
Недостатки: поскольку интерфейс не используется, связь системы не так хороша, как динамический прокси с использованием JDK.
Использование интерфейса Persondao, класса Persondaoimpl и класса транзакций
Напишите конфигурацию пружины
<bean id = "persondao"> </bean> <bean id = "transaction"> </bean> <aop: config> <!-Pointcut Выражение определяет целевой класс-> <aop: pointcut Expression = "execution (* cn.qjc.aop.xml.persondaoimpl. ref = "Transaction"> <aop: перед методом = "begintransaction" pointcut-ref = "exact"/> <aop: после возврата метода = "commit" pointcut-ref = "exact"/> </aop: аспект> </aop: config> </beans>
тест
/*** Тестовая пружина Dynamic Proxy* @Author QJC*/public Class TransactionTest {@Test public void testSave () {ApplicationContext = new classpathxmlapplicationContext ("cn/qjc/aop/xml/applicateContext.xml"); Persondao persondao = (persondao) context.getbean ("persondao"); persondao.saveperson (); }}Весенний принцип AOP
1. Когда пружинный контейнер запускается, два боба загружаются и создаются.
2. Когда пружинный контейнер анализирует файл конфигурации по <aop: config>, проанализируйте выражение с вырезанием точки и соответствует бобам содержания контейнера пружинного контейнера в соответствии с вырезанным точечным выражением.
3. Если совпадение успешно, создайте прокси -объект для бобов
4. Когда клиент использует Context.getbean для получения объекта, если у объекта есть прокси -объект, он возвращает объект прокси. Если нет прокси -объекта, он возвращает сам объект.
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.