Spring AOP (5) 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 이 두 개 있 습 니 다.
테스트
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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[MeU] Hashtag 기능 개발➡️ 기존 Tag 테이블에 존재하지 않는 해시태그라면 Tag , tagPostMapping 테이블에 모두 추가 ➡️ 기존에 존재하는 해시태그라면, tagPostMapping 테이블에만 추가 이후에 개발할 태그 기반 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.