> Java > java지도 시간 > 본문

Spring에서 AOP 주석을 구현하는 방법에 대한 예제 설명

巴扎黑
풀어 주다: 2017-07-21 17:05:11
원래의
2093명이 탐색했습니다.

 이전 기사에서는 Spring의 XML 구현에 대해 이야기했습니다. 여기서는 Annotation을 사용하여 AOP를 구현하는 방법에 대해 설명합니다. aop에 대한 간단한 이해에 대해서는 이미 이야기한 적이 있으므로 여기서는 자세히 다루지 않겠습니다.

Annotation을 이용한 AOP의 구현은 크게 다음과 같은 단계로 나뉜다. (직접 정리. 더 좋은 방법이 있다면 codecjh@163.com으로 편하게 연락주세요.)

 1. Aspect 클래스에서( 포인트컷을 제공하는 클래스) @Aspect 주석으로 장식되어 Aspect 클래스로 선언됩니다.

  2. 서비스 객체가 누구인지 애스펙트에게 알려주기 위해 @Pointcut 주석을 사용하여 포인트컷을 선언합니다. (이 주석으로 수정된 메서드의 메서드 본문은 비어 있으며, public void say(){}; 등의 함수를 작성할 필요가 없습니다. 메서드 이름은 호출 시 특정 서비스 함수에서 참조할 수 있으며, 프록시 객체 메소드로 이해)

  3. 해당 메소드를 해당 알림 유형 주석으로 수정하고, 해당 메소드를 관점 함수로 선언하고, 포인트커팅 용도로 사용합니다

  4. aop 주석을 활성화합니다. 스프링 구성 파일에서 자동 프록시. 예를 들면:

아직 매우 추상적일 수 있으므로 더 이상 고민하지 않고 코드에 대해 이야기해 보겠습니다.

Knight 클래스: (나중에 알게 될 것입니다. 이전 글 읽어보기) 기사란 무엇인가 ㅋㅋㅋ)

 1 package com.cjh.aop2; 2  3 import org.springframework.stereotype.Component; 4  5 /** 6  * @author Caijh 7  * 8  * 2017年7月11日 下午3:53:19 9  */10 @Component("knight")11 public class BraveKnight {12     public void saying(){13         System.out.println("我是骑士..(切点方法)");14     }15 }
로그인 후 복사

