spring5 소스 코드 분석 시리즈 (2 개) - 봄 핵심 컨테이너 아키텍처

첫째, 우리는 다음 IOC와 DI를 알게 :

  • 컨트롤 IOC (제어 반전) 반전 : 제어 반전을 달성하기 위해 역방향 돕기 위해 컨테이너 코드에 따라 요구가 구현되는 것을 원래 코드 내부 객체를 생성한다. 우리는 컨테이너 및 컨테이너가 객체와 객체의 요구 사이의 관계가 작성 될 알려주 필요성에 대한 설명을 작성해야합니다 그래서. 이 문서는 가장 구체적인 표현은 구성 할 수 있습니다 설명합니다.
  • DI (의존성 주입) DI는 : 즉는 객체 클래스에 따라 컨테이너에서 찾을 수없는 대신 클래스를 찾을 수동적으로 자신의 이니셔티브에 의존하는 대상을 의미하지만, 컨테이너는 활성 객체는 그것에게 종속 클래스 주입을 인스턴스화 될 때 그것.

다음 질문에 대해 생각 :

  • 어떻게 객체와 객체 관계형 표현? XML로 표현 될 수 있으며, 속성은 의미 프로필을 파일.
  • 파일 객체 사이의 관계를 저장 설명? 클래스 경로, 등등 파일 시스템의 servletContext합니다.
  • 구성 파일과 함께뿐만 아니라 구성 파일을 구문 분석 할 필요가있다. 다른 프로파일은 표준, 사용자 정의 선언, 어떻게 그것을 통합으로, 오브젝트의 설명과 동일하지 않습니다? 이 객체 내부의 통일 된 정의를 요구, 모든 외부 설명은 정의의 통일 설명으로 변환해야합니다.
  • 어떻게 서로 다른 프로파일을 구문 분석? 다른 구성 파일 구문, 다른 파서의 필요성.

우리가 봄을 수행하는 방법을 보면 다음.

1.BeanFactory

봄 콩, 공장 패턴, 콩 식물, 즉 IOC 컨테이너의이 시리즈를 사용하여 만든 개체 관리 개발자 사이의 종속성을 편리하고 기본적인 서비스를 많이 제공합니다. 많은 봄 IOC는 선택과의 관계를 다음과 용기의 사용을 구현 있습니다 :

ListableBeanFactory, HierarchicalBeanFactory 및 AutowireCapableBeanFactory : 최상위 인터페이스 클래스와의 BeanFactory는 기본적인 기능 명세 IOC 컨테이너, BeanFactory에 세 개의 서브 클래스를 정의합니다. 마지막 카테고리는 그가 모든 인터페이스를 구현하는 기본 구현의 DefaultListableBeanFactory입니다.

왜 이렇게 많은 정의 수준은 인터페이스해야합니까? 이제 이러한 인터페이스와 각각의 인터페이스는 주로 조작 중에 스프링 내부 객체 전송 및 변환 과정을 구별하기 위해, 그 용도가 발견의 소스 설명, 타겟 액세스 제한 데이터를 만들었다. 예를 들어 ListableBeanFactory 인터페이스는 콩이의 목록입니다 대표, HierarchicalBeanFactory 콩이 부모 각각의 콩 콩을 가능성이 그 상속 있음을 나타냅니다. 콩 AutowireCapableBeanFactory 자동 조립 인터페이스 정의 규칙. 이 네 개의 인터페이스는 수집 콩, 콩, 콩의 행동 사이의 관계를 정의하기 위해 함께 작동합니다.

BeanFactory를 우리는 방법의 소스 코드를 보면 :

public interface BeanFactory {
    // 对FactoryBean的转义定义,因为如果使用bean的名字检索FactoryBean得到的对象是工厂生成的对象,
    // 如果需要得到工厂本身,需要转义
    String FACTORY_BEAN_PREFIX = "&";
    
    // 根据bean的名字,获取在IOC容器中得到bean实例
    Object getBean(String name) throws BeansException;
        
