1. O que é AOP
AOP é a abreviação da programação orientada a aspectos, que significa programação orientada a aspectos. AOP é na verdade uma continuação do modelo de design do GOF.
2. Alguns termos sobre a Spring AOP:
A. Aspecto: Na primavera AOP, a faceta pode ser implementada usando uma aula geral ou em uma aula normal com anotações @aspect (estilo @aspectj)
B. Ponto de junho: no Spring AOP, um ponto de conexão representa a execução de um método.
C. Conselho: Uma ação realizada em um ponto conjunto específico na seção. Existem vários tipos de notificações, incluindo "em torno", "antes" e "depois". Muitas estruturas de AOP, incluindo a primavera, usam interceptores como modelos de notificação e mantêm uma cadeia interceptora centrada no ponto de link.
D. Pointcut: Defina um ou um grupo de métodos, que podem gerar notificações ao executar esses métodos. A primavera usa a sintaxe do aspecto do ponto de aspecto por padrão.
3. Tipo de notificação
A. Pré-notificação (@Before): Uma notificação executada antes de um ponto de junção, mas essa notificação não pode impedir a execução antes do ponto de conexão (a menos que ligue uma exceção)
B. Notificação após o retorno (@afterReturning): notificação executada após um ponto de conexão (ponto de junção) é concluído normalmente: por exemplo, um método não joga nenhuma exceção e retorna normalmente
C. Notificação após a exceção for lançada (@afterwring): notificação executada quando o método lança a exceção e sai
D. Post Notification (@after): notificação executada quando um ponto de conexão sai (seja um retorno normal ou uma saída anormal)
E. Notificação Surround (@around): Notificações em torno de um ponto de junção, como chamadas de método. Esse é o tipo de notificação mais poderoso, e as notificações ao redor podem concluir o comportamento personalizado antes e depois das chamadas de método. Ele também escolhe se deve continuar executando os pontos de conexão ou retorna diretamente seu próprio valor de retorno ou lançar uma exceção para encerrar a execução
4. Configuração do estilo @aspectj
A configuração da Spring AOP tem dois estilos:
A. estilo xml = implementar a Spring AOP em forma declarativa
B. ASCUSTJ STILO = IMPLEMENTAR AOP Spring usando o formulário de anotação
5. Exemplo
Testaspect
pacote com.spring.aop; / *** Seção*/ classe pública TestAspect {public void Doafter (junção JP) {System.out.println ("Método de final de log:" + jp.gettarget (). GetClass (). GetName () + "." + Jp.getsignature (). GetName ()); } Public Object Doaround (ProceedingJoinPoint PJP) lança jogável {Long Time = System.CurrentTimEmillis (); Objeto retval = pjp.proeced (); time = system.currenttimemillis () - time; System.out.println ("Hora do processo:" + tempo + "ms"); retornar retval; } public void não para (junção jp) {System.out.println ("Método de início do log:" + jp.gettarget (). getClass (). getName () + "." + jp.getSignature (). getName ()); } public void Dothrowing (junção jp, ex -throwable ex) {System.out.println ("Method" + jp.gettarget (). getClass (). getName () + "." + jp.getSignature (). getName () + "lança exceção"); System.out.println (ex.getMessage ()); } private void sendEx (string ex) {// TODO Enviar SMS ou Lembrete de Email}} pacote com.spring.service; / ** * Interface A */ interface pública ASERVICE {public void Fooa (String _MSG); public void bara (); } pacote com.spring.service; / ***Classe de implementação da interface a*/ public class ASVICEIMPL implementa asservice {public void bara () {System.out.println ("aserviceImpl.bara ()"); } public void fooa (string _msg) {System.out.println ("assererviceImpl.fooa (msg:"+_ msg+")"); }} pacote com.spring.service; / * * if (_type == 1) lança nova ilegalArgumentException ("Exceção de teste"); } public void fooB () {System.out.println ("bserviceImpl.foob ()"); }}ApplicationContext
<? xml versão = "1.0" coding = "utf-8"?> <Beans xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http:/wwww.w3 xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd "default-autowire =" Autotect "> <aop: config> <aop" Métodos de todas as classes ou interfaces sob com.spring.service Method = "Doafter"/> <AOP: em torno de Pointcut-ref = "BusinessService" Method = "Doaround"/> <AOP: Pointcut-ref = "BusinessService" Method = "Dothrowing"/> </AOP: ASPECT> </AOP: Config> <eanD id = "aspecto"/>/>
Classe de teste AOPTEST
A classe pública AOPTEST estende abstratoDependEncyInJectionPringContextTests {private Asservice ASERVICE; Privado BServiceImpl BService; String protegido [] getConfiglocations () {String [] configs = new String [] {"/ApplicationContext.xml"}; retornar configurações; } / *** Teste Chamada normal* / public void testCall () {System.out.println ("Springtest Junit Test"); ASERVICE.FOOA ("JUNIT TEST FOOA"); ASERVICE.BARA (); bservice.foob (); BService.Barb ("Junit Test Barb", 0); } / ** * Teste após arremesso * / public void testhrow () {try {bservice.barb ("Junit Call Barb", 1); } catch (ilegalArgumentException e) {}} public void setaservice (ASVICE SERVIÇO) {ASERVICE = service; } public void setBService (serviço BServiceImpl) {BService = Service; }}
Os resultados da operação são os seguintes:
Método de início do log: com.spring.service.aserviceImpl.fooa asserviceImpl.fooa (msg: teste Junit fooa) método de final de log: com.spring.service.aserviceImpl.Fooa Hora do processo: 0 Ms Log. com.spring.service.aserviceImpl.bara Tempo do processo: 0 ms log de log Método: com.spring.service.bservieImpl.foob bserviceImpl.foob () Método de Ending: com.spring.service.bsiceImpl.FOOB Tempo de processo: 0 MS LOG COMBENTE BServiceImpl.Barb (MSG: Junit Teste da Barb Tipo: 0) Método de final de log: com.spring.Service.BSERVICEIMPL.BARB Tempo de processo: 0 MS LOG MÉTODO DE COM.SPRING.SERVICE.BSVICEIMPL.BARB BSERVICEIMPL.BARB (MSG: CALL BARRANTE TIPO TIPO: 1) com.spring.service.bsserviceImpl.barb Método com.spring.service.bsserviceImpl.barb Exceção de teste de exceção de arremesso