0.About aop
Аспективное программирование (AOP) является горячей темой в разработке программного обеспечения и важной частью Spring Framework. Различные части бизнес -логики могут быть изолированы с использованием AOP, тем самым уменьшая связь между различными частями бизнес -логики, улучшив возможность повторного использования программы и повышая эффективность развития.
AOP - это продолжение ООП.
Основные функции: ведение журнала, статистика производительности, управление безопасности, обработка транзакций, обработка исключений и т. Д.
Основное намерение состоит в том, чтобы разделить коды, такие как ведение журнала, статистика производительности, управление безопасности, обработка транзакций, обработка исключений и т. Д. Из кода бизнес -логики. Разделяя это поведение, мы надеемся разделить их на методы бизнес-логики, не относящиеся к работе, а затем изменить такое поведение, не влияя на код бизнес-логики.
Технология, которая динамически добавляет функции к программам без изменения исходного кода, может быть достигнута с помощью методов предварительного спуска и динамического прокси во время выполнения. AOP на самом деле является продолжением модели проектирования GOF. Модель дизайна преследует развязка между вызывающим и каллером, улучшая гибкость и масштабируемость кода. Можно сказать, что AOP является реализацией этой цели.
Обеспечивает богатую поддержку, ориентированное на аспект программирования весной, позволяя сплоченной разработке путем отделения бизнес-логики приложения от услуг системного уровня, таких как аудит и управление транзакциями. Объекты приложения реализуют только то, что они должны делать - полная бизнес -логика - вот и все. Они не несут ответственности (или даже не осознают) другие проблемы системного уровня, такие как ведение журнала или поддержка транзакций.
1. Загрузите другие файлы внешней конфигурации или файлы свойств в пружине через PropertyPlaceholderConfigurer:
Во многих проектах Javaee роль весны очень важна. Это легкий контейнер, который управляет другими модулями и компонентами. Весна часто должна управлять стойками, ибати, спячка и т. Д. Кроме того, информация об подключении к базе данных, файлы свойств собственности JNDI подключения и т. Д. Также может быть загружена в Spring через PropertyPlaceholderConfigurer для управления. Использование выглядит следующим образом:
(1). Загрузите другие файлы в Spring через Propertyplaceholderconfigurer:
Добавьте следующую конфигурацию в файл конфигурации пружины:
<bean class = "org.springframework.beans.factory.config.propertiplaceholderconfigurer"> <name = "locations"> <datue> classpath: имя файла для загрузки </value>… </property> </bean>
(2). Конфигурация или файл атрибута, который будет загружен через конфигурацию в (1), загружается в пружину. Если вам также необходимо использовать некоторую информацию о загруженной конфигурации или файле данных во время выполнения, например, использование информации о подключении базы данных или информации о подключении JNDI, вы можете использовать синтаксис типовых экспрессии для ссылки, например:
<bean id = ”DataSource” Dressome-method = ”Close” class = ”org.apache.common.dbcp.basicdatasource»> <!-Предположим, что информация об подключении к базе данных записывается во внешнем файле свойств и была загружена по Spring-> hame name = ”DriverClassName” value = ”$ {Driver}”/> <Свойство name = ”name =” name = ”name =” name = ”natue =” natue = ”natue =” $ ’value =” $ ’value =” $ ’value =” $ ’value =’ name = ”erername” value = ”$ {username}”/> <name = ”password” value = ”$ {пароль}”/> </bean>
Примечание. Вы также можете использовать <context: property-placeholderlocation = "classpath: имя файла для загрузки"/>
2. Динамический прокси для Java:
Основной принцип реализации Spring является динамический прокси, поэтому вы должны сначала понять динамический прокси, прежде чем обучение, ориентированное на аспект программирования.
Динамический прокси широко используется в Java, а Dynamic Proxy является одним из классических шаблонов дизайна, которые очень часто используются в шаблонах проектирования в 23.
Простой принцип динамического прокси заключается в следующем:
Client Caller -> Proxy Object -> называется целевым объектом.
Когда клиент вызывает объект прокси, объект прокси делегирует целевой объект, чтобы вызвать его бизнес -метод.
Динамический прокси делятся на два типа: динамический прокси для интерфейсов и динамический прокси для обычных классов. Динамический прокси в Java - это динамический прокси для реальных интерфейсов. Cglib - это динамический прокси для обычных классов. Целевой пакет зависимости Javaee и пакет Spring Jar уже содержат пакеты JAR, связанные с CGLIB, так что вы можете динамически прокси-прокси или обычные классы.
(1). Динамический прокси Джава для интерфейсов:
Динамический прокси в Java может быть динамически проксирован только для интерфейсов. Следовательно, целевой объект должен реализовать интерфейсы, а объект прокси должен реализовать все интерфейсы целевого объекта. Рабочий процесс выглядит следующим образом:
а Динамическое написание класса прокси:
Примечание: Dynamic Proxy должен реализовать интерфейс InvocationHandler и реализовать следующие методы:
Кода -копия выглядит следующим образом:
Object Invoke (экземпляр Proxy ObjectM, экземпляр метода метода интерфейса, вызововший на методе прокси -экземпляра, объект [] массив объекта значений параметров, передаваемых в экземпляр прокси);
Документация по установке JDK объясняется. Этот метод используется для прохождения экземпляра прокси, идентифицировать объект java.lang.reflect.method, который вызывает метод, и массив типа объекта, содержащего параметры. Обработчик вызовов обрабатывает кодированный вызов метода соответствующим образом, и результат, который он возвращает, будет возвращен в результате вызова метода в экземпляре прокси.
беременный Создайте прокси -объект:
Proxy.newProxyInstance (класс загрузчик, класс <?> [] Интерфейс массив, объект прокси обратного вызова (обычно это)))
Когда вызывается метод целевого объекта, прокси -объект целевого объекта создается с помощью метода. Прокси -объект автоматически вызовет свой метод вызова, чтобы вызвать целевой объект и вернуть результат вызова.
(2) .cglib является динамическим прокси для обычных классов Java:
Когда Cglib создает динамический прокси, он не требует, чтобы целевой класс реализовал интерфейс. Его рабочий процесс заключается в следующем:
а Динамическое написание класса прокси:
Enhancer Enhancer = новый Enhancer (); // Установить родительский класс целевого класса на свой собственный enhancer.setsuperclass (целевой класс object.getClass ()); // Установить объект обратного вызова в сам Dynamic Proxy объект Enhancer.SetCallback (this);
беременный Реализовать интерфейс метода Interceptor:
Реализуйте следующий метод:
Object Intercept (экземпляр Proxy ObjectM, метод метода метода интерфейса, вызововший по методу прокси -экземпляра, Object [] Массив объекта значений параметров, передаваемых методу вызова в экземпляре прокси, экземпляр прокси -сервера метода MethodProxy);
Примечание. CGlib может не только динамически прокси для классов, но и динамически прокси для методов.
3. Основные понятия ориентированного программирования (AOP):
Возьмите обычный метод Java в качестве примера
Публичное возвращение типа Имя (список параметров) {―> Метод окружающего метода предварительной обработки код предварительной обработки-> Pre-Notification Try {Специфическая реализация метода (Body Body) ... Метод код после обработки-> Post-Notification} Catch Exception Type E) {Обработка исключений ... ―> Уведомление об исключении} Наконец {Агент последнего обработки ...> Окончательное уведомление}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}
а Проблема с перекрестным вырезанием. Например, в вышеуказанных местах уведомлений, в объектах Java эти объекты с аналогичной общей логикой обработки, которые могут быть добавлены в логику обработки, такую как проверка разрешения, обработка вещей, ведение журнала и т. Д. В центре внимания объектно-ориентированного программирования (ООП)-вертикально абстрактные вещи в реальном мире в модель объекта программирования. В центре внимания ориентированного на аспект программирования (AOP) горизонталь, что абстрагирует места, подобные логике обработки в модели объекта программирования, чтобы сформировать касательную, в то время как логика обработки в объекте программирования-горизонтальная касательная фокус.
беременный Аспект: абстрагирование перекрестных проблем состоит в том, чтобы сформировать раздел, который похож на класс. У этих двух разных проблем. Занятия являются абстракциями характеристик вещей, а разделы являются абстракциями перекрестных проблем.
в JOINPOINT: Перехватана точка, упоминается в пружине, поскольку пружина поддерживает только точки соединения метода, то есть перехваченный метод. Метод, как показано в приведенном выше примере.
дюймовый Pointcut: относится к определению перехвата точки соединения, которая представляет собой набор точек соединения, то есть набор ряда перехваченных методов.
эн. Совет: относится к тому, что делать после перехвата точки соединения, то есть логической обработки после перехвата. Обычная проверка разрешений, обработка вещей, ведение журнала и другие операции определяются и завершены в уведомлениях.
фон Цель: целевой объект прокси, то есть перехваченный объект. Как в приведенном выше примере, объект, где находится метод.
глин Плетение: относится к процессу применения секции к целевому объекту и созданию создания прокси -объекта.
час Введение: без изменения кода введение может динамически добавить некоторые методы и поля в класс во время выполнения.
4. Spring поддерживает зависимости, которые поддерживают ориентированное программирование (AOP):
Следующие 3 пакета в каталоге после весны декомпрессируются:
lib/asyj/asyjweaver.jarlib/asyj/asyjrt.jarlib/cglib/cglib-nodep-2.1-3.jar
5. При использовании ориентированного на аспект программирования (AOP) весной вам необходимо ввести пространство имен AOP в файле конфигурации пружины, то есть добавить следующую конфигурацию:
xmlns: aop = ”http://www.springframework.org/schema/aop» «http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd »
Примечание. Spring 2.5 предоставляет два метода AOP, а именно, на основе файла конфигурации XML и метода аннотации Java.
Чтобы использовать метод аннотации AOP, вам необходимо добавить следующий метод аннотации объекта AOP в файл конфигурации пружины:
<aop: AspectJ-autoproxy/>
6. класс упаковки Javabean - Beanwrapper:
Весна инкапсулирует поведение Javabean через класс BeanWrapper и может установить и получить его значения атрибутов, такие как:
BeanWrapper Crapper Class Object = beanWrapperimpl (новый обернутый класс ()); Объект класса object.setPropertyValue («Имя свойства», «Значение свойства»);
Этот метод позволяет устанавливать свойства в обернутый класс.
7. Ориентированное на ориентированное разработка программирования (AOP) на основе аннотации:
(1). Добавьте поддержку AOP для методов аннотации в файл конфигурации пружины.
(2). Определите раздел:
Подобно созданию нормального класса, добавление аннотации «@aspept» перед классом указывает, что класс является разделом.
(3). Добавьте точки входа к поверхности среза:
Точкой точки является набор методов перехваченных объектов. Обычно точка пересечения точек определяется в методе обработки точки точки пересечения в разделе. Используйте аннотацию «@pointcut», а синтаксис выглядит следующим образом:
@Pointcut ("execution (*com.test.service ..*.*(..))") public void anymethod () {// Метод называется «точечная-точка» и «Обработка» и «точка-выреза»}
Подробное объяснение параметров синтаксиса:
а Первый «*»: означает, что перехватывается метод, является произвольным типом возврата.
беременный com.test.service: вот простой пример, указывающий на перехват имени пакета, то есть пакет, который нужно перехватить.
в Два «..» после перехваченного имени пакета: означает, что подпакеты под перехваченным пакетом также перехватываются рекурсивно, то есть перехваченный подпакет.
дюймовый «*" После "..": представляет все классы под перехваченным пакетом и его подпакером, то есть перехваченный класс.
эн. Последний «*»: представляет все методы в перехваченном классе, то есть перехваченный метод.
фон «(..)»: означает, что перехваченный метод получает любые параметры, то есть перехваченные параметры.
Примечание. Синтаксис определения точки может поддерживать символы подстановочных знаков, но вы должны строго следовать правилам синтаксиса. нравиться:
@Pointcut ("execution (*com.test.service ..*. Добавить*(..))") Это означает перехват методов, начинающихся с «добавить» во всех классах в пакете com.test.service и его подпакета.
(4). Добавьте уведомления в раздел:
Для местоположения уведомлений весной, пожалуйста, обратитесь к небольшим примерам в 3.
«@Before» аннотация: объявить предварительное завершение.
«@Afterrutruning» аннотация: объявить после записи.
«@After» аннотация: объявить окончательное уведомление.
«@Afterthrowing» аннотация: объявить уведомление об исключении.
«@Around» аннотация: объявляет окружающие уведомления.
Примером определения уведомлений является следующее:
@Before ("AnyMethod () (имя точки входа, объявленное на лицевой стороне SLIT)") public void doAccessCheck () {...}
Примечание. Уведомление о окружении немного отличается от других 4 типов уведомлений. Окружающее уведомление определяется особым образом. Окружающее уведомление будет работать до и после всего вызова метода, поэтому объект точки подключения должен использоваться, чтобы сообщить точке соединения, чтобы продолжить логическую обработку после обработки уведомлений об окружении. Его определение следующее:
@Around (Search Into Point name) Общедоступный объект DobasicProfiling (Procroadingjoinpoint pjp) бросает Throwable {... return pjp.proceedceed (); // Это предложение сообщает точке подключения продолжать выполнять другие операции} 8. Некоторые советы по разработке ориентированного на аспект программирования (AOP) на основе аннотации:
(1). Получите входные параметры:
нравиться:
@Before ("Зарегистрируйте имя тота && args (имя параметра ввода)") public void dosomething (string входное имя параметра) {...}
(2). Получите результат возврата:
нравиться:
@Afterreturning (pointcut = ”income in in name”, return = ”return name») public void dosomething (string name) {…}
9. Разработка программирования, ориентированного на раздел (AOP) на основе XML:
(1). Определите класс Facet и добавьте уведомления в класс Facet.
(2). Настройте класс Facet в файле конфигурации Spring, как у обычного класса Java.
(3). Добавьте конфигурацию AOP в файл конфигурации пружины следующим образом:
<aop: config> <!-раздел конфигурации-> <aop: аспект идентификатор id = "идентификатор секции" ref = "идентификатор класса раздела в файле конфигурации пружины"> <!-точка конфигурации-> <aop: pointcut id = "Раздел" Expression = "exeplion (*com.test.service ..*(..)"/> <!-конфигурация. Методы обработки в классе раздела "/> <aop: после…/>… </aop: аспект> </aop: config>
10. Обработка транзакций пружины (декларативная декларативная транзакция):
Проще говоря, транзакция относится к одной из самых основных операций в базе данных. Подробное объяснение транзакции будет подробно объяснено в сводке, связанной с базой данных. Одним из наиболее важных применений ориентированного на пружинное программирование (AOP) является управление транзакциями. Управление транзакциями Spring 2.5 и более поздние версии поддерживают два типа методов, основанных на аннотациях, и методов на основе файлов XML:
(1). Управление транзакциями на основе метода аннотации:
а Добавьте пространство имен управления транзакциями в файл конфигурации пружины следующим образом:
xmlns: ts = http: //www.springframework.org/schema/tx http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
беременный Настройте диспетчер транзакций в файле конфигурации пружины следующим образом:
<bean id = ”txmanager” class = ”org.springframework.jdbc.datasource.datasourcetransactionmanager»> <name = ”dataSource” ref = ”ID источника данных, настроенного на Spring»/>
в Добавить элементы конфигурации транзакции, которые поддерживают методы аннотации в файле конфигурации пружины, следующие:
<TX: аннотация-Driventransaction-Manager-TX: Annotation-Driventransaction-Manager = ”Txmanager (ID of Transaction Manager Bean, настроенный весной)”/>
дюймовый Используйте управление транзакциями на основе аннотаций:
В проекте Javaee, управляемом весной, бизнес -логика транзакции должна быть добавлена с аннотацией «@Transactional».
(2). Управление транзакциями на основе метода файлов XML:
а Настройте диспетчер транзакций в файле конфигурации пружины следующим образом:
<bean id = ”txmanager” class = ”org.springframework.jdbc.datasource.datasourcetransactionmanager»> <name = ”dataSource” ref = ”ID источника данных, настроенного на Spring»/>
беременный Добавьте следующие разделы управления вещами в файл конфигурации пружины:
<aop: config> <!-Настройка точки ввода транзакции-> <aop: pointcut id = ”transactionpointcut” Expression = ”exeprage (*com.test.service ..*.*(..))”/> <!-Configure Transaction Notification-> <aop: Advisor rese-ref = ”txadvice” pointcut-ref = ”apointcut ref =” txadvice ”pointcut-ref =” transactcut ref = ”txadvice” pointcut-ref = ”transcationв Добавьте следующие функции для уведомлений о транзакциях в файл конфигурации пружины:
<TX: ARDED ID = ”TXADVICE” TransactionManager = ”TXMANAGER»> <TX: атрибуты> <!-Вот пример для установки метода запроса, начинающегося с Get To READ, и не поддерживает транзакции-> <TX: Method Name = «Get*». name = ”*”/> </tx: атрибуты> </tx: консультант>