spring 절단면 op 차단기

11961 단어 springaop
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 에 따라 쉽게 추리 할 수 있 을 것 입 니 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기