[spring] ClassPathBeanDefinitionScanner 사용과 관련된 spring3에서 spring4의 큰 변화
general java 2017. 3. 27. 11:34spring3는 ClassPathBeanDefinitionScanner을 제공해서 spring container에 bean을 생성할 수 있도록 도와준다.
ClassPathBeanDefinitionScanner scanner = new PlayClassPathBeanDefinitionScanner(applicationContext);
String scanBasePackage = ..
scanner.scan(scanBasePackage.split(","));
예를 들어, play1 playframework의 spring module은 ClassPathBeanDefinitionScanner을 사용한다.
그런데.. play1 playframework의 spinrg module을 spring4로 변경하면 동작이 안된다.
spring3과 spring4의 차이를 살펴본다.
문제가 되는 부분을 설명한다. 내부에 ConfigurationClassParser 클래스의 asSourceClass 메소드가 변경되었다.
spring3 코드와 달리 spring4에서는 외부에서 읽힐 때 현재 classload에서 읽지 목한다면 ClassNotFoundException이 생긴다.(안전함을 더 중요하게 여기고 수정되었다)
<spring 3>
/**
* Factory method to obtain a {@link SourceClass} from a {@link Class}.
*/
public SourceClass asSourceClass(Class<?> classType) throws IOException {
try {
// Sanity test that we can read annotations, if not fall back to ASM
classType.getAnnotations();
return new SourceClass(classType);
}
catch (Throwable ex) {
// Enforce ASM via class name resolution
return asSourceClass(classType.getName());
}
}
<spring 4>
/**
* Factory method to obtain a {@link SourceClass} from a class name.
*/
public SourceClass asSourceClass(String className) throws IOException {
if (className.startsWith("java")) {
// Never use ASM for core java types
try {
return new SourceClass(this.resourceLoader.getClassLoader().loadClass(className));
}
catch (ClassNotFoundException ex) {
throw new NestedIOException("Failed to load class [" + className + "]", ex);
}
}
return new SourceClass(this.metadataReaderFactory.getMetadataReader(className));
}
참고
https://jira.spring.io/browse/SPR-15245
'general java' 카테고리의 다른 글
이모티콘 저장시 mysql 관련 히스토리 (0) | 2017.06.05 |
---|---|
mysql driver 버전 5에서 버전 6로 변경시 이슈 (0) | 2017.04.11 |
[spring] @Scheduled-fixedDelayString 예시와 annot parse into integer 문제 해결 (0) | 2017.03.11 |
[java] byte[] 쉽게 만들기 (0) | 2017.03.03 |
[spring] schedule 어노테이션을 사용해 똑같은 주기가 되지 않도록 하기 (0) | 2017.03.02 |