предисловие
Только лысина может стать сильнее
В предыдущей статье уже объяснялосьОчки знаний Spring IOC собраны в одном месте!, В этой статье в основном объясняется модуль АОП Spring ~
Ранее я уже писал статью об АОП, в которой разъяснялись наиболее важные моменты знаний:Spring [модуль АОП] так же прост, для меня большая честь быть рекомендованным Open Source China~~
- Если нет основы АОП, рекомендуется сначала прочитать приведенную выше статью ~
- Если нет основы режима прокси, рекомендуется взглянуть на:Объясни своей девушке, что такое прокси-режимэта статья
- Если вы все это видели, смело ешьте!
Эта статья в основномДополнить и укрепитьНекоторые из наиболее важных точек знаний, а также разберем точки знаний об АОП в двух вышеупомянутых книгах и нарисуем их в карте ума, чтобы полностью понять точки знаний Spring AOP!
Тогда давайте начнем Если что-то не так, я надеюсь простить меня много, и не стесняйтесь поправлять меня в области комментариев!
1. Всестороннее понимание Spring АОП
Объединение глав АОП двух книг «Spring Combat (4th Edition)» и «Proficient in Spring4.x Enterprise Application Development» для систематизации их знаний ~
1.1 Обзор АОП
АОП называется аспектно-ориентированным программированием, так как же мы понимаем аспектно-ориентированное программирование? ?
Давайте посмотрим на следующий код:
Когда мы изучаем объектно-ориентированный язык Java, что, если код повторяется? ? Его можно разделить на следующие этапы:
- 1: Извлечь в метод
- 2: Извлечь класс
Способ извлечения в классы называется:вертикальное извлечение
- Вертикальное извлечение через наследование
Однако наш текущий метод не годится: даже если он будет извлечен в классы, все равно будет повторяющийся код из-за этой логики (начало, завершение, фиксация транзакции)Привязан к логике методов нашего бизнес-класса!
Теперь метод вертикального извлечения не годится, концепция АОП:Один и тот же код, разбросанный по каждому коду бизнес-логики, разрезается по горизонталиИзвлечь в отдельный модуль!
Приведенная выше картина также очень ясна.На самом деле очень легко нарезать повторяющийся логический код (мы можем просто думать об этом как об инкапсуляции его в класс), но нам нужноЛогический код, который мы пересекаем, интегрируется в бизнес-логику, чтобы выполнить ту же функцию, что и раньше (до извлечения)! Это первая проблема, которую решает АОП!
1.2 Принцип АОП Spring
Логический код, который мы пересекаем, интегрируется в бизнес-логику для выполнения той же функции, что и раньше (до извлечения).
Прежде чем изучать Spring AOP, мы можем использовать для этого прокси.
- Если ты прочитаешь, что я написалОбъясни своей девушке, что такое прокси-режимВ этой статье должно быть легко понять то, что я сказал выше.
- Что может агент? Агенты могут нам помочьУлучшение поведения объектов! Использование динамических прокси по существуПерехватывать методы объекта при вызове, преобразовании и расширении методов!
На самом деле, основной принцип Spring AOP таков:Динамический прокси!
Исходный пункт «Знакомство с практикой разработки корпоративных приложений Spring4.x»:
Spring AOP реализован на чистой Java, не требует ни специального процесса компиляции, ни специального загрузчика классов, он находится вСреда выполнения переплетает расширенный код с целевым классом через прокси. Spring AOP, IoC и AspectJ могут быть легко интегрированы в Spring.
Фраза из «Весна в действии (4-е издание)»:
Spring AOP построен на динамических прокси, поэтомуПоддержка АОП в Spring ограничена перехватом методов..
Динамические прокси в Java имеютдваСпособ:
- Динамический прокси JDK
- Динамический прокси CGLib
Динамический прокси JDK должен реализовать интерфейс, а не все наши классы имеют интерфейсы, поэтому прокси CGLib имеет его~~
- Динамический прокси-объект, созданный прокси-сервером CGLib, является подклассом целевого класса.
- Spring AOPПо умолчанию используется динамический прокси JDK., если класс проксиЕсли интерфейса нет, будет использоваться прокси CGLib.
Итак, какой прокси-сервер JDK и прокси-сервер CGLib мы должны использовать? ? Предложения приведены в «Практике разработки корпоративных приложений для Spring 4.x»:
- еслиНам лучше использовать прокси CGLib для синглтона, если экземпляров несколько, лучше использовать прокси JDK
причина:
- Производительность JDK при создании прокси-объектов выше, чем у прокси-серверов CGLib, но производительность при создании прокси-объектов ниже, чем у CGLib.
- Если это одноэлементный прокси, рекомендуется использовать CGLib
Увидев это, мы должны знать, что такое Spring AOP (аспектно-ориентированное программирование):Извлеките повторяющийся код одной и той же логики по горизонтали и используйте технологию динамического прокси, чтобы вплести эти повторяющиеся коды в метод целевого объекта для достижения той же функции, что и оригинал..
- Таким образом, мыЗаботьтесь о бизнес-коде только при написании бизнеса, и не беспокойтесь о коде, не связанном с бизнесом
1.3 Разработчики АОП
В дополнение к реализации Spring AOP, у AOP также есть хорошо известный реализатор AOP: AspectJ, а также может быть реализатор, о котором вы никогда не слышали: JBoss AOP~~
Давайте поговорим об AspectJ, расширяющем знания:
AspectJ этоуровень языкаРеализация АОП расширяет язык Java, определяет синтаксис АОП и может использоваться ввремя компиляцииОбеспечивает вплетение сквозного кода, поэтому имеетспециализированный компиляторИспользуется для создания файлов класса, соответствующих спецификации байт-кода Java.
И Spring заимствует много очень полезных практик от AspectJ,Интегрируйте функции AspectJ для реализации АОП. Но Spring AOP по существуНижний слой по-прежнему является динамическим прокси., поэтому Spring AOP не нуждается в специальном редакторе~
1.4 Терминология АОП
Ну, АОП придумал несколько терминов~~ Обе книги объяснили эти термины, я постараюсь сделать их понятными для всех:
Соединение(точка присоединения):
- где его можно перехватить: Spring AOP основан на динамическом прокси, поэтому это перехват методов. Каждый метод-член можно назвать точкой соединения~
Точка отсечки(Poincut):
- специально расположенные точки подключения: Как было сказано выше, каждый метод можно назвать точкой подключения, мыКонкретное позиционирование для определенного метода становится точкой касания.
Улучшения/Уведомления(Совет):
- Представляет сегмент, добавленный к pointcutлогический код, и найдите точку соединенияИнформация об ориентации.
- Проще говоря, он определяет, что делать и где это делать.
- Spring AOP предоставляет нам 5 типов советов: pre, post, return, exception, Surround для использования!
ткать(ткачество):
- будет
增强/通知
Процедура, добавленная к конкретной точке соединения целевого класса.
введение / введение(Введение):
-
引入/引介
разрешить намДобавить новый метод или свойство в существующий класс. этоспециальныйулучшения!
раздел(Аспект):
- Касательная плоскость состоит из точки касания и
增强/通知
композиция, которая включает в себя как определение сквозной логики, так и определение точек соединения.
Резюме, данное в «Весне в действии (4-е издание)», таково:
Уведомления/улучшения содержат сквозное поведение, которое требуется для нескольких объектов приложений; точки соединения — это все точки во время выполнения программы, где могут применяться уведомления; точки определяют, где применяются уведомления/улучшения. Ключевым среди них является то, что pointcuts определяют, какие точки соединения будут уведомлены/расширены.
В целом:
- Эти термины могут быть трудны для понимания в переводе, но для нашего обычного использования АОПЭффект не такой большой~~ см. больше, чтобы узнать, что это значит.
1.5 Spring поддерживает АОП
Spring предоставляет 3 типа поддержки АОП:
- Классический SpringAOP на основе прокси
- Нужно реализовать интерфейс, вручную создать прокси
- Чистый аспект POJO
- Использование конфигурации XML, пространство имен aop
-
@AspectJ
Аспекты, управляемые аннотациями- Это самый лаконичный и удобный способ использования аннотаций!
Во-вторых, классический SpringAOP на основе прокси.
Эта часть конфигурации является более хлопотной, и она также очень хлопотна в использовании.Здесь я в основном организую содержание книги.Давайте посмотрим и поймем.На самом деле мы используем Spring AOP в основном без этого метода!
Во-первых, давайте посмотрим на схему наследования расширенного интерфейса:
можно разделить напять категорийРасширенный способ:
Весна обеспечиваетШесть типов точечной резки:
Существует три основных типа срезов:
- Общий разрез
- точечный разрез
- Познакомить/познакомить с аспектом
Общий аспект, Точечный аспект, Введение / Введение Введение:
Для аспекта точечного разреза мы обычно просто используем его напрямую.Давайте посмотрим на введение/введение аспекта:
- Аспект Introduce/Introduce представляет собой расширенную оболочку Introduce/Introduce, посредством аспекта Introduce/Introduce,Упрощает добавление реализации любого интерфейса к существующим объектам.!
Схема наследования:
Аспект введения/введения имеет два класса реализации:
- DefaultIntroductionAdvisor: часто используемый класс реализации.
- DeclareParentsAdvisor: аспект введения/введения, используемый для реализации представления аннотации DeclareParent языка AspectJ.
На практике мы используем АОП, как правило,Spring использует BeanPostProcessor внутри, чтобы помочь нам создавать прокси..
Создателей этих прокси можно разделить на три категории:
- Автоматический создатель прокси на основе правил имени конфигурации Bean: BeanNameAutoProxyCreator
- Автоматический создатель прокси на основе механизма сопоставления советников: он сканирует все советники в контейнере, а класс реализации — DefaultAdvisorAutoProxyCreator.
- Автоматический создатель прокси на основе тегов аннотаций AspectJ в bean-компонентах: AnnotationAwareAspectJAutoProxyCreator
Соответствующая диаграмма наследования классов:
Ну а давайте поговорим о классическом SpringAOP на основе прокси.Вообще-то я неохотно это пишу, потому что он почти бесполезен, а в "Spring Combat 4th Edition" знаний по этой части нет.
- Но через эту часть очки знаний можноБолее полное понимание различных интерфейсов Spring AOPбар~
3. Используйте АОП-программирование на основе аннотаций и пространств имен.
Spring расширил функцию АОП в новой версии, что отражено в следующих аспектах:
- Пространство имен aop предоставляется для AOP в файле конфигурации XML.
- Добавлена поддержка языка выражений AspectJ pointcut.
- AspectJ легко интегрируется
тогда мы используем@AspectJ
Если вы придете играть в АОП, чему вы научитесь? ? На самом деле, это вышеупомянутый контент, узнайте, как устанавливать точки разреза, создавать плоскости разреза, что такое расширенный контент...
Для конкретных выражений pointcut используйте или перейдите к:Spring [модуль АОП] так же простПосмотрим~~
Соответствующие расширенные аннотации:
3.1 Используйте функцию введения/введения для внедрения новых методов для бинов
На самом деле, предлог и послелог легко понять, после прочтения всей статьи только этот аспект вступления/введения немного сбивает с толку. Итак, поиграем~
Давайте посмотрим на конкретное использование.Теперь у меня есть серверный интерфейс:
public interface Waiter {
// 向客人打招呼
void greetTo(String clientName);
// 服务
void serveTo(String clientName);
}
Молодой официант реализует класс:
public class NaiveWaiter implements Waiter {
public void greetTo(String clientName) {
System.out.println("NaiveWaiter:greet to " + clientName + "...");
}
@NeedTest
public void serveTo(String clientName) {
System.out.println("NaiveWaiter:serving " + clientName + "...");
}
}
Теперь все, что я хочу сделать, это:Я думаю, что этот официант может действовать как продавец и может продавать вещи! Конечно, я точно не буду добавлять способ продажи вещей в интерфейс Официанта, потому что это временно~
Итак, я сделал интерфейс продавца:
public interface Seller {
// 卖东西
int sell(String goods, String clientName);
}
Класс реализации продавца:
public class SmartSeller implements Seller {
// 卖东西
public int sell(String goods,String clientName) {
System.out.println("SmartSeller: sell "+goods +" to "+clientName+"...");
return 100;
}
}
На данный момент наша диаграмма классов выглядит так:
Теперь то, что я хочу сделать, это:С введением / вводным аспектом АОП, пусть наши официанты также продают вещи!
Наш аспект введения / введения специально делает это:
@Aspect
public class EnableSellerAspect {
@DeclareParents(value = "com.smart.NaiveWaiter", // 指定服务员具体的实现
defaultImpl = SmartSeller.class) // 售货员具体的实现
public Seller seller; // 要实现的目标接口
}
Что происходит, когда вы пишете этот класс аспектов? ?
- Технология Aspect интегрирует SmartSeller в NaiveWaiter, так чтоNaiveWaiter реализует интерфейс продавца! ! ! !
Разве это не удивительно? ? Я также думаю, что это потрясающе, давайте проверим это:
нашbean.xml
Файл простой:
<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd">
<aop:aspectj-autoproxy/>
<bean id="waiter" class="com.smart.NaiveWaiter"/>
<bean class="com.smart.aspectj.basic.EnableSellerAspect"/>
</beans>
есть тест:
public class Test {
public static void main(String[] args) {
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("com/smart/aspectj/basic/beans.xml");
Waiter waiter = (Waiter) ctx.getBean("waiter");
// 调用服务员原有的方法
waiter.greetTo("Java3y");
waiter.serveTo("Java3y");
// 通过引介/引入切面已经将waiter服务员实现了Seller接口,所以可以强制转换
Seller seller = (Seller) waiter;
seller.sell("水军", "Java3y");
}
}
Конкретный процесс вызова выглядит следующим образом:
Когда вызывается метод импортированного интерфейса, прокси-объект делегирует вызов какому-то другому объекту, реализующему новый интерфейс. На самом деле реализация bean-компонента разделена на несколько классов.
3.2 Объявление аспектов в XML
Мы знаем, что аннотации удобны,но, использоватьспособ аннотацииИспользование Spring АОПдолжен иметь исходный код(Потому что мы собираемся добавить аннотации к классу аспекта). Если нет исходного кода, мы должны использовать XML для объявления аспекта~
По сути, это похоже на функцию аннотации:
Давайте просто закончим это примером:
Во-первых, давайте проверим, как используется советник в сочетании с традиционным SpringAOP:
Класс реализации:
xml-файл конфигурации:
.......
Все еще слишком много времени, чтобы объяснять по одному, поэтому я объясню это на один раз:
Наконец, есть сводная диаграмма типа фасет, и вы можете почти понять ее после прочтения:
Весенняя электронная книга, заинтересованные студенты могут просматривать волны. Всего "142" страницы
3. Резюме
Кажется, что у АОП много знаний, на самом деле нам нужно запомнить только основные понятия АОП.
Вот мой краткий обзор АОП:
- Нижний уровень АОП фактически представляет собой динамический прокси-сервер, который делится на динамический прокси-сервер JDK и динамический прокси-сервер CGLib. Если проксируемый объект не имеет интерфейса, то используется прокси CGLIB (также можно настроить прокси CBLib напрямую)
- Если это синглтон, то лучше использовать прокси-сервер CGLib, потому что прокси-объект CGLib работает быстрее, чем прокси-объект JDK.
- Поскольку АОП основан на динамическом прокси, он может перехватывать только методы, а его уровень — уровень методов.
- Принцип использования Spring AOP классическим способом, способом аннотации или способом конфигурации XML одинаков, но форма изменилась. Как правило, мы используем АОП в качестве аннотаций.
- Метод аннотации использует Spring AOP, чтобы понять несколько выражений pointcut, и несколько аннотаций усовершенствования/совета завершены. Это просто? Нет большой разницы между использованием XML и аннотаций, и вы можете быстро приступить к работе.
- Аспект введения / введения также является относительно ярким местом.Вы можете использовать прокси для реализации интерфейса для объекта, чтобы вы могли использовать метод под предлогом. Этот метод ненавязчивый ~
- Усовершенствованный метод также может получать те же параметры, что и проксируемый метод, привязывать возвращаемое значение проксируемого метода, эти функции...
Наконец, давайте добавим знание АОП к нашей последней интеллект-карте МОК~~~
Проект с открытым исходным кодом, охватывающий все точки знаний о бэкэнде Java (уже 6 тысяч звезд):GitHub.com/Zhongf UC очень…
если ты хочешьв реальном времениЕсли вы обратите внимание на мои обновленные статьи и галантерейные товары, которыми я делюсь, поищите в WeChat.Java3y.
Содержимое PDF-документоввсе вручную, если вы ничего не понимаете, вы можете напрямуюспросите меня(В официальном аккаунте есть мои контактные данные).