SpringAOP 구조 주입 의 실현 절차
우 리 는 먼저 한 장면 을 상상 합 니 다.당신 은 프로젝트 를 만 들 고 있 습 니 다.개발 과정 에서 여러 모듈 에 반복 되 는 코드 가 있 습 니 다.그래서 이 를 하나의 방법 으로 추상 화한 다음 에 필요 한 곳 에서 이 방법 을 호출 합 니 다.이 코드 를 수정 해 야 할 때 이 방법 만 수정 하면 됩 니 다.어느 날,당신 의 Boss 는 새로운 수 요 를 주 었 습 니 다.한 가지 방법 을 추상 화 한 다음 에 이 방법 이 필요 한 모듈 에서 이 방법 을 호출 해 야 합 니 다.이것 은 당신 을 골 치 아 프 게 할 수 있 습 니 다.대량의 코드 를 수정 해 야 합 니 다.그래서 소스 코드 를 수정 하지 않 고 시스템 업무 에 어떤 기능 을 추가 할 수 있 을까요?다행히 AOP 는 이 문 제 를 잘 해결 할 수 있 었 다.
간단 한 소개
AOP:개발 자가 소스 코드 를 수정 하지 않 는 전제 에서 시스템 의 업무 구성 요소 에 특정한 유 니 버 설 기능 을 추가 하도록 보장 합 니 다.본질은 AOP 프레임 워 크 에서 업무 구성 요 소 를 수정 하 는 여러 가지 방법의 소스 코드 입 니 다.우 리 는 이 를 두 가지 로 나 눕 니 다.
정적 AOP
AOP 프레임 워 크 는 컴 파일 단계 에서 프로그램 소스 코드 를 수정 하여 정적 AOP 프 록 시 클래스(생 성 된*.class 파일 이 수정 되 었 으 므 로 특정한 컴 파일 러 를 사용 해 야 합 니 다)를 생 성 했 습 니 다.예 를 들 어 AspectJ.
동적 AOP:
AOP 프레임 워 크 는 실행 단계 에서 동적 생 성 프 록 시 대상(메모리 에 JDK 동적 프 록 시 또는 CGlib 로 AOP 프 록 시 클래스 를 동적 으로 생 성 합 니 다),예 를 들 어 SpringAOP.
자세하게 설명 하 다
Spring 알림 유형
명칭.
라벨
설명 하 다.
사전 통지
@Before
사전 알림 설정 에 사용 합 니 다.추가 방법 을 지정 하여 접점 방법 전에 실행 합 니 다.
후방 알림
@AfterReturning
설정 후 알림 에 사용 합 니 다.강화 방법 을 지정 하여 접점 방법 을 지정 한 후에 실행 합 니 다.
서 라운드 알림
@Around
서 라운드 알림 설정 에 사용 합 니 다.강화 방법 을 지정 합 니 다.
이상 알림
@AfterThrowing
이상 알림 설정 에 사용 합 니 다.이상 이 발생 했 을 때 강화 하 는 방법 을 지정 합 니 다.
최종 통지
@After
최종 알림 설정 에 사용 합 니 다.증강 방식 의 집행 에 이상 이 있 든 없 든 간 에 모두 집행 할 것 이다.
절단면 류 주해
@Aspect
이 현재 클래스 는 절단면 클래스 라 고 표시 합 니 다.
정지점 주해
@Pointcut
반환 값 이 void 이 고 방법 체 가 비어 있 는 방법 으로 접근 점 을 명명 합 니 다.
실전 연습
의존 패키지 가 져 오기
<dependencies>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.5</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-aspects -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>5.3.5</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.6</version>
</dependency>
<!-- https://mvnrepository.com/artifact/aopalliance/aopalliance -->
<dependency>
<groupId>aopalliance</groupId>
<artifactId>aopalliance</artifactId>
<version>1.0</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
증강 클래스 및 인터페이스 만 들 기강화 클래스 인터페이스:
public interface VisitService {
// , , ,
void visit(String str) throws Exception;
//
void around();
}
증강 클래스:
public class VisitServiceImpl implements VisitService {
// , , ,
public void visit(String str) throws Exception{
System.out.println(str);
if(!str.equalsIgnoreCase("agree")){
throw new Exception(" ");
}
}
//
public void around() {
System.out.println(" ");
}
}
절단면 클래스 만 들 기
@Component("VisitAspect")
@Aspect // myAspect
public class VisitAspect_anno {
//
// void 、
@Pointcut("execution(* Spring_AOP.service.impl.VisitServiceImpl.visit(..))")
private void v1() {
}
//
@Before("v1()")
public void visitBefore(JoinPoint joinPoint) {
System.out.println(" :");
}
@After("v1()")
// , ,
public void visitAfter(JoinPoint joinPoint) {
System.out.println(" ");
}
@AfterReturning("v1()")
//
public void visitSuccess(JoinPoint joinPoint) {
System.out.println(" , ");
}
@AfterThrowing(value = "v1()",throwing = "ex")
// ,
public void visitThrow(JoinPoint joinPoint, Throwable ex) {
System.out.println(" , ");
}
@Around("execution(* Spring_AOP.service.impl.VisitServiceImpl.around())")
// ,
public Object visitAround(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
System.out.println("------- -------");
Object obj = proceedingJoinPoint.proceed();
System.out.println("------------------");
return obj;
}
}
xml 파일 설정
<!-- AspectJ -->
<context:component-scan base-package="Spring_AOP" />
<!-- AspectJ -->
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
테스트 클래스 만 들 기
public class visitTest {
@Test
public void VisitTest(){
ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext_AOP.xml");
VisitService visitService = app.getBean(VisitService.class);
try {
visitService.visit("agree");
} catch (Exception e) {
e.printStackTrace();
}
try {
visitService.visit("ok");
} catch (Exception e) {
e.printStackTrace();
}
visitService.around();
}
}
테스트 실행구령:
agree
요청 성공,환영
입력 완료
구령:
ok
요청 실패,거절
입력 완료
둘러싸다
서 라운드 알림
둘러싸다
총결산
구조 주입 을 사용 하면 AOP 모드 를 더욱 편리 하 게 구현 할 수 있 지만,마찬가지 로 설치 주입 에 비해 각기 다른 장점 이 있다.
이상 은 주해 로 SpringAOP 프레임 워 크 주입 의 실현 을 실현 하 는 것 입 니 다.잘못 이 있 으 면 지적 해 주 십시오.지금까지 인내심 을 가 진 친구 에 게 감 사 드 립 니 다.
SpringAOP 에 관 한 이 편 입 니 다.구조 주입 의 실현 절차 에 대한 글 은 여기까지 입 니 다.SpringAOP구조 주입 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 도 많은 응원 부 탁 드 리 겠 습 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Spring AOP 의 정적 에이전트 와 동적 에이전트 사용법 상세 설명목표 클래스 와 프 록 시 클래스 를 같은 인 터 페 이 스 를 실현 하여 프 록 시 클래스 가 실제 클래스 대상 을 가지 도록 한 다음 에 프 록 시 클래스 방법 에서 실제 클래스 방법 을 호출 하고 실제 클래스 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.