1. Что такое AOP
AOP-это аббревиатура, ориентированное на аспект, что означает программирование, ориентированное на аспект. AOP на самом деле является продолжением модели проектирования GOF.
2. Некоторые условия о Spring AOP:
A. Аспект: Весной AOP аспект может быть реализован с использованием общего класса или в обычном классе с аннотацией @aspept (@aspectj Style)
B. JoinPoint: В пружине точка подключения представляет собой выполнение метода.
C. Совет: действие, выполняемое в определенной совместной точке в разделе. Существуют различные типы уведомлений, в том числе «вокруг», «до» и «после». Многие фреймворки AOP, в том числе пружина, используют перехватчики в качестве моделей уведомлений и поддерживают цепочку перехватчиков, ориентированную на точке, ориентированную на точку.
D. Pointcut: Определите одну или группу методов, которые могут генерировать уведомления при выполнении этих методов. Spring использует синтаксис AspectJ Point-Cut по умолчанию.
3. Тип уведомления
A. Предварительная подписка (@before): уведомление, выполненное перед точкой соединения, но это уведомление не может предотвратить выполнение до точки соединения (если оно не бросает исключение)
B. Уведомление о возврате (@afterreturning): уведомление, выполненное после точки соединения (точка соединения)
C. Уведомление после исключения (@AfterThroing): уведомление, выполненное, когда метод бросает исключение и выходит
D. post уведомление (@after): уведомление, выполненное при выходе точки соединения (будь то нормальный возврат или ненормальный выход)
E. Уведомление о окружении (@Around): уведомления, окружающие точку соединения, такие как вызовы методов. Это самый мощный тип уведомлений, и уведомления об окружении могут завершить пользовательское поведение до и после вызовов методов. Он также выбирает, следует ли продолжать выполнять точки подключения или непосредственно возвращать свое возвращаемое значение или бросить исключение, чтобы закончить выполнение
4. @AspectJ Style AOP конфигурация
Конфигурация Spring AOP имеет два стиля:
A. xml Style = реализовать Spring AOP в декларативной форме
B. AspectJ Style = реализовать Spring AOP с использованием формы аннотации
5. Пример
Тестирование
пакет com.spring.aop; / *** Раздел*/ public class testaspect {public void doafter (joinpoint jp) {system.out.println ("Метод окончания журнала:" + jp.getTarget (). GetClass (). GetName () + "." + Jp.getSignature (). GetName ()); } public Object doAround (TromeingJoinpoint PJP) бросает Throwable {long Time = System.currentTimeMillis (); Object retval = pjp.proceed (); Time = System.currentTimeMillis () - Time; System.out.println («Время процесса:» + время + "ms"); вернуть возврат; } public void dobefore (joinpoint jp) {System.out.println ("Метод начала журнала:" + jp.getTarget (). getClass (). getName () + "." + jp.getSignature (). getName ()); } public void Dothroing (JoinPoint JP, Throwable ex) {System.out.println ("Метод" + jp.getTarget (). getClass (). getName () + "." + jp.getSignature (). getName () + "throw Exception"); System.out.println (ex.getMessage ()); } private void sendex (string ex) {// todo Отправить SMS или напоминание по электронной почте}} пакет com.spring.service; / ** * Интерфейс a */ public incervice aservice {public void fooa (String _msg); public void bara (); } пакет com.spring.service; / ***Класс реализации интерфейса a*/ public class aserviceimpl реализует Aservice {public void bara () {System.out.println ("aserviceimpl.bara ()"); } public void fooa (string _msg) {system.out.println ("aserviceimpl.fooa (msg:"+_ msg+")"); }} пакет com.spring.service; / ** * Класс службы B */ Public Class BserviceImpl {public void barb (string _msg, int _type) {system.out.println ("bserviceimpl.barb (msg:"+_ msg+"type:"+_ type+")") "); if (_type == 1) бросить new allogalargumentException ("Исключение теста"); } public void foob () {System.out.println ("bserviceimpl.foob ()"); }}ApplicationContext
<? 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.spramework.orgemabema/spemancemabema/spemancemabeman. http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd "default-autowire =" AutodeTect "> <AOP: Config> <aop: Amposive ID" testaSpect "Ref =" Ampostect "> <aop: config> <aop: apectipe empectire"? interfaces under com.spring.service package--> <aop:pointcut id="businessService" expression="execution(* com.spring.service.*.*(..))" /> <aop:before pointcut-ref="businessService" method="doBefore"/> <aop:after pointcut-ref="businessService" method="doAfter"/> <aop:around pointcut-ref = "business service" method = "doAround"/> <aop: после прохождения pointcut-ref = "businessservice" method = "dothrowing"/> </aop: аспект> </aop: config> <bean id = "Aspodebean"/> <Bean Id = "aService"> </bean> </beans>
Тестовый класс Aoptest
открытый класс Aoptest расширяет AbstractDependencyInjectionspringContextTests {Private Aservice Aservice; Частный Bserviceimpl Bservice; Защищенная string [] getConfiglocations () {string [] configs = new String [] {"/applicationContext.xml"}; вернуть конфигурации; } / *** Тест Нормальный вызов* / public void testcall () {System.out.println ("Springtest Junit Test"); aservice.fooa ("Junit test fooa"); aservice.bara (); bservice.foob (); bservice.barb ("Junit Test Barb", 0); } / ** * Тест после прохождения * / public void testthrow () {try {bservice.barb ("junit call barb", 1); } catch (allogalargumentException e) {}} public void setAservice (Aservice Service) {aservice = service; } public void setBservice (BServiceImpl Service) {bservice = service; }}
Результаты работы следующие:
Метод начала журнала: com.spring.service.aserviceimpl.fooa aserviceimpl.fooa (msg: junit test fooa) Метод окончания журнала: com.spring.service.aserviceimpl.fooa Time Time: 0 MS Log Methonding Methodning ending.spricemple.serviceimpl.bara aserviceimpl.bara:). com.spring.service.aserviceImpl.bara Время процесса: 0 MS Mog Метод начала: com.spring.service.beserviceimpl.foob bserviceimpl.foob () Метод окончания журнала: com.spring.service.bersiMpl.foob Time: 0 MS начинается. Bserviceimpl.barb (MSG: Junit Test Test Barb Type: 0) Метод окончания журнала: com.spring.service.beserviceimpl.barb Время процесса: 0 MS Mog Метод начала: com.spring.service.berserviceimpl.barb bserviceimpl.barb (msg: junit call type: 1). com.spring.service.berserviceimpl.barb Метод com.spring.service.beserviceimpl.barb Throw Exception Exception исключение