inblog logo
|
harimmon
    스프링부트

    [스프링부트] 5. 컴포넌트 스캔

    백하림's avatar
    백하림
    Mar 13, 2025
    [스프링부트] 5. 컴포넌트 스캔
    Contents
    📌 코드 설명📌 정리
     

    ex04 안에 있는 모든 클래스 스캔

    package ex04; import java.io.File; import java.net.URL; import java.util.HashSet; import java.util.Set; public class App { public static void main(String[] args) { // 1. @Component가 붙으면 new해서 컬렉션에 담기 Set<Object> instances = new HashSet(); ClassLoader classLoader = ClassLoader.getSystemClassLoader(); URL packageUrl = classLoader.getResource("ex04"); File packageDir = new File(packageUrl.getFile()); for (File file : packageDir.listFiles()) { if (file.getName().endsWith(".class")) { String className = "ex04." + file.getName().replace(".class", ""); System.out.println(className); } } } }
    notion image

    ex04 안에 있는 클래스 중 @Component가 붙은 클래스만 출력

    package ex04; import java.io.File; import java.net.URL; import java.util.HashSet; import java.util.Set; public class App { public static void main(String[] args) { // 1. @Component가 붙으면 new해서 컬렉션에 담기 Set<Object> instances = new HashSet(); ClassLoader classLoader = ClassLoader.getSystemClassLoader(); URL packageUrl = classLoader.getResource("ex04"); File packageDir = new File(packageUrl.getFile()); for (File file : packageDir.listFiles()) { if (file.getName().endsWith(".class")) { String className = "ex04." + file.getName().replace(".class", ""); //System.out.println(className); try { Class cls = Class.forName(className); if (cls.isAnnotationPresent(Component.class)) { Object instance = cls.getDeclaredConstructor().newInstance(); instances.add(instance); } } catch (Exception e) { throw new RuntimeException(e); } } } // for 종료 for (Object instance : instances) { System.out.println(instance.getClass().getName()); } } }
    notion image

    📌 코드 설명

    1️⃣ 패키지에서 .class 파일 탐색

    ClassLoader classLoader = ClassLoader.getSystemClassLoader(); URL packageUrl = classLoader.getResource("ex04"); File packageDir = new File(packageUrl.getFile()
    💡
    • ex04 패키지의 위치를 찾아 해당 디렉토리를 File 객체로 변환
    for (File file : packageDir.listFiles()) { if (file.getName().endsWith(".class")) { String className = "ex04." + file.getName().replace(".class", ""); System.out.println(className); } }
    💡
    • .class 확장자가 붙은 파일을 찾아 클래스 이름을 문자열로 변환

    2️⃣ @Component가 있는 클래스만 인스턴스화

    Class cls = Class.forName(className); if (cls.isAnnotationPresent(Component.class)) { Object instance = cls.getDeclaredConstructor().newInstance(); instances.add(instance);
    💡
    • Class.forName()을 사용하여 문자열을 실제 클래스 객체로 변환
    • cls.isAnnotationPresent(Component.class)으로 @Component가 붙은 클래스만 필터링
    • cls.getDeclaredConstructor().newInstance()를 통해 인스턴스를 생성하고 Set<Object>에 저장

    3️⃣ 결과 출력

    for (Object instance : instances) { System.out.println(instance.getClass().getName()); }
    💡
    • @Component가 붙은 클래스의 인스턴스 목록을 출력

    📌 정리

    기능
    설명
    패키지 내 .class 파일 찾기
    ClassLoader와 File을 이용해 특정 패키지에서 .class 파일 목록을 가져옴
    리플렉션으로 클래스 로딩
    Class.forName(className)을 사용하여 문자열을 실제 클래스 객체로 변환
    @Component 확인
    cls.isAnnotationPresent(Component.class)으로 @Component 애너테이션이 있는지 검사
    객체 생성 및 저장
    cls.getDeclaredConstructor().newInstance()를 이용해 인스턴스를 생성하고 Set<Object>에 저장
    결과 출력
    Set<Object>에 저장된 인스턴스의 클래스명을 출력
     
    Share article

    harimmon

    RSS·Powered by Inblog