spring 2.5 학습 노트 (7): AOP 기본 개념 과 주해 방식 으로 AOP 실현

6423 단어 springAOPxmlJUnit
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 아래 의 임의의 방법 입 니 다.
그래서 위의 세 가지 방법 이 모두 차단 된다.

좋은 웹페이지 즐겨찾기