Ключевые моменты этого раздела:
Java Static Proxy
JDK Динамический агент
1 проблемы, столкнутые в объектно-ориентированных идеях дизайна
В традиционном программировании ООП объекты являются основными, и полная программная функция формируется посредством сотрудничества между объектами. Поскольку объекты могут быть унаследованы, мы можем абстрагировать атрибуты с одинаковыми функциями или одинаковыми характеристиками в четко иерархическую систему структуры классов. Благодаря непрерывному расширению спецификаций программного обеспечения, более профессиональное разделение труда становится все больше и больше серий, а растущее число практик применения ООП также выявляет некоторые проблемы, которые ООП не могут решать хорошо.
Теперь предположим, что в системе есть три совершенно похожих фрагмента кода, которые обычно завершаются «копированием» и «вставкой». Программное обеспечение, разработанное таким образом, показано на рисунке:
Читатели, возможно, обнаружили недостатки этого подхода. Если однажды код с синим фоном должен быть изменен, мы должны изменить три места одновременно? Если не только эти три места содержат этот код, но и 100 или даже 1000 мест, каковы будут последствия?
Регистрация везде в коде - сначала посмотрите на пример:
Чтобы отслеживать работу приложения, многие методы требуют информации о регистрации. Мы обычно пишем это:
// См. Статью «log4j Введение» для log4j import org.apache.log4j.logger; public class person {private logger logger = logger.getlogger (person.class); public void sleep () {logger.info («время выполнения старта:« + новая дата); Date ());} public void eath () {logger.info ("Time Execution:" + new Date ()); Date () "); System.out.println (" Incubation "); logger.info (" "Время окончания выполнения:" + new Date () ");}}Вопрос: Каковы недостатки?
L путает обязанности самого бизнес -метода
Рабочая нагрузка на техническое обслуживание огромна
2 Решение 1
Статический прокси:
1. Вам нужно знать, какой класс основной класс (класс прокси) и какие есть методы.
2. Неточный код должен повторяться несколько раз, что делает структуру кода раздутой и создает избыточность кода.
3. Несвязанные классы (прокси-классы) должны реализовать интерфейсы, реализованные основными классами (классы прокси), то есть они должны реализовать общие интерфейсы, но интерфейсы, реализованные основными классами (прокси-классы).
Цель L - полностью отделить бизнес -код от кода журнала и достичь свободной связи.
Прокси -объект и объект Proxy должны реализовать один и тот же интерфейс, реализовать связанные сервисы для ведения журнала в объекте прокси и при необходимости вызовать объект прокси, в то время как объект прокси только сохраняет бизнес -код.
Внедрение статического прокси -сервера
1) Определите интерфейс:
Публичный интерфейс Iperson {public rastice void sleep (); public abstract void еда ();}2) Прокси -класс
Открытый класс человек реализует iperson {public void sleep () {System.out.println ("sleep");} public void eath () {System.out.println ("eath");}}3) Класс агента
Импорт org.apache.log4j.logger; открытый класс PersonProxy реализует Iperson {Private Iperson Person; Private Logger Logger = logger.getLogger (PersonProxy.class); Public PersonProxy (Iperson Person) {This.person = Person;} public eath () {logger.info ("this.person = person;} public eath () {logger.info (" this.person = person;} Date () "); Person.eating (); logger.info (" "" Время окончания выполнения: " + new Date ()");} public void sleep () {logger.info ("время выполнения начала:" + new Date () "); Person.sleep (); logger.info (" "Время выполнения:" + new Date () ");4) Испытательный класс
пакет com.aptech.aop2; public class persontest {public static void main (string [] args) {iperson proxy = new PersonProxy (new Person ()); proxy.eating (); proxy.sleep ();}};Недостатки статического прокси:
Прокси -интерфейс может обслуживать только один тип объекта. Это просто некомпетентно для немного больших проектов.
3 раствор 2-динамический агент
InvocationHandler: Каждый класс динамического прокси должен реализовать интерфейс InvocationHandler, и каждый экземпляр класса прокси -класса связан с обработчиком. Когда мы вызовываем метод через объект прокси, вызов этого метода будет перенаправлен в метод Invoke интерфейса InvocationHandler для вызова.
После JDK1.3 была добавлена динамическая прокси -функция, которая может помочь в разработке. Нет необходимости писать конкретные прокси -объекты для конкретных объектов и методов. Использование динамического прокси -прокси может заставить обработчик обслуживать каждый объект.
Конструкция класса процессора должна реализовать интерфейс java.lang.reflect.invocationHandler.
Dynamic Proxy, реализованный через интерфейс InvocationHandler, может лишь прокси -сервер в классе реализации интерфейса.
Динамическая реализация прокси
1) обработчик
Общедоступный класс DynaproxyHandler реализует vocationhandler {private logger = logger.getlogger (dynaproxyhandler.class); Date ()); object result = method.invoke (target, args); logger.info ("Время окончания выполнения:" + new Date ()); return result; // return метод выполнения}}}}}}}}}}}}}}}2) Фабрика для производственного агента
import java.lang.reflect.Proxy;public class DynaProxyFactory {//obj is the proxy object public static Object getProxy(Object obj){DynaProxyHandler handler = new DynaProxyHandler();handler.setTarget(obj);return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass (). getInterfaces (), Handler);}}3) Испытательный класс
открытый класс PersonTest {public static void main (string [] args) {iperson person = (iperson) dynaproxyfactory.getProxy (new Person ()); // Возврат класса прокси, класс проксинации динамически создается JVM в памяти. Этот класс реализует все интерфейсы (все методы) входящего интерфейсного массива. Pperson.eating (); Person.sleep ();}}Суммировать
Выше приведено все подробное объяснение Spring Static Proxy и динамического прокси -кода в этой статье. Я надеюсь, что это будет полезно для всех. Заинтересованные друзья могут продолжать ссылаться на этот сайт:
Общая конфигурация и анализ Описание класса пружины
Interceptor Springmvc реализует отдельный вход
Реализация программирования Java SpringMVC простого входа в систему
Если есть какие -либо недостатки, пожалуйста, оставьте сообщение, чтобы указать это. Спасибо, друзья, за вашу поддержку на этом сайте!