본문 바로가기
Java

[Java] @Controller 애노테이션 설정 클래스 스캔하는 ControllerScanner 클래스 뜯어보기

by bkuk 2023. 4. 4.

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;
	}
}

댓글