spring 절단면 op 차단기
필터 filter,spring mvc 차단기 Interceptor,절단면 프로 그래 밍 op 은 실제 적 으로 일정한 차단 작용 을 가지 고 있 으 며,모두 특정한 면 을 차단 한 후에 일정한 처 리 를 한다.
여기 서 주로 착수 하고 싶 은 것 은 op 입 니 다.그들의 비교 에 대해 저 는 세 가 지 를 모두 알 고 나 서 다시 이야기 하고 싶 습 니 다.그래서 여 기 는 너무 많은 비 교 를 하지 않 습 니 다.
현재 프로젝트 실천 에서 한 곳 에서 만 수 동 으로 op 을 사 용 했 습 니 다.그것 은 로그 관리 에서 일부 중요 한 작업 에 대한 기록 입 니 다.
제 가 현재 알 고 있 는 바 에 의 하면 op 차단 은 일반적으로 구체 적 인 방법 이나 구체 적 인 특정한 방법 에 사 용 됩 니 다.제 가 사용 한 실현 방식 은 두 가지 가 있 습 니 다.하 나 는 직접 코드 성명 이 고 하 나 는 xml 파일 에 설정 되 어 있 습 니 다.
제 가 현재 실제 개발 한 프로젝트 는 모두 spring+spring mvc 의 구 조 를 사용 한 다음 에 Maven 관 리 를 사용 한 다음 에 Junit 테스트 를 하기 때 문 입 니 다.그래서 저 는 거의 모든 개인 프로젝트 도 이런 구조 와 프로젝트 관리 도 구 를 사용 합 니 다.이 aop 을 이해 하 는 작은 프로젝트 에서 자 연 스 럽 게 도 마찬가지 입 니 다.가방 에 의존 하 는 것 은 다음 과 같 습 니 다.
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>springTest</groupId>
<artifactId>aopTest</artifactId>
<version>0.0.1-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.0.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>4.0.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>4.0.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.4</version>
</dependency>
</dependencies>
</project>
첫 번 째 방법,자바 코드 설명:이 인 스 턴 스 에서 저 는 aop 을 통 해 dao 층 의 get 시작 을 차단 하 는 모든 방법 을 설명 하려 고 합 니 다.먼저 dao 와 간단 한 이마 imp 를 만 들 고 실현 합 니 다.
dao 인 터 페 이 스 는 다음 과 같 습 니 다:
package com.ck.aopTest.dao;
import com.ck.aopTest.model.UserModel;
public interface MyAopDao {
public void getUser();
public void getName(UserModel user);
public void addUser();
}
간단 한 실현:
package com.ck.aopTest.dao.impl;
import org.springframework.stereotype.Repository;
import com.ck.aopTest.dao.MyAopDao;
import com.ck.aopTest.model.UserModel;
@Repository
public class MyAopDaoImpl implements MyAopDao {
@Override
public void getUser() {
System.out.println(" aop dao ");
}
@Override
public void getName(UserModel userModel) {
System.out.println(" aop dao ");
}
@Override
public void addUser() {
System.out.println(" aop dao ");
}
}
그리고 op 을 설명 합 니 다.
package com.ck.aopTest.aop;
import java.util.Date;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
import com.ck.aopTest.model.UserModel;
@Aspect
@Component
public class MyAop {
@Pointcut("execution(public * com.ck.aopTest.dao.impl.*.get*(..))")
private void aopTest() {
}
@Before("aopTest()")
public void before() {
System.out.println(" dao " + new Date().getTime());
}
@After("aopTest()" + "&&args(user)")
public void after(UserModel user) {
System.out.println(user.getName());
System.out.println(" dao " + new Date().getTime());
}
@Around("aopTest()")
public void around(ProceedingJoinPoint pdj) {
System.out.println(" dao " + new Date().getTime());
try {
pdj.proceed();
} catch (Throwable e) {
e.printStackTrace();
}
System.out.println(" dao " + new Date().getTime());
}
}
상기 코드 는 바로 자바 로 op 의 핵심 코드 를 설명 하 는 것 입 니 다.그 중에서@Aspect 의 역할 은 spring 에 게 이것 이 op 류 라 고 알려 주 는 것 입 니 다.그리고@Component 는 더 이상 말 하지 않 아 도 됩 니 다.spring 에 게 이것 은 스 캔 이 필요 한 클래스 라 고 알려 주 는 것 입 니 다.그 다음 에@Pointcut("execution(public*com.ck.aopst.dao.impl.get(...)")은 차단 해 야 할 절단면 이 라 고 공식 적 으로 밝 혔 습 니 다.@Pointcut 과 뒤의 액 execution 은 고정된 쓰기 입 니 다.execution 뒤의 괄호 안의 내용 은 구체 적 인 절단면 입 니 다.여기 서 모든 Public 의 반환 값 이나 void 를 차단 한 다 는 뜻 입 니 다.네 임 스페이스 는 com.ck.aopst.dao.impl 아래 의 모든 클래스 의 get 시작 에 여러 개의 인 자 를 가 진 방법 입 니 다.
쉽게 말 하면 com.ck.aopst.dao.impl 이 가방 의 모든 종류의 get 시작 방법 을 호출 하면 이 op 을 활성화 합 니 다.
그리고 위 에 있 는 부분 에 이 어 우 리 는 private void aopTest()가 비어 있 는 방법 을 보 았 다.실제로 이 방법의 역할 은 이 op 절단면 에 이름 을 설명 하 는 것 이 고 사용 하기에 편리 하 며 여러 개의 op 절단면 을 자 를 때 정상적으로 구분 하 는 것 이다.
그 다음 에@Before,@After,@Around 는 세 가지 선택 가능 한 차단 방식 입 니 다.이름 의 뜻 은 위 에서 설명 한 절단면 에서 가리 키 는 방법 이 호출 되 기 전에 실행,호출 된 후에 실행,그리고 서 라운드 실행 입 니 다.호출 전과 호출 된 후에 이해 하기 쉽 습 니 다.서 라운드 의 의 사 는 호출 전과 그 후에 일정한 논 리 를 수행 하 는 것 입 니 다.
코드 에서 보 듯 이 pdj.proceed();이전 과 그 후에 각각 두 줄 의 데 이 터 를 인쇄 했 습 니 다.pdj.proceed();계속 실행 하 는 것 을 의미 합 니 다.filter 를 아 는 사람 이 라면 이 방법 이 실제로 chain.do Filter 와 비슷 하 다 고 생각 하기 쉬 울 것 입 니 다.통과 로 이해 할 수 있 습 니 다.
이 세 개의 주석 뒤에 사용 할 절단면,즉@Pointcut 성명 의 절단면 을 지정 하고 이름 을 지정 하면 됩 니 다.
코드 에서 한 부분 뒤에'&args(UserModel user)'를 추가 한 것 을 볼 수 있 습 니 다.즉,지정 한 절단면 에 효과 적 인 방법 을 가 진 매개 변 수 를 말 합 니 다.예 를 들 어 위 dao 의 getName 방법 은 UserModel 형식의 매개 변 수 를 가지 고 있 습 니 다.여기 서 사용 할 수 있 습 니 다.
주요 코드 가 작성 되 었 습 니 다.그 다음 에 빠 질 수 없 는 절차 가 있 습 니 다.spring 프로젝트 인 만큼 spring 의 op 입 니 다.그러면 자 연 스 럽 게 spring 파일 을 설정 하고 spring 관리 가 필요 한 가방 을 가 리 켜 야 합 니 다.
<?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" "
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<context:component-scan base-package="com.ck.aopTest.*" />
</beans>
나 는 이곳 의 op 이 정말 효과 가 있 는 지 검증 하기 위해 준 it 테스트 를 썼 다.
package com.ck.aopTest.test;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import com.ck.aopTest.dao.MyAopDao;
import com.ck.aopTest.model.UserModel;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:spring.xml")
public class AopTest {
@Autowired
private MyAopDao myAopDao;
@Test
public void aopTest2() {
UserModel user = new UserModel();
myAopDao.getName(user);
}
}
이치 에 따 르 면 테스트 방법 을 실행 한 후에 많은 출력 을 출력 해 야 합 니 다.그러나 안 타 깝 게 도 결 과 는 dao 의 출력 만 인쇄 되 었 습 니 다.spring 설정 에서 op 을 사용 하지 않 았 기 때 문 입 니 다.정확 한 설정 은 아래 와 같 아야 합 니 다.
<?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-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.0.xsd">
<aop:aspectj-autoproxy />
<context:component-scan base-package="com.ck.aopTest.*" />
</beans>
파일 헤더 추가 가 필요 합 니 다.
xmlns:aop=”http://www.springframework.org/schema/aop”
그리고http://www.springframework.org/schema/aop
이외에 도 op 을 사용 합 니 다:
<aop:aspectj-autoproxy />
테스트 방법 을 다시 실행 하면 콘 솔 이 다음 과 같 습 니 다.이로써 이 op 이 유효 하 다 는 것 을 증명 한다.
두 번 째 방식 으로 파일 설정:
마찬가지 로 여 기 는 이전의 dao 와 대응 하 는 impl 을 사용 하기 때문에 이 코드 는 중복 되 지 않 습 니 다.다른 것 은 구체 적 인 op 류 는 다음 과 같 습 니 다.
package com.ck.aopTest.aop;
public class MyAop2 {
public void before2() {
System.out.println(" aop, dao ");
}
}
이 종 류 를 볼 수 있 습 니 다.실제로 도 아주 간단 합 니 다.일반 류,일반 방법 입 니 다.특별한 것 이 없습니다.그리고 우리 가 해 야 할 일 은 spring 에서 설정 하 는 것 입 니 다.
<?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-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.0.xsd">
<aop:aspectj-autoproxy />
<bean id="myAop2" class="com.ck.aopTest.aop.MyAop2"></bean>
<aop:config>
<aop:pointcut expression="execution(public * com.ck.aopTest.dao.impl.*.add*(..))" id="aopTest1"/>
<aop:aspect id="myAopTest2" ref="myAop2">
<aop:before method="before2" pointcut-ref="aopTest1"/>
</aop:aspect>
</aop:config>
<context:component-scan base-package="com.ck.aopTest.*" />
</beans>
여기 배치 내용 에 대한 구체 적 인 설명 은 제 가 첫 번 째 방식 에 대한 설명 을 통 해 더 이상 말 할 필요 가 없고 조금 만 비교 해 보면 분명 해 질 것 이 라 고 생각 합 니 다.마찬가지 로 여 기 는 before 만 보 여 주 었 고 after 와 round 의 설정 도 before 에 따라 쉽게 추리 할 수 있 을 것 입 니 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
thymeleaf로 HTML 페이지를 동적으로 만듭니다 (spring + gradle)지난번에는 에서 화면에 HTML을 표시했습니다. 이번에는 화면을 동적으로 움직여보고 싶기 때문에 입력한 문자를 화면에 표시시키고 싶습니다. 초보자의 비망록이므로 이상한 점 등 있으면 지적 받을 수 있으면 기쁩니다! ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.