AOP(TimeTraceAop)를 @Component 로 선언 vs SpringConfig에 @Bean으로 등록
4095
작성한 질문수 1
안녕하세요. 김영한 팀장님,
AOP(TimeTraceAop)를 @Component로 선언하지 않고
SpringConfig에 @Bean으로 등록할 수 있다고 설명하셨는데 실제로 코드를 돌려보면 빈 순환 참조 에러가 발생합니다.
강의대로 @Component로만 선언하면 문제가 없는데
왜 순환참조가 나는지 질문드립니다.
감사합니다.
The dependencies of some of the beans in the application context form a cycle:
memberController defined in file [~~~\out\production\classes\com\example\springexample\controller\MemberController.class]
↓
memberService defined in class path resource [com/example/springexample/SpringConfig.class]
┌─────┐
| timeTraceAop defined in class path resource [com/example/springexample/SpringConfig.class]
답변 11
101
안녕하세요. raifado님 좋은 질문입니다.
직접 @Bean으로 등록했을 때 순환참조가 발생하는 이유는 다음과 같습니다.
@Configuration
public class SpringConfig {
@Bean
public TimeTraceAop timeTraceAop() {
return new TimeTraceAop();
}
}
@Aspect
public class TimeTraceAop {
@Around("execution(* hello.hellospring..*(..))")
public Object execute(ProceedingJoinPoint joinPoint) throws Throwable { }
}
TimeTraceAop의 AOP 대상을 지정하는 @Around 코드를 보시면, SpringConfig의 timeTraceAop() 메서드도 AOP로 처리하게 됩니다. 그런데 이게 바로 자기 자신인 TimeTraceAop를 생성하는 코드인 것이지요. 그래서 순환참조 문제가 발생합니다.
반면에 컴포넌트 스캔을 사용할 때는 AOP의 대상이 되는 이런 코드 자체가 없기 때문에 문제가 발생하지 않았습니다.
그러면 AOP 설정 클래스를 빈으로 직접 등록할 때는 어떻게 문제를 해결하면 될까요? 바로 다음과 같이 AOP 대상에서 SpringConfig를 빼주면 됩니다.
@Aspect
public class TimeTraceAop {
@Around("execution(* hello.hellospring..*(..)) && !target(hello.hellospring.SpringConfig)")
//@Around("execution(* hello.hellospring..*(..))")
public Object execute(ProceedingJoinPoint joinPoint) throws Throwable {...}
}
도움이 되셨길 바래요^^
5
스프링부트 2.1 부터는 overriding 옵션이 false로 default 설정이 된다고 하네요.
https://n1tjrgns.tistory.com/172
SpringConfig.java에서 "@Bean public TimeTraceAop" 만들 때는
"@Component public class TimeTraceAop " 여기서 추가로 Bean이
중복 생성되므로 둘 중 한쪽 Bean은 제거해야 합니다.
("스프링입문_강의자료.pdf" 의 61쪽에 "@Component @Aspect public class TimeTraceAop" 만 있고 SpringConfig.java에 "@Bean public TimeTraceAop" 을 생성하지 않았네요. )
SpringConfig.java에서 "@Bean public TimeTraceAop" 사용하려면 @Component 삭제 하거나
application.properties의
spring.main.allow-bean-definition-overriding=true
추가 하면 된다고 하네요.
..
0
76
2
Unused property.....
0
99
2
project JDK is misconfigured
0
130
2
외부 API의 ID 타입(String/UUID)과 내부 도메인의 ID 타입(Long)이 불일치할 때의 설계 정석
0
82
2
단위/통합 테스트 버전충돌 문제
0
91
2
❗️springboot 4.0.2 버전 aspectj dependency 설정❗️
0
229
1
왜 컨트롤러는 변한게 없는데 새로 만든 html 파일이 뜨나요?
0
102
2
윈도우 build test오류 질문
1
102
2
테스트 관련 공부에 대한 조언을 얻고 싶습니다
0
98
2
테스트 실행 시 에러 질문
0
291
1
name을 통한 비교와 객체를 통한 비교
0
77
1
빌드 후 libs 없음
1
128
1
윈도우 gradlew.bat 에러
0
167
1
@PostMapping("/members/new")가 동작하지 않습니다
0
88
1
java static class와 kotlin class
0
77
1
스프링 DB연결
0
126
1
소요 시간
0
85
2
ddl.sql에 빨간 밑줄
1
101
2
welcome page 에러
0
180
3
잘 모르겠습니다.
0
163
2
fail을 똑같이 쳤는데 오류가 발생해요
0
156
2
index.html Welcome page
0
121
1
프로젝트 gradle-groovy ?
0
366
1
테스트코드 메서드명 한글
0
201
2