    //根据bean的名字和Class类型来得到bean实例,增加了类型安全验证机制。
    <T> T getBean(String name, @Nullable Class<T> requiredType) throws BeansException;
    
    Object getBean(String name, Object... args) throws BeansException;
    <T> T getBean(Class<T> requiredType) throws BeansException;
    <T> T getBean(Class<T> requiredType, Object... args) throws BeansException;
    
    // 提供对bean的检索,看看是否在IOC容器有这个名字的bean
    boolean containsBean(String name);
    
    //根据bean名字得到bean实例,并同时判断这个bean是不是单例
    boolean isSingleton(String name) throws NoSuchBeanDefinitionException;
    
    boolean isPrototype(String name) throws NoSuchBeanDefinitionException;
    boolean isTypeMatch(String name, ResolvableType typeToMatch) throws NoSuchBeanDefinitionException;
    boolean isTypeMatch(String name, @Nullable Class<?> typeToMatch) throws NoSuchBeanDefinitionException;
    
    // 得到bean实例的Class类型
    @Nullable
    Class<?> getType(String name) throws NoSuchBeanDefinitionException;
    
    // 得到bean的别名,如果根据别名检索,那么其原名也会被检索出来
    String[] getAliases(String name);
}

매우 유사하고 쉽게 이름에서 혼동의 FactoryBean라는 클래스가있다 BeanFactory에가의 FactoryBean 콩은 BeanFactory에 우선 공장,이 특정 콩 생산 의지 콩의 특별한 종류 : FACTORY_BEAN_PREFIX를 들어, 다음은 다음을 설명하기 다른 콩은 일반 콩에 대한 BeanFactory에의 getBean의 콩 방법으로 얻을 수 있고, 당신의 FactoryBean 자체, 당신이 할 수있는 얻으려면의 FactoryBean을 위해, 그것은 오히려의 FactoryBean 자체보다는 콩의 getBean의 FactoryBean 생산에 의해 얻어진다 접두사 및, 봄 이해, 원래는 FactoryBean이 필요합니다.

IOC 컨테이너의 BeanFactory에 단지 기본 동작은 우리 콩로드하는 방법의 정의가 얼마나 걱정하지 않는다, 정의되었다.
식물은 개체가 IOC 컨테이너의 구체적인 실현을 볼 필요가 생산하는 방법을 알고, 봄은 IOC 컨테이너의 숫자의 구현을 제공합니다. 예를 들어,은 XmlBeanFactory, ClasspathXmlApplicationContext과에 이렇게. IOC의 컨테이너의 실현을위한 필수적입니다은 XmlBeanFactory는 IOC 컨테이너는하는 BeanDefinition (빈에 대한 XML 설명 파일)을 정의하는 XML 파일을 읽을 수 있습니다. 의 ApplicationContext는 IOC 컨테이너를 제공하는 기본적인 기능 이외에, 수석 IOC 컨테이너 봄 이벤트이지만, 또한 다음과 같은 추가 서비스를 사용자에게 제공합니다 :

  • 지원 정보 소스, 가능한 국제화. (MessageSource를가 인터페이스를 구현할)
  • 자원에 액세스 할 수 있습니다. (ResourcePatternResolver가 인터페이스를 구현할)
  • 지원 응용 프로그램 이벤트입니다. (ApplicationEventPublisher 인터페이스 달성)

2.BeanDefinition

우리가 그들의 상호 관계의 콩 개체의 다양한 정의 SpringIOC 컨테이너 관리, 오브젝트는 봄 콩 달성된다
다음의 상속 시스템을 설명하기 위해하는 BeanDefinition에 :

콩 해결 과정이 매우 복잡하고 아주 좋은 기능이 나누어 져있다. 콩 해상도는 주로 봄 구성 파일을 해결합니다.
주로 전체 클래스의 해결 과정에 의해도 :

추천

출처www.cnblogs.com/yaofengdoit/p/12074634.html