스프링 소스 코드 분석 노트 (B)

하는 BeanDefinition이, 구글은 거의 의미 콩의 번역의 정의 될 수있다, 그는 콩, 콩 시리즈, 콩 스코프 등, 콩 등 주요 여부로, 만약 지연로드, 클래스에 해당에 대한 정보를 저장를 설명하는 데 사용 대기

private static BeanDefinitionHolder registerPostProcessor(
			BeanDefinitionRegistry registry, RootBeanDefinition definition, String beanName) {

		definition.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
		registry.registerBeanDefinition(beanName, definition);
		return new BeanDefinitionHolder(definition, beanName);
	}

이 방법을하는 BeanDefinition이이 포트에 스프링 내부가 아닌 사용자 정의하고 호출 registerBeanDefinition 방법 다음 지점입니다, 그는 세 가지 구현 클래스했다 ROLE_INFRASTRUCTURE 대표 역할을 설정
그림 삽입 설명 여기
의 DefaultListableBeanFactory 우리가 컨테이너를 호출하고 내부 무엇인가 beanDefinitionMap, beanDefinitionNames을 서서 beanDefinitionMap는 해시 맵이며, beanName에이 값으로 키,하는 BeanDefinition로, beanDefinitionNames는 beanName에 내부에 저장된 모음입니다.
ConfigurationClassPostProcessor이 인터페이스를 BeanDefinitionRegistryPostProcessor 인터페이스를 달성하고 BeanDefinitionRegistryPostProcessor BeanFactoryPostProcessor를 인터페이스를 확장, BeanFactoryPostProcessor를 봄의 확장 점 중 하나입니다 ConfigurationClassPostProcessor 봄은 단단히 마음에 위에서 언급 한 클래스와 상속을 부담해야한다 매우 중요한 클래스입니다.

그림 삽입 설명 여기
두번째 줄 이어

	public void register(Class<?>... annotatedClasses) {
		for (Class<?> annotatedClass : annotatedClasses) {
			registerBean(annotatedClass);
		}
	}

다수의 클릭 그것이 루프에 의해 등록 된 발견

<T> void doRegisterBean(Class<T> annotatedClass, @Nullable Supplier<T> instanceSupplier, @Nullable String name,
            @Nullable Class<? extends Annotation>[] qualifiers, BeanDefinitionCustomizer... definitionCustomizers) {
        //AnnotatedGenericBeanDefinition可以理解为一种数据结构,是用来描述Bean的,这里的作用就是把传入的标记了注解的类
        //转为AnnotatedGenericBeanDefinition数据结构,里面有一个getMetadata方法,可以拿到类上的注解
        AnnotatedGenericBeanDefinition abd = new AnnotatedGenericBeanDefinition(annotatedClass);

        //判断是否需要跳过注解,spring中有一个@Condition注解,当不满足条件,这个bean就不会被解析
        if (this.conditionEvaluator.shouldSkip(abd.getMetadata())) {
            return;
        }

        abd.setInstanceSupplier(instanceSupplier);

        //解析bean的作用域,如果没有设置的话,默认为单例
        ScopeMetadata scopeMetadata = this.scopeMetadataResolver.resolveScopeMetadata(abd);
        abd.setScope(scopeMetadata.getScopeName());

        //获得beanName
        String beanName = (name != null ? name : this.beanNameGenerator.generateBeanName(abd, this.registry));

        //解析通用注解,填充到AnnotatedGenericBeanDefinition,解析的注解为Lazy,Primary,DependsOn,Role,Description
        AnnotationConfigUtils.processCommonDefinitionAnnotations(abd);

        //限定符处理,不是特指@Qualifier注解,也有可能是Primary,或者是Lazy,或者是其他(理论上是任何注解,这里没有判断注解的有效性),如果我们在外面,以类似这种
        //AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(Appconfig.class);常规方式去初始化spring,
        //qualifiers永远都是空的,包括上面的name和instanceSupplier都是同样的道理
        //但是spring提供了其他方式去注册bean,就可能会传入了
        if (qualifiers != null) {
            //可以传入qualifier数组,所以需要循环处理
            for (Class<? extends Annotation> qualifier : qualifiers) {
                //Primary注解优先
                if (Primary.class == qualifier) {
                    abd.setPrimary(true);
                }
                //Lazy注解
                else if (Lazy.class == qualifier) {
                    abd.setLazyInit(true);
                }
                //其他,AnnotatedGenericBeanDefinition有个Map<String,AutowireCandidateQualifier>属性,直接push进去
                else {
                    abd.addQualifier(new AutowireCandidateQualifier(qualifier));
                }
            }
        }

        for (BeanDefinitionCustomizer customizer : definitionCustomizers) {
            customizer.customize(abd);
        }

        //这个方法用处不大,就是把AnnotatedGenericBeanDefinition数据结构和beanName封装到一个对象中
        BeanDefinitionHolder definitionHolder = new BeanDefinitionHolder(abd, beanName);

        definitionHolder = AnnotationConfigUtils.applyScopedProxyMode(scopeMetadata, definitionHolder, this.registry);

        //注册,最终会调用DefaultListableBeanFactory中的registerBeanDefinition方法去注册,
        //DefaultListableBeanFactory维护着一系列信息,比如beanDefinitionNames,beanDefinitionMap
        //beanDefinitionNames是一个List<String>,用来保存beanName
        //beanDefinitionMap是一个Map,用来保存beanName和beanDefinition
        BeanDefinitionReaderUtils.registerBeanDefinition(definitionHolder, this.registry);
    }