Aspect 클래스: (주로 주석은 여기에 반영됩니다)

 1 package com.cjh.aop2; 2  3 import org.aspectj.lang.ProceedingJoinPoint; 4 import org.aspectj.lang.annotation.After; 5 import org.aspectj.lang.annotation.Around; 6 import org.aspectj.lang.annotation.Aspect; 7 import org.aspectj.lang.annotation.Before; 8 import org.aspectj.lang.annotation.Pointcut; 9 import org.springframework.stereotype.Component;10 11 /**12  * @author Caijh13  * email:codecjh@163.com14  * 2017年7月12日 上午9:31:4315  */16 /**17  * 注解方式声明aop18  * 1.用@Aspect注解将类声明为切面(如果用@Component("")注解注释为一个bean对象,那么就要在spring配置文件中开启注解扫描,<context:component-scan base-package="com.cjh.aop2"/>19  *      否则要在spring配置文件中声明一个bean对象)20  * 2.在切面需要实现相应方法的前面加上相应的注释,也就是通知类型。21  * 3.此处有环绕通知,环绕通知方法一定要有ProceedingJoinPoint类型的参数传入,然后执行对应的proceed()方法,环绕才能实现。22  */23 @Component("annotationTest")24 @Aspect25 public class AnnotationTest {26     //定义切点27     @Pointcut("execution(* *.saying(..))")28     public void sayings(){}29     /**30      * 前置通知(注解中的sayings()方法,其实就是上面定义pointcut切点注解所修饰的方法名,那只是个代理对象,不需要写具体方法,31      * 相当于xml声明切面的id名,如下,相当于id="embark",用于供其他通知类型引用)32      * <aop:config>33         <aop:aspect ref="mistrel">34             <!-- 定义切点 -->35             <aop:pointcut expression="execution(* *.saying(..))" id="embark"/>36             <!-- 声明前置通知 (在切点方法被执行前调用) -->37             <aop:before method="beforSay" pointcut-ref="embark"/>38             <!-- 声明后置通知 (在切点方法被执行后调用) -->39             <aop:after method="afterSay" pointcut-ref="embark"/>40         </aop:aspect>41        </aop:config>42      */43     @Before("sayings()")44     public void sayHello(){45         System.out.println("注解类型前置通知");46     }47     //后置通知48     @After("sayings()")49     public void sayGoodbey(){50         System.out.println("注解类型后置通知");51     }52     //环绕通知。注意要有ProceedingJoinPoint参数传入。53     @Around("sayings()")54     public void sayAround(ProceedingJoinPoint pjp) throws Throwable{55         System.out.println("注解类型环绕通知..环绕前");56         pjp.proceed();//执行方法57         System.out.println("注解类型环绕通知..环绕后");58     }59 }
로그인 후 복사

spring 구성 파일:

 1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4     xmlns:context="http://www.springframework.org/schema/context" 5     xmlns:aop="http://www.springframework.org/schema/aop" 6     xsi:schemaLocation="http://www.springframework.org/schema/beans 
 7          http://www.springframework.org/schema/aop/spring-aop-4.3.xsd 8          http://www.springframework.org/schema/context/spring-context-4.3.xsd"> 9     <!-- 开启注解扫描 -->10     <context:component-scan base-package="com.cjh.aop2"/>11     <!-- 开启aop注解方式,此步骤s不能少,这样java类中的aop注解才会生效 -->12     <aop:aspectj-autoproxy/>13 </beans>
로그인 후 복사

테스트 코드:

 1 package com.cjh.aop2; 2  3 import org.springframework.context.ApplicationContext; 4 import org.springframework.context.support.ClassPathXmlApplicationContext; 5  6 /** 7  * 
 8  * @author Caijh 9  * email:codecjh@163.com10  * 2017年7月11日 下午6:27:0611  */12 public class Test {13     public static void main(String[] args) {14         ApplicationContext ac = new ClassPathXmlApplicationContext("com/cjh/aop2/beans.xml");15         BraveKnight br = (BraveKnight) ac.getBean("knight");16         br.saying();17     }18 }
로그인 후 복사

Running 결과:

주석형 래핑 알림..래핑 전
주석형 사전 알림
나는 기사다..(포인트컷 방식)
주석형 래핑 알림..래핑 후
주석형 사후 알림

==== ==== =================선 구분=========================== ===== ====

  주석을 사용하기 때문에 구성 파일의 내용이 훨씬 적습니다. 한 문장만 있으면 됩니다. <context:comComponent-scan base-package="com. cjh.aop2"/> 패키지를 스캔하도록 선언하면 프레임워크가 자동으로 주석을 스캔하고 Bean 객체를 생성합니다. 구성 중에 와 동일한 의미를 갖는 주석 @Component("knight")가 있습니다. 기사에 대한 이름 BraveKnight 개체를 만듭니다. 따라서 주석을 사용하면 주석 검색 구성만 활성화하면 되며 동일한 Bean 구성을 수행할 필요가 없습니다.

 작업 중에 Spring aop : error at ::0 can't find referenced pointcut sleepPonit 오류가 발생하면 스프링 패키지 버전 문제일 가능성이 높습니다.

저는 스프링 4 버전을 사용하고 있습니다. 그런 다음 Aspectjrt-1.7.4.jar 및 Aspectjweaver-1.7.4.jar 두 개의 패키지를 추가해야 합니다. 클라우드 디스크 주소: 링크: 비밀번호: nc4i

프로젝트 디렉터리는 다음과 같습니다. 코딩 수업, 오해의 소지가 없도록 줄을 그었습니다)

알림 주석 유형은 다음과 같습니다.

위 내용은 Spring에서 AOP 주석을 구현하는 방법에 대한 예제 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!