SpringAOP 설정 주입 의 실현 절차
우 리 는 먼저 한 장면 을 상상 합 니 다.당신 은 프로젝트 를 만 들 고 있 습 니 다.개발 과정 에서 여러 모듈 에 반복 되 는 코드 가 있 습 니 다.그래서 이 를 하나의 방법 으로 추상 화한 다음 에 필요 한 곳 에서 이 방법 을 호출 합 니 다.이 코드 를 수정 해 야 할 때 이 방법 만 수정 하면 됩 니 다.어느 날,당신 의 Boss 는 새로운 수 요 를 주 었 습 니 다.한 가지 방법 을 추상 화 한 다음 에 이 방법 이 필요 한 모듈 에서 이 방법 을 호출 해 야 합 니 다.이것 은 당신 을 골 치 아 프 게 할 수 있 습 니 다.대량의 코드 를 수정 해 야 합 니 다.그래서 소스 코드 를 수정 하지 않 고 시스템 업무 에 어떤 기능 을 추가 할 수 있 을까요?다행히 AOP 는 이 문 제 를 잘 해결 할 수 있 었 다.
간단 한 소개
AOP:개발 자가 소스 코드 를 수정 하지 않 는 전제 에서 시스템 의 업무 구성 요소 에 특정한 유 니 버 설 기능 을 추가 하도록 보장 합 니 다.본질은 AOP 프레임 워 크 에서 업무 구성 요 소 를 수정 하 는 여러 가지 방법의 소스 코드 입 니 다.우 리 는 이 를 두 가지 로 나 눕 니 다.
정적 AOP
AOP 프레임 워 크 는 컴 파일 단계 에서 프로그램 소스 코드 를 수정 하여 정적 AOP 프 록 시 클래스(생 성 된*.class 파일 이 수정 되 었 으 므 로 특정한 컴 파일 러 를 사용 해 야 합 니 다)를 생 성 했 습 니 다.예 를 들 어 AspectJ.
동적 AOP:
AOP 프레임 워 크 는 실행 단계 에서 동적 생 성 프 록 시 대상(메모리 에 JDK 동적 프 록 시 또는 CGlib 로 AOP 프 록 시 클래스 를 동적 으로 생 성 합 니 다),예 를 들 어 SpringAOP.
자세하게 설명 하 다
Spring 알림 유형
명칭.
라벨
설명 하 다.
사전 통지
< aop:before >
사전 알림 설정 에 사용 합 니 다.추가 방법 을 지정 하여 접점 방법 전에 실행 합 니 다.
후방 알림
< aop:after-returning >
설정 후 알림 에 사용 합 니 다.강화 방법 을 지정 하여 접점 방법 을 지정 한 후에 실행 합 니 다.
서 라운드 알림
< aop:around >
서 라운드 알림 설정 에 사용 합 니 다.강화 방법 을 지정 합 니 다.
이상 알림
< aop:throwing >
이상 알림 설정 에 사용 합 니 다.이상 이 발생 했 을 때 강화 하 는 방법 을 지정 합 니 다.
최종 통지
< aop:after >
최종 알림 설정 에 사용 합 니 다.증강 방식 의 집행 에 이상 이 있 든 없 든 간 에 모두 집행 할 것 이다.
실전 연습
의존 패키지 가 져 오기
<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(" ");
}
}
절단면 클래스 만 들 기
public class VisitAspect {
//
public void visitBefore(JoinPoint joinPoint){
System.out.println(" :");
}
// , ,
public void visitAfter(JoinPoint joinPoint){
System.out.println(" ");
}
//
public void visitSuccess(JoinPoint joinPoint){
System.out.println(" , ");
}
// ,
public void visitThrow(JoinPoint joinPoint, Throwable ex){
System.out.println(" , ");
}
// ,
public Object visitAround(ProceedingJoinPoint proceedingJoinPoint) throws Throwable{
System.out.println("------- -------");
Object obj = proceedingJoinPoint.proceed();
System.out.println("------- -------");
return obj;
}
}
xml 파일 을 설정 하려 면 제3자 제약 조건 을 추가 해 야 합 니 다.
<bean id="userDao" class="Spring_AOP.service.impl.VisitServiceImpl"></bean>
<bean id="aspect" class="Spring_AOP.service.VisitAspect"></bean>
<aop:config>
<aop:pointcut id="pointcut" expression="execution(* Spring_AOP.service.impl.VisitServiceImpl.visit(..))"/>
<aop:pointcut id="pointcut1" expression="execution(* Spring_AOP.service.impl.VisitServiceImpl.around())"/>
<aop:aspect ref="aspect">
<aop:before method="visitBefore" pointcut-ref="pointcut"></aop:before>
<aop:after method="visitAfter" pointcut-ref="pointcut"></aop:after>
<aop:after-returning method="visitSuccess" pointcut-ref="pointcut"></aop:after-returning>
<aop:around method="visitAround" pointcut-ref="pointcut1"></aop:around>
<!-- aop:after-throwing -->
<aop:after-throwing method="visitThrow" pointcut-ref="pointcut" throwing="ex"></aop:after-throwing>
</aop:aspect>
</aop:config>
주,execution()에 대해1.execution():표현 식 주체(execution 을 추가 해 야 합 니 다).
2.첫 번 째*번:반환 값 형식 을 표시 하고*번 호 는 모든 유형 을 표시 합 니 다.
3.가방 이름:차단 이 필요 한 가방 이름 을 표시 합 니 다.뒤의 두 문장 은 현재 가방 과 현재 가방 의 모든 하위 가방,cn.smd.service.impl 가방,자손 이 모든 종류의 방법 을 가방 에 넣 는 것 을 표시 합 니 다.
4.두 번 째*번:유형 명 을 나타 내 고*번 은 모든 유형 을 나타 낸다.
5.*(..):마지막 으로 이 별 표 는 방법 명 을 나타 내 고*호 는 모든 방법 을 나타 내 며 뒤의 괄호 안에 방법 을 나타 내 는 매개 변 수 를 나타 내 고 두 문장 은 모든 매개 변 수 를 나타 낸다.
작성 한 주의사항:execution(*cn.smd.service.impl..(..)
테스트 클래스 만 들 기
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
요청 실패,거절
입력 완료
둘러싸다
서 라운드 알림
둘러싸다
총결산
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Spring AOP 의 정적 에이전트 와 동적 에이전트 사용법 상세 설명목표 클래스 와 프 록 시 클래스 를 같은 인 터 페 이 스 를 실현 하여 프 록 시 클래스 가 실제 클래스 대상 을 가지 도록 한 다음 에 프 록 시 클래스 방법 에서 실제 클래스 방법 을 호출 하고 실제 클래스 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.