org.sam.server.context.BeanFactory Maven / Gradle / Ivy
package org.sam.server.context;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.Set;
/**
* 빈을 관리하는 클래스입니다. BeanContainer는 이미 선언 된 클래스를 기반으로 빈을 생성하지만
* BeanFactory는 런타임시 동적으로 빈을 관리합니다.
*
* @author hypernova1
* @see org.sam.server.context.BeanContainer
* */
public class BeanFactory {
private static final BeanFactory beanFactory;
static {
beanFactory = new BeanFactory();
List list = new ArrayList<>();
BeanInfo beanInfo = new BeanInfo("beanFactory", beanFactory);
list.add(beanInfo);
BeanContainer.getBeanInfoMap().put(BeanFactory.class, list);
}
private BeanFactory() {}
/**
* 인스턴스를 반환합니다.
*
* @return 인스턴스
* */
public static BeanFactory getInstance() {
return beanFactory;
}
/**
* 인자로 받은 이름과, 타입에 해당하는 빈을 반환합니다.
*
* @param 빈 클래스 타입
* @param name 빈 이름
* @param type 빈 클래스
* @return 빈
* */
@SuppressWarnings("unchecked")
public T getBean(String name, Class> type) {
List beanInfos = BeanContainer.getBeanInfoList(type);
BeanInfo savedBeanInfo = beanInfos.stream()
.filter(beanInfo -> beanInfo.getName().equals(name))
.findFirst()
.orElse(null);
return (T) savedBeanInfo;
}
/**
* 인자로 받은 타입에 해당하는 빈 목록을 반환합니다.
*
* @param type 빈 타입
* @return 빈 목록
* */
public List> getBeanList(Class> type) {
Set> classes = BeanContainer.getBeanInfoMap().keySet();
Class> beanType = classes.stream()
.filter(savedBeanType -> savedBeanType.isAssignableFrom(type))
.findFirst()
.orElseGet(() -> getMatchType(classes, type));
List beanInfos = BeanContainer.getBeanInfoList(beanType);
List
© 2015 - 2025 Weber Informatics LLC | Privacy Policy