Spring AOP (5) AOP 도입

18833 단어 SpringBootAOP
AOP 도입
도입 은 하나의 인 터 페 이 스 를 바탕 으로 새로운 인터페이스 강화 기능 을 도입 하 는 것 이다.
지난 블 로그 에서 AOO 를 테스트 할 때 저 희 는 사용자 정 보 를 인쇄 했 습 니 다. 사용자 정보 가 비어 있 으 면 이상 을 던 집 니 다.
사실 우 리 는 사용자 정보 가 비어 있 는 지 확인 할 수 있 고 비어 있 으 면 인쇄 하지 않 으 면 이상 이 발생 하지 않 습 니 다.
그러나 기 존의 UserService 인 터 페 이 스 는 이러한 기능 을 제공 하지 않 았 습 니 다. 여기 서 UserService 라 는 서 비 스 는 자신 이 제공 한 것 이 아니 라 다른 사람 이 제공 한 것 이 라 고 가정 합 니 다. 우 리 는 그것 을 수정 할 수 없습니다. 이때 Spring 은 이 인터페이스의 기능 을 강화 할 수 있 습 니 다. 우 리 는 이 인터페이스 에 새로운 인 터 페 이 스 를 도입 할 수 있 습 니 다.예 를 들 어 사용자 가 검색 하 는 인터페이스 UserValidator 를 도입 하려 면 다음 과 같이 정의 합 니 다.
UserValidator 인터페이스
package com.lay.springboot_aop.aspect.validator;

import com.lay.springboot_aop.aspect.pojo.User;

public interface UserValidator {
    public boolean validate(User user);
}


UserValidatorImpl 구현 클래스
package com.lay.springboot_aop.aspect.validator.impl;

import com.lay.springboot_aop.aspect.pojo.User;
import com.lay.springboot_aop.aspect.validator.UserValidator;

public class UserValidatorImpl implements UserValidator {
    
    @Override
    public boolean validate(User user) {
        System.out.println("      " + UserValidator.class.getSimpleName());
        return user != null;
    }
    
}


이렇게 하면 우 리 는 Spring AOP 가 도입 한 정 의 를 통 해 UserService 인터페이스의 기능 을 강화 할 수 있 습 니 다. 그리고 우 리 는 절단면 류 에 다음 과 같은 코드 를 추가 할 수 있 습 니 다.
MyAspect 절단면
package com.lay.springboot_aop.aspect;


@Aspect
public class MyAspect {
    
    @DeclareParents(value = "com.lay.springboot_aop.aspect.service.impl.UserServiceImpl*", defaultImpl = UserValidatorImpl.class)
    public UserValidator userValidator;
    
    @Pointcut("execution(* com.lay.springboot_aop.aspect.service.impl.UserServiceImpl.printUser(..))")
    public void pointCut() {
    }
    
    @Before("pointCut()&&args(user)")
    public void before(JoinPoint point ,User user) {
        Object[] args=point.getArgs();
        User a= (User)args[0];
        System.out.println("print in before"+user.getUserName());
        System.out.println("
print in before args = "
+a.getUserName()); System.out.println("before-----------"); } @Around("pointCut()") public void around(ProceedingJoinPoint jp) throws Throwable { System.out.println("around before-------------"); jp.proceed(); System.out.println("around after-------------"); } @After("pointCut()") public void after() { System.out.println("after------------"); } @AfterReturning("pointCut()") public void afterReturning() { System.out.println("afterReturning------------"); } @AfterThrowing("pointCut()") public void afterThrowning() { System.out.println("afterThrowning------------"); } }

여기 서 우 리 는 새로운 주 해 를 보 았 습 니 다. @ Declare Parents 는 새로운 종 류 를 도입 하여 서 비 스 를 강화 하 는 역할 을 하지만 설정 해 야 할 속성 value 와 defalutImpl 이 두 개 있 습 니 다.
  • value: 기능 을 강화 하려 는 목표 대상 을 가리 키 며, UserServiceImpl 대상
  • 을 강화 해 야 합 니 다.
  • defaultImpl: 증강 기능 을 도입 하 는 클래스 입 니 다. 사용자 ValidatorImpl 로 설정 되 어 있 습 니 다. 사용자 가 비어 있 는 지 확인 하 는 기능 을 제공 합 니 다.

  • 테스트
    UserController
    package com.lay.springboot_aop.aspect.controller;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.ResponseBody;
    
    import com.lay.springboot_aop.aspect.pojo.User;
    import com.lay.springboot_aop.aspect.service.UserService;
    import com.lay.springboot_aop.aspect.validator.UserValidator;
    
    @Controller
    @RequestMapping("/user")
    public class UserController {
        @Autowired
        private UserService userService=null;
        
        @RequestMapping("/vap")
        @ResponseBody
        public User validateAndPrintUser(Integer id,String userName,String message) {
            User user=new User();
            user.setId(id);
            user.setUserName(userName);
            user.setMessage(message);
            UserValidator userValidator=(UserValidator)userService;
            if(userValidator.validate(user)) {
                userService.printUser(user);
            }
            return user;
        }
    }
    
    

    그리고 프로젝트 를 시작 하여 브 라 우 저 에 입력 하 십시오.http://localhost:8080/user/vap?id=1&userName=username&message=somemessage

    좋은 웹페이지 즐겨찾기