package com.fastcampus.ch3.diCopy3;
import com.google.common.reflect.ClassPath;
import org.springframework.util.StringUtils;
import org.springframework.stereotype.Component;
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 class Car{}
@Component class SportsCar extends Car{}
@Component class Truck extends Car{}
//@Component
class Engine{}
class AppContext{
Map map; //객체 저장소
AppContext() {
map = new HashMap();
doComponentScan();
}
private void doComponentScan(){
try {
//1. 패키지 내의 클래스 목록을 가져온다.
//2. 반복문으로 클래스를 하나씩 읽어와서 @Component가 붙어있는지 확인
//3. @Component가 붙어있으면 객체를 생성해서 map에 저장
ClassLoader classLoader = AppContext.class.getClassLoader();
ClassPath classPath = ClassPath.from(classLoader);
Set<ClassPath.ClassInfo> set = classPath.getTopLevelClasses("com.fastcampus.ch3.diCopy3");
for(ClassPath.ClassInfo classInfo:set){
Class clazz = classInfo.load();
Component component=(Component) clazz.getAnnotation(Component.class);
if(component!=null){
String id= StringUtils.uncapitalize(classInfo.getSimpleName());
map.put(id,clazz.newInstance());
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
Object getBean(String key){
return map.get(key);
}
}
public class Main4 {
public static void main(String[] args) throws Exception {
AppContext ac = new AppContext();
Car car = (Car) ac.getBean("car");
Engine engine = (Engine) ac.getBean("engine");
System.out.println("car = " + car);
System.out.println("engine = " + engine);
}
}
본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.
패스트캠퍼스 [직장인 실무교육]
프로그래밍, 영상편집, UX/UI, 마케팅, 데이터 분석, 엑셀강의, The RED, 국비지원, 기업교육, 서비스 제공.
fastcampus.co.kr
'패캠 챌린지' 카테고리의 다른 글
스프링 DI 활용하기 - 실습 (0) | 2023.03.22 |
---|---|
스프링 DI 흉내내기 - 객체 찾는 법 (by type/by name) (0) | 2023.03.22 |
패스트캠퍼스 챌린지 - 29일차 [스프링의 정석:남궁성과 끝까지 간다] (0) | 2023.03.20 |
패스트캠퍼스 챌린지 - 28일차 [스프링의 정석:남궁성과 끝까지 간다] (0) | 2023.03.19 |
패스트캠퍼스 챌린지 - 27일차 [스프링의 정석:남궁성과 끝까지 간다] (0) | 2023.03.18 |