자바 클래스를 Reflection 으로 읽어 bean 들을 생성해주는 아주 간단한 BeanFactory를 만들어 보았다.

charco·2021년 7월 30일
0

재미코딩

목록 보기
10/10

Reflection API 를 이용해 아주아주 간단한 BeanFactory 를 만들어 보았다.
설정용 자바 클래스를 reflection 을 이용해 읽어서 빈들을 로드한다음, 사용하는 쪽이 lookup 할때 제공할 수 있도록 해봤다.


프로세스

BeanFactory 인스턴스를 생성하면 loadBeans() 를 호출해 BeanConfig안에 있는 모든 메서드들을 호출한다. 이미 BeanConfig 의 메서드들이 실행될때
의존성 주입이 완료되기 때문에 따로 필드주입이나 세터주입은 구현하지 않았다. 나중에 JAXB 를 이용해 만들어볼 생각도 있다.


소스코드

A, AImpl, B, BImpl 는 생략

BeanFactory 클래스

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

}

BeanConfig 클래스

//설정용 클래스
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();
    }
}
profile
아직 배우는 중입니다

1개의 댓글

comment-user-thumbnail
2021년 10월 31일

오우쉣;;

답글 달기