1. IOC 용기 디자인 과 구현

Spring IOC 용기 의 디자인 에서 두 가지 주요 용기 시 리 즈 를 볼 수 있 는데 하 나 는 BeanFactory 인 터 페 이 스 를 실현 하 는 간단 한 용기 시리즈 로 이 용 기 는 용기 의 가장 기본 적 인 기능 만 실현 한다.다른 하 나 는 Application Context 응용 컨 텍스트 로 용기 의 고급 형태 로 존재 합 니 다.응용 컨 텍스트 는 간단 한 용 기 를 바탕 으로 프레임 워 크 를 대상 으로 하 는 특성 을 많이 추 가 했 고 응용 환경 에 도 적합 한 조합 을 많이 했다.
1 BeanFactory
1.1 BeanFactory 의 응용 장면
BeanFactory 인터페이스의 첫 줄 에 이런 코드 가 있어 요.
<span style="font-size:18px;">String FACTORY_BEAN_PREFIX = "&";</span>

이것 은 용 기 를 통 해 Factory Bean 을 가 져 오 는 대상 과 Factory Bean 자 체 를 구분 하 는 전의 문자 '&' 를 정의 합 니 다.예 를 들 어 my Factory 는 Factory Bean 이 라면 '& my Factory' 를 사용 하여 얻 은 것 은 Factory Bean 이지 my Factory 가 발생 하 는 대상 이 아니다.
이 BeanFactory 인터페이스 에서 다음 과 같은 방법 을 정의 합 니 다.
  • BeanFactory 인 터 페 이 스 는 getBean 방법 을 설계 했다. 이 방법 은 IoC 용기 API 를 사용 하 는 주요 한 방법 이다. 이 방법 을 통 해 IoC 용기 에서 관리 하 는 Bean 을 얻 을 수 있 고 Bean 의 획득 은 지 정 된 이름 을 통 해 색인 된다.빈 을 가 져 올 때 빈 의 유형 을 검사 해 야 한다 면 빈 팩 토리 인 터 페 이 스 는 매개 변수 가 있 는 getBean 방법 을 정의 합 니 다. 이 방법 은 매개 변수 가 없 는 getBean 방법 과 유사 하 며 빈 검색 유형 에 대한 요 구 를 증가 시 켰 습 니 다.
    Object getBean(String name) throws BeansException;
    <T> T getBean(String name, Class<T> requiredType) throws BeansException;
    <T> T getBean(Class<T> requiredType) throws BeansException;
    Object getBean(String name, Object... args) throws BeansException;
    <T> T getBean(Class<T> requiredType, Object... args) throws BeansException;
    
  • 인터페이스 방법 인 contains Bean 을 통 해 용기 에 지 정 된 이름 의 Bean 이 있 는 지 여 부 를 판단 할 수 있 습 니 다.
    <span style="font-size:18px;">boolean containsBean(String name);</span>
  • 인터페이스 방법 인 isSingleton 을 통 해 지 정 된 이름 의 Bean 이 Singleton 형식의 Bean 인지 확인 합 니 다.Singleton 속성 에 대해 사용 자 는 BeanDefinition 에서 지정 할 수 있 습 니 다.
    boolean isSingleton(String name) throws NoSuchBeanDefinitionException;
  • 인터페이스 방법 인 isPrototype 을 통 해 지정 한 이름 의 Bean 이 prototype 형식 인지 확인 합 니 다.Singleton 속성 과 마찬가지 로 이 속성 은 사용자 가 BeanDefinition 에서 지정 할 수 있 습 니 다.
    boolean isPrototype(String name) throws NoSuchBeanDefinitionException;
  • 인터페이스 방법 인 isTypeMatch 를 통 해 이름 을 지정 한 Bean 의 Class 유형 이 특정한 Class 유형 인지 조회 합 니 다.이 Class 형식 은 사용자 가 지정 할 수 있 습 니 다.
    boolean isTypeMatch(String name, Class<?> targetType) throws NoSuchBeanDefinitionException;
  • 인터페이스 방법 getType 을 통 해 지정 한 Bean 의 Class 종 류 를 조회 합 니 다.
    Class<?> getType(String name) throws NoSuchBeanDefinitionException;
  • 인터페이스 방법 getAliases 를 통 해 지정 한 Bean 의 모든 별명 을 조회 합 니 다. 이 별명 들 은 사용자 가 Bean Definition 에서 정의 한 것 입 니 다.
    String[] getAliases(String name);

  • 1.2 BeanFactory 용기 의 설계 원리
    XMLbean Factory 는 BeanFactory 의 가장 간단 하고 자주 사용 하 는 실현 류 이다.
    public class XmlBeanFactory extends DefaultListableBeanFactory {
    
    	private final XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(this);
    
    
    	/**
    	 * Create a new XmlBeanFactory with the given resource,
    	 * which must be parsable using DOM.
    	 * @param resource XML resource to load bean definitions from
    	 * @throws BeansException in case of loading or parsing errors
    	 */
    	public XmlBeanFactory(Resource resource) throws BeansException {
    		this(resource, null);
    	}
    
    	/**
    	 * Create a new XmlBeanFactory with the given input stream,
    	 * which must be parsable using DOM.
    	 * @param resource XML resource to load bean definitions from
    	 * @param parentBeanFactory parent bean factory
    	 * @throws BeansException in case of loading or parsing errors
    	 */
    	public XmlBeanFactory(Resource resource, BeanFactory parentBeanFactory) throws BeansException {
    		super(parentBeanFactory);
    		this.reader.loadBeanDefinitions(resource);
    	}
    
    }

    이 는 Default Listable BeanFactory 와 같은 종 류 를 계승 합 니 다. Spring 에 서 는 실제 Default Listable BeanFactory 를 기본 기능 의 완전한 IoC 용기 로 사용 합 니 다.XmlBeanFactory 는 Default Listable BeanFactory 용기 의 기능 을 계승 하 는 동시에 새로운 기능 을 추가 했다. 그것 은 XML 파일 을 분석 하여 BeanFactory 를 초기 화 하 는 것 이다.
    소스 코드 를 통 해 알 수 있 듯 이 XMLbean Factory 의 구 조 는 BeanDefinition 의 소스 를 지정 해 야 합 니 다. 이것 은 Resouce 의 패키지 에서 기원 되 었 습 니 다.이렇게 하면 IOC 용 기 는 BeanDefinition 을 이용 하여 용기 의 초기 화 와 주입 과정 에 의존 할 수 있다.
    실제로 전체 BeanFactory 의 구축 과정 은 다음 과 같은 몇 단계 로 이 루어 집 니 다.
    (1) BeanDefinition 의 원본 을 지정 합 니 다. 여 기 는 Resouce 류 를 사용 합 니 다.
    (2) IOC 용 기 를 정의 합 니 다. 즉, XMLbean Factory 는 Default Listable Bean Factory 라 고 할 수 있 습 니 다. 이때 이 용 기 는 비어 있 고 안에 아무것도 없습니다.
    (3) BeanDefinition 과 IOC 용기 사이 에 관 계 를 맺 어야 합 니 다. XMLBeanFactory 에서 사용 하 는 것 은 XmlBeanDefinitionReader 입 니 다. IOC 용기 설정 이 완료 되 고 이 때 IOC 용기 가 완 성 됩 니 다.
    Bean Factory 초기 화 할 때 모든 Bean 을 초기 화하 지 않 고 getBean 초기 화 합 니 다.
    2 ApplicationContext
    이것 은 BeanFactory 의 계승 시스템 에서 중간 위치 에 있 는 인터페이스 로 BeanFactory 를 바탕 으로 더욱 고 급 스 러 운 기능 을 제공 합 니 다.
    public interface ApplicationContext extends EnvironmentCapable, ListableBeanFactory, HierarchicalBeanFactory,
    		MessageSource, ApplicationEventPublisher, ResourcePatternResolver 
  • 서로 다른 정보 원 을 지원 합 니 다.응용 프로그램 Context 가 MessageSource 인 터 페 이 스 를 확장 하 는 것 을 보 았 습 니 다. 이러한 정보 원 의 확장 기능 은 국제 화 실현 을 지원 하고 다 중 언어 버 전의 응용 을 개발 하 는 데 서 비 스 를 제공 할 수 있 습 니 다.
  • 자원 방문.이 기능 은 리 소스 Loader 와 리 소스 에 대한 지원 에 나타 나 며, 서로 다른 곳 에서 빈 정의 자원 을 얻 을 수 있 습 니 다.이러한 추상 은 사용자 프로그램 으로 하여 금 Bean 정의 정 보 를 유연 하 게 정의 할 수 있 게 한다. 특히 서로 다른 I / O 경로 에서 Bean 정의 정 보 를 얻 을 수 있다.이 는 인터페이스 관계 에 서 는 알 수 없 지만 일반적으로 구체 적 인 applicationContext 는 Default Resource Loader 의 하위 클래스 를 계승 합 니 다.DefaultResourceLoader 는 AbstractApplication Context 의 기본 클래스 이기 때문에 리 소스 가 IoC 용기 에서 사용 되 는 것 에 대해 서 는 자세 한 설명 이 있 을 것 입 니 다.
  • 응용 이 벤트 를 지원 합 니 다.인터페이스 ApplicationEventPublisher 를 계승 하여 문맥 에 이벤트 체 제 를 도입 하 였 습 니 다.이 사건 들 과 빈 의 라 이 프 사이클 의 결합 은 빈 의 관리 에 편 의 를 제공 했다.
  • 응용 프로그램 Context 에서 제공 하 는 부가 서비스.이러한 서 비 스 는 기본 적 인 IoC 용기 의 기능 을 더욱 풍부하게 한다.이러한 풍부 한 부가 기능 을 갖 추고 있 기 때문에 ApplicationContext 는 간단 한 BeanFactory 에 비해 프레임 워 크 를 위 한 사용 스타일 이기 때문에 일반적으로 응용 프로그램 을 개발 할 때 ApplicationContext 를 IoC 용기 의 기본 형식 으로 사용 하 는 것 을 권장 합 니 다.

  • Application Context 의 상용 실현 클래스 는 ClassPathXmlApplication Context, FileSystemXmlApplication Context 와 AnnotationConfigApplication Context 이 며, 웹 에서 Spring 용 기 를 사용 하면 보통 XmlWebApplication Context 와 AnnotationConfigWebApplication Context 두 가지 실현 클래스 가 있다.
    응용 프로그램 Context 가 초기 화 될 때, 기본 값 은 모든 sigletonBean 을 미리 초기 화 합 니 다.이것 은 시스템 에서 응용 프로그램 Context 를 만 들 때 비교적 큰 비용 이 들 었 다 는 것 을 의미한다

    좋은 웹페이지 즐겨찾기