CompositeDependencyResolver.java
package sprout.beans.instantiation;
import sprout.beans.BeanDefinition;
import java.lang.reflect.Parameter;
import java.util.List;
/**
* 여러 DependencyTypeResolver를 조합하여 사용하는 Composite Resolver
* Chain of Responsibility 패턴 적용
*/
public class CompositeDependencyResolver implements DependencyResolver {
private final List<DependencyTypeResolver> typeResolvers;
public CompositeDependencyResolver(List<DependencyTypeResolver> typeResolvers) {
this.typeResolvers = typeResolvers;
}
@Override
public Object[] resolve(Class<?>[] dependencyTypes, Parameter[] params, BeanDefinition targetDef) {
Object[] deps = new Object[dependencyTypes.length];
for (int i = 0; i < dependencyTypes.length; i++) {
Class<?> paramType = dependencyTypes[i];
Parameter param = params[i];
// 적절한 resolver를 찾아서 의존성 해결
Object resolved = null;
for (DependencyTypeResolver resolver : typeResolvers) {
if (resolver.supports(paramType)) {
resolved = resolver.resolve(paramType, param, targetDef);
break;
}
}
if (resolved == null) {
throw new RuntimeException(
"No DependencyTypeResolver found for type: " + paramType.getName() +
" in bean: " + targetDef.getName()
);
}
deps[i] = resolved;
}
return deps;
}
}