spring 지식 정리 (3): spring ioc 등록 과정

이 어 위의 글 에서 우 리 는 bean 등록 과정 이 BeanDefinitionRegistryregisterBeanDefinition 방법 을 호출 할 것 이라는 것 을 알 수 있 고 DefaultListableBeanFactory 은 하나의 BeanDefinitionRegistry 이자 하나의 BeanFactory 등록 과정 에서 Bean 의 생 성과 밀접 한 관 계 를 가 진 다 는 것 을 알 수 있다.
예 를 고치다
하나 추가 BeanDefinition
package beldon.learn.ioc.sample;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionReaderUtils;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;

public class BeanRegistryApplication {
    public static void main(String[] args) throws Exception{
        BeanDefinition beanDefinition = BeanDefinitionReaderUtils.createBeanDefinition(null, SimpleBean.class.getName(), BeanRegistryApplication.class.getClassLoader());
        DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
        beanFactory.registerBeanDefinition("simpleBean", beanDefinition);
        System.out.println(beanFactory.containsBean("simpleBean"));
        SimpleBean bean = beanFactory.getBean(SimpleBean.class);
        System.out.println(bean);
    }
}


실행 결과:
true
beldon.learn.ioc.sample.SimpleBean@6ed3ef1

위의 코드 는 BeanRegistryApplication 의 로드 과정 을 제거 하고 하나의 BeanDefinition 를 직접 사용자 정의 하여 BeanDefinition 등록 시 켰 으 며 최종 용 기 는 정상적으로 작 동 할 수 있 습 니 다.
bean 의 등록 과정 을 알 고 싶다 면 BeanDefinitionRegistryDefaultListableBeanFactory 방법 집행 과정 을 알 아 봐 야 한다.
소스 코드 추적
public void registerBeanDefinition(String beanName, BeanDefinition beanDefinition)
            throws BeanDefinitionStoreException {

         // hide code
        if (hasBeanCreationStarted()) {
        //... hide code
        }
        else {
            // Still in startup registration phase
            this.beanDefinitionMap.put(beanName, beanDefinition);
            this.beanDefinitionNames.add(beanName);
            this.manualSingletonNames.remove(beanName);
        }
        this.frozenBeanDefinitionNames = null;
    }

}

따라 가기 registerBeanDefinition 가장 핵심 적 인 코드 는
 this.beanDefinitionMap.put(beanName, beanDefinition);
 this.beanDefinitionNames.add(beanName);

맞습니다. spring 은 registerBeanDefinition 을 map 에 캐 시 한 것 입 니 다. 그리고 이 map 는 BeanDefinition 입 니 다.
총결산
위의 코드 를 통 해 알 수 있 듯 이 ConcurrentHashMap 의 등록 과정 은 사실은 이 를 Map 에 캐 시 하 는 것 이다.이것 은 저장 BeanDefinition 에 불과 합 니 다. 대상 을 언제 초기 화 합 니까?
위 코드 에 BeanDefinition 방법 이 있다 는 것 을 잊 지 마 세 요.모든 일 은 동풍 만 있 고 자, 집행 하 는 방법 getBean 을 갖 추고 있다.

좋은 웹페이지 즐겨찾기