///////
Search
🍈

스프링 컨테이너가 Reflection API로Bean을 등록하는 방법

Refelction API란?

구체적인 클래스 타입을 알지 못해도, 그 클래스의 정보에 접근할 수 있게 해주는 자바 API이다.
Bean은 어플리케이션이 실행한 후 런타임에 객체가 호출될 때 동적으로 객체의 인스턴스를 생성하는데, 이때 Spring Container의 BeanFactory에서 리플렉션을 사용한다.
public class Car { private final String name; private int position; public Car(String name, int position) { this.name = name; this.position = position; } public void move() { this.position++; } public int getPosition() { return position; } }
Java
복사
위와 같은 클래스가 있다고 생각해보자.
public static void main(String[] args) { Object obj = new Car("foo", 0); }
Java
복사
Object는 가장 최상위 클래스이므로 다형성에 의해 위와 같이 객체를 생성할 수 있다.
다만 위와 같이, 객체를 생성하게 되면 Car 클래스가 가진 move() 메서드를 사용할 수 없다.
public static void main(String[] args) throws Exception { Object obj = new Car("foo", 0); Class carClass = Car.class; // Car 클래스에 있는 move 메서드 호출 Method move = carClass.getMethod("move"); // move 메서드 실행, invoke(메서드를 실행시킬 객체, 해당 메서드에 넘길 인자) move.invoke(obj, null); // Car 클래스에 있는 getPosition 메서드 호출 Method getPosition = carClass.getMethod("getPosition"); int position = (int)getPosition.invoke(obj, null); System.out.println(position); // 출력 결과: 1 }
Java
복사
따라서 위와 같이, Reflection API를 이용하여 클래스에 선언된 메서드를 반환하는 getMethod() 와 메서드를 호출하는 invoke()를 통해 사용할 수 있다.

Spring이 Reflection API를 사용하는 방법

// DefaultListableBeanFactory 인스턴스 생성 DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory(); // Reflection을 사용하여 클래스 로드 및 인스턴스 생성 Class<?> beanClass = Class.forName("com.example.MyBean"); Object beanInstance = beanClass.getDeclaredConstructor().newInstance(); // BeanDefinition 생성 및 설정 BeanDefinition beanDefinition = BeanDefinitionBuilder .genericBeanDefinition(beanClass) .getBeanDefinition(); // Bean Factory에 Bean 등록 String beanName = "myBean"; beanFactory.registerBeanDefinition(beanName, beanDefinition); beanFactory.registerSingleton(beanName, beanInstance);
Java
복사
① Reflection API 사용하여 클래스를 동적으로 로드하고, 인스턴스를 생성한다.
② BeanDefinitionBuilder를 사용하여 BeanDefinition을 생성해 등록하고 동적으로 생성했던 인스턴스도 등록한다.
위와 같은 과정으로 @Controller @Service .. 등의 어노테이션이 붙어있으면,
Bean Factory에 개발자가 직접 빈 등록을 해주지 않아도
Spring이 동적으로 생성하여 Bean Factory에 클래스를 등록하고 관리한다.