등록이 상기 제 1 파라미터는 다른 파라미터는 디폴트 값이라는 것을 제외하고는, 클래스에 종래 방식으로 배열.
방법 AnnotatedGenericBeanDefinition가하는 BeanDefinition 구성 클래스를 얻을 구성하여, 유사한 등록 ConfigurationClassPostProcessor 클래스 있을지도 모른다 아니라, 또한 생성자하는 BeanDefinition를 얻기 위해,는 RootBeanDefinition을 통해 얻을 단지했다, 지금은 AnnotatedGenericBeanDefinition을 통해 얻을 수 있습니다 .
그림 삽입 설명 여기
분석 또는 등록을 건너 뛸 필요, 봄은 조건이 충족되지 않은 경우, 등록 된 클래스는 건너 뜁니다하는 @Condition 주석이 있습니다.

이어서 범위 파싱 설정되어 있지 않은 경우, 디폴트의 단일 실시 예이다.

beanName에를 가져옵니다.

일반 분석 노트 가득 AnnotatedGenericBeanDefinition, 게으른, 차,의 DependsOn, 역할, 설명 분석 노트.

예선 과정이 아니라, 특히 @Qualifier 노트, 초등, 또는 게으른 또는 기타있을 수 있습니다 (이론적으로 어떤 노트, 어떤 판사 주석의 효과가 없다).

오브젝트에 캡슐화 된 데이터 구조 및 AnnotatedGenericBeanDefinition beanName에 (이 매우 중요하지 않은, 단순히 전달을 용이하게하기위한 기준으로서 이해 될 수있다).

등록은 결국 등록의 DefaultListableBeanFactory의 registerBeanDefinition 메소드를 호출합니다 :

	public static void registerBeanDefinition(
			BeanDefinitionHolder definitionHolder, BeanDefinitionRegistry registry)
			throws BeanDefinitionStoreException {
		//获取beanname
		// Register bean definition under primary name.
		String beanName = definitionHolder.getBeanName();
		//注册bean
		registry.registerBeanDefinition(beanName, definitionHolder.getBeanDefinition());
		//别名注册
		// Register aliases for bean name, if any.
		String[] aliases = definitionHolder.getAliases();
		if (aliases != null) {
			for (String alias : aliases) {
				registry.registerAlias(beanName, alias);
			}
		}
	}
게시 25 개 원래 기사 · 원의 찬양 (22) · 전망 3632

추천

출처blog.csdn.net/weixin_42443419/article/details/104324387