[Spring] Spring DI: 자동객체등록(@Component)

DEVRANG·2022년 12월 23일
0

@Component 애너테이션

class에 @Component애너테이션 붙어있으면 자동으로 객체 생성

package com.fastcampus.ch3.diCopy3;


import com.google.common.reflect.ClassPath;
import org.springframework.util.StringUtils;

import java.awt.*;
import java.io.FileReader;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
import java.util.Set;

// ** 객체 생성 원하는 클래스 앞에  @Component 애너테이션 
@org.springframework.stereotype.Component
class Car{ }
@org.springframework.stereotype.Component class SportsCar extends Car{}
@org.springframework.stereotype.Component class Truck extends  Car{}
@org.springframework.stereotype.Component class Engine{}

//===============class AppContext===============
class ApppContext {
    Map map; //객체 저장소

    ApppContext() {
        map = new HashMap();
        // ** AppContext 객체 생성 시, 애너테이션 검색 후 객체생성하는 메서드 실행
        doComponentScan();
    }

    private  void doComponentScan(){
    	// ** doComponentScan() 메서드가 하는 일 
        
        //1. 패키지 내의 클래스 목록 가져온다

        //2. 반복문으로 클래스를 하나씩 일어와서 @Component이 붙어 있는지 확인

        //3. @component가 붙어있으면 객체를 생성해서 map에 저장
        
        try {
            ClassLoader classLoader = ApppContext.class.getClassLoader();
            ClassPath classPath = ClassPath.from(classLoader);
            
			// ** 클래스 경로로 패키지 내의 클래스 목록 가져오기 
            Set<ClassPath.ClassInfo> set = classPath.getTopLevelClasses("com.fastcampus.ch3.diCopy3");
            
			// ** 반복문으로 @Component 애너테이션 검색
            for(ClassPath.ClassInfo classInfo : set){
                Class clazz = classInfo.load();
                Component component = (Component) clazz.getAnnotation(Component.class);
                if(component != null){ //@Component 애너테이션이 있으면 map에 저장
                    String id = StringUtils.uncapitalize(classInfo.getSimpleName());
                    map.put(id, clazz.newInstance());
                    // ** map에 객체 저장 
                }
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        } catch (InstantiationException e) {
            throw new RuntimeException(e);
        } catch (IllegalAccessException e) {
            throw new RuntimeException(e);
        }
    }

    Object getBean(String key){
        return  map.get(key);
    }
}
//===============class AppContext===============

public class Main3 {
    public static void main(String[] args) throws  Exception{
        ApppContext ac = new ApppContext();

        Car car = (Car)ac.getBean("car");
        Engine engine = (Engine) ac.getBean("engine");

        System.out.println("car = " + car);
        System.out.println("engine = " + engine);
    }

}
profile
완주가 목표인 호랑이

0개의 댓글