Java
[Java] @Controller 애노테이션 설정 클래스 스캔하는 ControllerScanner 클래스 뜯어보기
bkuk
2023. 4. 4. 22:53
ControllerScanner 생성자
ControllerScanner 클래스가 생성될 때, basePackage를 입력받는다.
입력받은 basePackage를 이용해 reflections 객체를 생성한다.
private Reflections reflections;
public ControllerScanner( Object...basePackage) {
reflections = new Reflections(basePackage);
}
getControllers()
reflections 객체를 이용하여 @Controller 어노테이션이 적용된 클래스들을 스캔한다.
스캔된 클래스들을 instantiateControllers() 메서드를 통해 객체화한다.
객체화된 Controller 인스턴스들을 Class와 함께 Map 형태로 반환한다.
public Map<Class<?>, Object> getControllers() {
Set<Class<?>> preInitiatedControllers =
reflections.getTypesAnnotatedWith(Controller.class);
return instantiateControllers(preInitiatedControllers);
}
instantiateControllers()
preInitiatedControllers 파라미터를 통해 미리 생성된 클래스 객체들의 Set을 받는다.
preInitiatedControllers에 속한 클래스 객체들을 순회하면서, 해당 클래스의 기본 생성자를 이용해 인스턴스를 생성한다.
생성된 객체를 Map<Class<?>, Object> 타입으로 반환한다.
public Map<Class<?>, Object> instantiateControllers( Set<Class<?>> preInitiatedControllers ) {
Map<Class<?>, Object> controllers = new HashMap<>();
for( Class<?> clazz : preInitiatedControllers ) {
try {
Constructor<?> constructor = clazz.getConstructor();
controllers.put(clazz, constructor.newInstance() );
} catch (InstantiationException | IllegalAccessException | NoSuchMethodException | InvocationTargetException e) {
log.error( e.getMessage() );
}
}
return controllers;
}
전체 코드
public class ControllerScanner {
private static final Logger log = LoggerFactory.getLogger(ControllerScanner.class);
private Reflections reflections;
public ControllerScanner( Object...basePackage) {
reflections = new Reflections(basePackage);
}
public Map<Class<?>, Object> getControllers() {
Set<Class<?>> preInitiatedControllers =
reflections.getTypesAnnotatedWith(Controller.class);
return instantiateControllers(preInitiatedControllers);
}
public Map<Class<?>, Object> instantiateControllers( Set<Class<?>> preInitiatedControllers ) {
Map<Class<?>, Object> controllers = new HashMap<>();
for( Class<?> clazz : preInitiatedControllers ) {
try {
Constructor<?> constructor = clazz.getConstructor();
controllers.put(clazz, constructor.newInstance() );
} catch (InstantiationException | IllegalAccessException | NoSuchMethodException | InvocationTargetException e) {
log.error( e.getMessage() );
}
}
return controllers;
}
}