spring 2.5 학습 노트 (7): AOP 기본 개념 과 주해 방식 으로 AOP 실현
Aspect (절단면): 횡단면 적 관심 점 의 추상 은 바로 절단면 이다. 이것 은 유형 과 비슷 하지만 이들 의 관심 점 이 다 르 고 유형 은 사물 특징 에 대한 추상 이 며 절단면 은 횡단면 적 관심 점 의 추상 이다.
joinpoint (연결 점): 연결 점 이란 차단 되 어 있 는 점 을 말 합 니 다.spring 에서 이러한 점 은 방법 을 가리 키 며, spring 은 방법 유형의 연결 점 만 지원 합 니 다. 실제로 joinpoint 는 field 나 클래스 구조 기 일 수도 있 습 니 다.
pointcut (착안점): 착안점 이란 joinpoint 를 차단 하 는 정 의 를 말 합 니 다.
advice (알림): 알림 이란 joinpoint 를 차단 한 후에 해 야 할 일 을 말 합 니 다.사전 알림, 사후 알림, 이상 알림, 최종 알림, 서 라운드 알림 으로 나 뉜 다.
Target (대상): 대 리 된 대상
Wcave (뜨개질): aspects 를 target 대상 에 적용 하고 proxy 대상 을 만 드 는 과정 을 말 합 니 다.
Introduction (도입): 클래스 코드 를 수정 하지 않 는 전제 에서 Introduction 은 운행 기간 에 클래스 동적 으로 방법 이나 field 를 추가 할 수 있 습 니 다.
코드 1: 인터페이스 및 구현 클래스,
package cn.itcast.server;
public interface IPersonService {
public void save(String name);
public String getPersonName(Integer id);
public void update(String name,Integer id);
}
package cn.itcast.server.impl;
import cn.itcast.server.IPersonService;
public class PersonServiceBean implements IPersonService {
public String getPersonName(Integer id) {
System.out.println(" getPersonName ");
return "xxx";
}
public void save(String name) {
//throw new RuntimeException(" ");
System.out.println(" save ");
}
public void update(String name, Integer id) {
System.out.println(" update ");
}
}
코드 2: 정 의 된 절단면
package cn.itcast.server;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
/**
*
*/
@Aspect
public class MyInteceptor {
// ,
@Pointcut("execution(* cn.itcast.server.impl.PersonServiceBean.*(..) )")
private void anyMethod(){}//
//
@Before("anyMethod() && args(name)")// args(name)
public void doAccessCheck(String name){
System.out.println(" " + name);
}
//
@AfterReturning(pointcut="anyMethod()",returning="res")// returning
public void doAfterReturning( String res){
System.out.println(" " + res);
}
//
@After("anyMethod()")
public void doAfterReturn(){
System.out.println(" ");
}
//
@AfterThrowing(pointcut="anyMethod()",throwing="e")
public void doAfterThrowing(Exception e){
System.out.println(" "+ e);
}
//
@Around("anyMethod()")
public Object doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable{
//
System.out.println(" ");
Object result = pjp.proceed();
System.out.println(" ");
return result;
}
}
@ Pointcut ("execution (* cn. itcast. server. impl. PersonServiceBean. * (..)") 설명:
execution 에서 가 져 온 매개 변수 에 대한 설명:
기본 매개 변수 [* cn. itcast. server. impl.. *. * (..)]
1: 첫 번 째 * 표시, 방법의 반환 유형, cn. itcast. server. impl 은 차단 할 가방 아래 방법 입 니 다.
2: impl 뒤의 [.. *] 는 가방 아래 의 임의의 종 류 를 지정 하려 면 이렇게 cn. itcast. server. impl. PersonServiceBean 을 차단 하 는 것 이 바로 이러한 PersonServiceBean 을 제정 하 는 것 이 라 고 밝 혔 다.
3: 뒤에 있 는 * (..) 은 임의의 방법 을 표시 하고 괄호 안에 있 는 두 개의 작은 점 은 임의의 매개 변수 유형 을 표시 합 니 다. 몇 개 든 지 간 에.
코드 3: 프로필:
<?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:context="http://www.springframework.org/schema/context"
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.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
">
<!--AOP ( AOP ) -->
<aop:aspectj-autoproxy/>
<bean id="myInteceptor" class="cn.itcast.server.MyInteceptor"></bean>
<bean id="personService" class="cn.itcast.server.impl.PersonServiceBean"></bean>
</beans>
코드 4: 테스트 클래스:
package junit.test;
import org.junit.BeforeClass;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import cn.itcast.server.IPersonService;
public class SpringAOPTest {
@BeforeClass
public static void setUpBeforeClass() throws Exception {
}
@Test public void interceptorTest(){
ApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml");
IPersonService ipersonService = (IPersonService) ac.getBean("personService");
ipersonService.update("xxx",2);
ipersonService.save("xx");
ipersonService.getPersonName(2);
}
}
ipersonService.update("xxx",2);
ipersonService.save("xx");
ipersonService.getPersonName(2);,이 세 가지 방법 은 착안점 의 조건 을 만족 시 킬 때 만 차단 된다.
우 리 는 접점 의 정 의 를 보 았 습 니 다: @ Pointcut ("execution (* cn. itcast. server. impl. PersonServiceBean. * (..)")
이 표현 식 은 차단 할 방법 은 형식 을 임의로 되 돌려 주 는 것 이 며, PersonServiceBean 아래 의 임의의 방법 입 니 다.
그래서 위의 세 가지 방법 이 모두 차단 된다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
thymeleaf로 HTML 페이지를 동적으로 만듭니다 (spring + gradle)지난번에는 에서 화면에 HTML을 표시했습니다. 이번에는 화면을 동적으로 움직여보고 싶기 때문에 입력한 문자를 화면에 표시시키고 싶습니다. 초보자의 비망록이므로 이상한 점 등 있으면 지적 받을 수 있으면 기쁩니다! ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.