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