Reflection API 를 이용해 아주아주 간단한 BeanFactory 를 만들어 보았다.
설정용 자바 클래스를 reflection 을 이용해 읽어서 빈들을 로드한다음, 사용하는 쪽이 lookup 할때 제공할 수 있도록 해봤다.
BeanFactory 인스턴스를 생성하면 loadBeans() 를 호출해 BeanConfig안에 있는 모든 메서드들을 호출한다. 이미 BeanConfig 의 메서드들이 실행될때
의존성 주입이 완료되기 때문에 따로 필드주입이나 세터주입은 구현하지 않았다. 나중에 JAXB 를 이용해 만들어볼 생각도 있다.
A, AImpl, B, BImpl 는 생략
public class BeanFactory {
//빈 이름, 빈 오브젝트를 키와 값으로 담는 해시테이블
private HashMap<String, Object> beanMap = new HashMap<>();
public BeanFactory(){
loadBeans();
}
private void loadBeans() {
try {
Class cls = Class.forName("reflection.BeanConfig");
Method[] methods = cls.getDeclaredMethods();
BeanConfig beanConfig = new BeanConfig();
for(int i = 0 ; i < methods.length ; i++){
String mName = methods[i].getName();
Object obj = methods[i].invoke(beanConfig);
beanMap.put(mName, obj);
}
} catch (Exception e) {
e.printStackTrace();
}
}
public Object getBean(String name){
Object obj = beanMap.get(name);
return obj;
}
}
//설정용 클래스
public class BeanConfig {
public A a(){
return new AImpl(b());
}
public B b(){
return new BImpl();
}
}
public class diTest {
public static void main(String[] args) {
BeanFactory beanFactory = new BeanFactory();
//스프링에서는 빈의 이름을 보통 인터페이스의 camelcase 로 한다.
//ex) UserDao -> userDao , UserService -> userService
A a = (A) beanFactory.getBean("a");
a.aMethod();
}
}
오우쉣;;