Въведение в Spring AOP

1. Въведение

В този урок ще представим AOP (Aspect Oriented Programming) с Spring и ще започнем да разбираме как можем да започнем да използваме този мощен инструмент в практически сценарии.

Възможно е също така да се използват анотациите на AspectJ, когато се използва Spring AOP, но в тази статия ние се фокусираме върху основната конфигурация, базирана на Spring AOP XML.

2. Общ преглед

AOP е парадигма за програмиране, която има за цел да увеличи модулността, като позволява разделянето на междусекторните проблеми. Това се прави чрез добавяне на допълнително поведение към съществуващия код без промяна на самия код.

Вместо това можем да декларираме този нов код и тези нови поведения поотделно.

AOP рамката на Spring помага да приложим тези междусекторни проблеми.

3. Зависимости на Maven

Нека започнем с добавяне на зависимостта на AOP библиотеката на Spring в pom.xml :

 org.springframework.boot spring-boot-starter-parent 2.2.2.RELEASE    org.springframework.boot spring-boot-starter-aop  

Най-новата версия на зависимостта може да бъде проверена тук.

4. Концепции и терминология на AOP

Нека да разгледаме накратко понятията и терминологията, специфични за AOP:

4.1. Бизнес обект

Бизнес обектът е нормален клас, който има нормална бизнес логика. Нека разгледаме прост пример за бизнес обект, където просто добавяме две числа:

public class SampleAdder { public int add(int a, int b) { return a + b; } } 

Имайте предвид, че този клас е нормален клас с бизнес логика и без никакви анотации, свързани с Spring.

4.2. Аспект

Един аспект е модуларизация на проблем, който обхваща множество класове. Унифицираната регистрация може да бъде пример за подобна загриженост.

Нека да видим как дефинираме прост аспект:

public class AdderAfterReturnAspect { private Logger logger = LoggerFactory.getLogger(this.getClass()); public void afterReturn(Object returnValue) throws Throwable { logger.info("value return was {}", returnValue); } } 

В горния пример току-що дефинирахме прост Java клас, който има метод, наречен afterReturn, който взема един аргумент от тип Object и той просто влиза в тази стойност. Имайте предвид, че дори нашият AdderAfterReturnAspect е стандартен клас, без никакви пролетни пояснения.

В следващите раздели ще видим как можем да свържем този аспект с нашия бизнес обект.

4.3. Точка на присъединяване

А Joinpoint е точка по време на изпълнението на програмата, като изпълнение на метод или боравенето с изключение.

В Spring AOP, JoinPoint винаги представлява изпълнение на метод.

4.4. Pointcut

Pointcut е предикат, който помага да се съчетае Съвет, който да бъде приложен от Аспект в конкретен JoinPoint .

Съветът често се свързва с израз на Pointcut и се изпълнява във всяка точка на присъединяване, съвпадаща с Pointcut.

4.5. Съвети

Съветът е действие, предприето от даден аспект в определена точка на присъединяване . Различните видове съвети включват съвети „около“, „преди“ и „след“ .

През пролетта Съветът е моделиран като прехващач, поддържащ верига от прехващачи около Точката на съединяване .

4.6. Окабеляване на бизнес обект и аспект

Нека да разгледаме как можем да свържем бизнес обект към аспект със съвет след завръщане.

По-долу е извадката от конфигурацията, която бихме поставили в стандартна конфигурация на Spring в етикета “” :

Както се вижда, дефинирахме прост боб, наречен simpleAdder, който представлява екземпляр на бизнес обект. Освен това създаваме екземпляр на Аспект, наречен AdderAfterReturnAspect .

XML, разбира се, не е единствената ни опция тук; както бе споменато по-горе, анотациите на AspectJ също се поддържат изцяло.

4.7. Конфигурация с един поглед

Tag aop: config се използва за дефиниране на свързана с AOP конфигурация. В рамките на маркера за конфигуриране дефинираме класа, който представлява аспект. Дадохме му препратка към аспектния боб „doAfterReturningAspect“ , който създадохме.

След това дефинираме Pointcut, използвайки маркера на pointcut . Pointcut, използван в примера по-горе, е изпълнение (* org.baeldung.logger.SampleAdder +. * (..)), което означава прилагане на съвет за всеки метод в клас SampleAdder, който приема произволен брой аргументи и връща всякакъв тип стойност.

След това определяме кой съвет искаме да приложим. В горния пример ще приложим съвет след връщане, който е дефиниран в нашия Aspect AdderAfterReturnAspect чрез изпълнение на метод, наречен afterReturn, дефиниран с помощта на атрибут метод.

Този съвет в рамките на Aspect взема един параметър от тип Object. Параметърът ни дава възможност да предприемем действие преди и / или след извикването на целевия метод. В този случай просто регистрираме връщаната стойност на метода.

Spring AOP поддържа множество съвети, използващи конфигурация, базирана на анотации - това и още примери можете да намерите тук и тук.

5. Заключение

В този урок илюстрирахме концепции, използвани в AOP и пример за използване на AOP модула на Spring. Ако се интересувате да откриете повече за AOP, ето някои ресурси:

  • Въведение в AspectJ
  • Внедряване на персонализирана пролетна AOP анотация
  • Въведение в Pointcut Expressions през пролетта
  • Сравняване на Spring AOP и AspectJ
  • Въведение в типовете съвети през пролетта

Изпълнението на тези примери може да бъде намерено в проекта GitHub - това е проект, базиран на Maven, така че трябва да е лесно да се импортира и да се изпълнява както е.