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에 클래스를 등록하고 관리한다.