FactoryMethodBasedInstantiationStrategy.java

package sprout.beans.instantiation;

import sprout.beans.BeanCreationMethod;
import sprout.beans.BeanDefinition;
import sprout.context.BeanFactory;

import java.lang.reflect.Method;

/**
 * 팩토리 메서드 기반 빈 인스턴스화 전략
 */
public class FactoryMethodBasedInstantiationStrategy implements BeanInstantiationStrategy {

    @Override
    public Object instantiate(BeanDefinition def, DependencyResolver dependencyResolver, BeanFactory beanFactory) throws Exception {
        // 팩토리 빈 조회
        Object factoryBean = beanFactory.getBean(def.getFactoryBeanName());
        Method factoryMethod = def.getFactoryMethod();

        // 팩토리 메서드의 의존성 해결
        Object[] deps = dependencyResolver.resolve(
                def.getFactoryMethodArgumentTypes(),
                factoryMethod.getParameters(),
                def
        );

        // 팩토리 메서드 호출 (접근 권한 설정)
        factoryMethod.setAccessible(true);
        return factoryMethod.invoke(factoryBean, deps);
    }

    @Override
    public boolean supports(BeanCreationMethod method) {
        return method == BeanCreationMethod.FACTORY_METHOD;
    }
}