어떤 스프링 빈이 advisor1, advisor2 가 제공하는 포인트컷의 조건을 모두 만족하면 프록시 자동 생성기는 프록시를 몇개 생성할까?
<여러 프록시를 사용했을때>

만약에, 적용해야할 advisor가 10개라면 프록시를 10개 생성해야한다.
이 방법은 매우 비효율적이다.
Spring은 이를 해결하기위해 '프록시 팩토리' 객체를 지원한다.
아래의 코드를 보자
@Test
@DisplayName("하나의 프록시, 여러 어드바이저") void multiAdvisorTest2() {
//proxy -> advisor2 -> advisor1 -> target
DefaultPointcutAdvisor advisor2
= new DefaultPointcutAdvisor(Pointcut.TRUE,
new Advice2());
DefaultPointcutAdvisor advisor1
= new DefaultPointcutAdvisor(Pointcut.TRUE,
new Advice1());
ServiceInterface target = new ServiceImpl();
ProxyFactory proxyFactory1 = new ProxyFactory(target);
proxyFactory1.addAdvisor(advisor2);
proxyFactory1.addAdvisor(advisor1);
ServiceInterface proxy = (ServiceInterface) proxyFactory1.getProxy();
//실행
proxy.save();
}
코드를 보면 proxyFactory.addAdvisor(adviosr1); , proxyFactory.addAdvisor(adviosr2); 를 통해 두개의 advisor 를 추가하는 코드를 확인할 수 있다.
자동 프록시 생성기는 모든 Advisor 빈들을 조회하고 pointcut의 프록시 적용 대상을 체크한다.
advisor1 의 포인트컷만 만족 프록시1개 생성, 프록시에 advisor1 만 포함advisor1 , advisor2 의 포인트컷을 모두 만족 프록시1개 생성, 프록시에 advisor1,advisor2 모두 포함advisor1 , advisor2 의 포인트컷을 모두 만족하지 않음 프록시가 생성되지 않음자동 프록시 생성기

여기서 가장 중요한것은 '빈'으로 등록되는것은 real객체가 아니라 '프록시 객체' 라는점이다.
두개의 advisor의 포인트컷을 만족 시킬 경우 다음 그림과 같다

프록시를 생성하는 '주체'는 프록시 팩토리이고
자동 프록시 생성기는 프록시 팩토리를 이용해서 프록시를 생성한다.