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;
}
}
'Java' 카테고리의 다른 글
[Java] 왜 DI(Dependency Injection)가 필요한가? (0) | 2023.04.10 |
---|---|
[Java] MVC 프레임워크에서 @RequestMapping 애노테이션 설정을 활용한 매핑하는 클래스 뜯어보기 (0) | 2023.04.04 |
[Java] Class 클래스 / 리플렉션 / 동적로딩 (0) | 2023.04.04 |
[Servlet-jsp] 서비스(Service) 클래스 추가를 통한 컨트롤러 중복 제거 (0) | 2023.04.01 |
[Servlet-jsp] DAO(Data Access Object)에서 데이터베이스 접근 로직을 구현할 때 사용하는 JdbcTemplate를 싱글톤 패턴으로 구현하기 (0) | 2023.03.31 |