작성
·
276
0
SimpleJobLauncher simpleJobLauncher = (SimpleJobLauncher) basicBatchConfigurer.getJobLauncher();
이렇게 캐스팅을 하는 이유는 jobLauncher에서 직접적으로 캐스팅을 할 수 없는 문제가 있어서 한다고 배웠습니다.
확인해보니 JobLauncher는 jdk dynamic proxy로 생성되어져있는데 cglib가 아닌 특별한 이유가 있을까요?
답변 1
2
네
JobLauncher 인터페이스 타입으로 빈을 설정하는 클래스인 SimpleBatchConfiguration 을 보면 다음과 같은 구문이 나옵니다.
@Override
@Bean
public JobLauncher jobLauncher() throws Exception {
return createLazyProxy(jobLauncher, JobLauncher.class);
}
.....
......
private <T> T createLazyProxy(AtomicReference<T> reference, Class<T> type) {
ProxyFactory factory = new ProxyFactory();
factory.setTargetSource(new ReferenceTargetSource<>(reference));
factory.addAdvice(new PassthruAdvice());
factory.setInterfaces(new Class<?>[] { type });
@SuppressWarnings("unchecked")
T proxy = (T) factory.getProxy();
return proxy;
}
보시면 JobLauncher 타입의 프록시 객체를 만들고 있는데 ProxyFactory 클래스를 보면 cglib 가 실행되도록 강제하는 proxyTargetClass = true 와 같은 설정을 별도로 하지 않고 있습니다.
즉 인터페이스 타입으로 프록시 객체를 생성하고 있기 때문에 jdk dynamic proxy 가 실행되고 있습니다.
참고로 스프링 부트는 기본적으로 cglib 방식으로 프록시를 생성하고 있지만 위와 같이 별도로 프록시를 생성하는 경우에는 우선적으로 설정을 따르고 있습니다.