조건부 봄 부팅 확장

I. 서론

그것을 달성 할 수 자동 구성을위한 훌륭한 도구이기 때문에 더 나은, 자동 구성 봄 부팅 학습을 위해이 문서 Laijiangjiang 조건부 중요한 역할과 원칙의 구현, 조건부 시리즈의 철저한 이해! 다음과 같은 측면 조건에 초점

  • 조건부이고 어떤 역할
  • 조건부 원칙
  • 조건부 시리즈
  • 봄 부팅 조건부 시리즈의 응용 프로그램


역할과 두 .Conditional 무엇입니까

조건부 주석 스프링 프레임 워크 스프링 컨텍스트 모듈은 조건이 충족되는 경우, 빈은 생성하거나 생성되지 않습니다, 스프링 컨테이너 콩을위한 조건을 만드는 것입니다 제공합니다.

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD})
public @interface Conditional {
    Class<? extends Condition>[] value();
}

모든 경기의 값 조건 조건 주석, 콩을 만들 때, 또는 생성되지 않습니다.

public interface Condition {
    boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata);
}

조건 특정 조건, 조건부 상태의 사용이다, 반대로, 조건부의 동작 상태의 모드입니다.

경기 경우, true를 돌려줍니다 일치합니다. ConditionContext 컨텍스트 매개 변수는이 컨테이너, 등록 기관, 환경에 액세스하는 데 사용할 수있는 조건부 일치하는 논리이다. AnnotatedTypeMetadata 조건부 메타 데이터의 종류의 역할을 지적한다. 모두를 사용하여, 당신은 자신의 조건에 맞게 사용자 정의 할 수 있습니다.

인스턴스는 같은 ProfileCondition로 볼 수있다

class ProfileCondition implements Condition {

    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        if (context.getEnvironment() != null) {
            MultiValueMap<String, Object> attrs = metadata.getAllAnnotationAttributes(Profile.class.getName());
            if (attrs != null) {
                for (Object value : attrs.get("value")) {
                    if (context.getEnvironment().acceptsProfiles(((String[]) value))) {
                        return true;
                    }
                }
                return false;
            }
        }
        return true;
    }
}

콩 서로 다른 환경에 따라, 그래서 진정한 반환 프로필 및 지정된 환경과 일치하는 주석의 프로파일을 구성 할 수있는 경우, 또는 지정된 콩는 특정 환경에서 적용됩니다.


세 가지 원칙 .Conditional

조건부 주석 프로세서는 방법과 일치, 내부 조건부 주석을 해결 구성에있는 모든 노트를 조건 값을 얻을 실행합니다 조건 ConditionEvaluator입니다 :

public boolean shouldSkip(AnnotatedTypeMetadata metadata, ConfigurationPhase phase) {
    // 如果未被Conditional注释,则返回
    if (metadata == null || !metadata.isAnnotated(Conditional.class.getName())) {
        return false;
    }
    if (phase == null) {
        // 如果是注解metadata,且是配置类,则执行配置阶段的Condition
        if (metadata instanceof AnnotationMetadata &&
                ConfigurationClassUtils.isConfigurationCandidate((AnnotationMetadata) metadata)) {
            return shouldSkip(metadata, ConfigurationPhase.PARSE_CONFIGURATION);
        }
        // 否则解析注册Bean阶段的Condition
        return shouldSkip(metadata, ConfigurationPhase.REGISTER_BEAN);
    }
    // 获取Conditional注解的value,所有的Condition
    List<Condition> conditions = new ArrayList<Condition>();
    for (String[] conditionClasses : getConditionClasses(metadata)) {
        for (String conditionClass : conditionClasses) {
            Condition condition = getCondition(conditionClass, this.context.getClassLoader());
            conditions.add(condition);
        }
    }
    // 执行所有的Condition,只要其中一个不满足,则返回true,表示应该跳过
    AnnotationAwareOrderComparator.sort(conditions);
    for (Condition condition : conditions) {
        ConfigurationPhase requiredPhase = null;
        if (condition instanceof ConfigurationCondition) {
            requiredPhase = ((ConfigurationCondition) condition).getConfigurationPhase();
        }
        if (requiredPhase == null || requiredPhase == phase) {
            if (!condition.matches(this.context, metadata)) {
                return true;
            }
        }
    }
    return false;
}

조건부 노트에 대한 책임 ConditionEvaluator 그러나 ConditionEvaluator 호출은 주요 BeanDefinitionReader 또는 구성 클래스 파서에 있습니다 :

  • 구성 클래스 정의를 구문 분석의 시작 부분에 주석하는 구문 분석에 대한 책임 ConfigurationClassParser는 ConditionEvaluator, 실행 조건의 일치를 호출합니다. 일치하지 않으면 구성이 생략 된 클래스가 될 것입니다, 처리되지 않습니다
  • 일치하지 않을 경우 수입 ConditionEvaluator는, 메소드가 리턴 콩이 수행하거나하지 않을 때 호출되는 콩의 판독 방법 및 치료 (예 : 수입, 콩 방법으로) ConfigurationClassParser 전체 구성 클래스 이후에 생성 구문 분석, 처리에 대한 책임이 ConfigurationClassBeanDefinitionReader, 처리 가져 오기
  • , 주석 조건부 콩이 변경되는 경우에, 처리의 처음에 주석 (예를 들면 구조 / 성분으로서) 빈 정의 처리 AnnotatedBeanDefinitionReader가 일치하지 않을 경우 ConditionEvaluator 처리를 호출하는 것, 이것은 주석 빈의 정의 아니다 처리

조건부 주석 과정은 포괄적 ConditionEvaluator와하는 BeanDefinition Reader 및 파서 이상이며, 구문 분석의 구성에 조건의 이행에 중요한 역할을한다.


네. 조건부 양식

전술 조건부 주석 스프링 컨텍스트는 모듈에 정의되어 있지만 해당 응용 프로그램 개발자가 해당 조건을 작성해야하므로, 다양한 시나리오에 적용하는 조건부 조건과 필요의 사용, 박스, 최대 비교 밖으로 수행 할 수 없습니다 문제.

따라서, 조건부의 봄 부팅 다양한 애플리케이션 시나리오를 수용 할 수 있도록 확장의 많은 일을. 이것은 단지 몇 가지 일반적인 여기에 나열된 조건부 시리즈를 생성

  • 때 BeanFactory를 ConditionalOnBean 만 특정 빈을 일치합니다. 일반적으로 의존 등록과 관련된 콩 사이에 사용
  • ConditionalOnClass은, 콩은 특정 클래스 경로를 일치합니다. 참조하는 특정 블록에 사용될 때, 콩은 스프링 부트 자동으로 등록
  • ConditionalOnMissingBean뿐만 아니라 때 특정 콩 BeanFactory에 일치. 일반적으로 중복 등록을 방지하기 위해 사용
  • ConditionalOnMissingClass는 콩뿐만 아니라 특정 도로 카테고리에 일치합니다. 일반적으로 자동 구성에 사용되는 콩은 다른 콩을 등록하기 전에 존재하지 않는
  • ConditionalOnWebApplication는 경우에만 웹의 ApplicationContext와 일치합니다. 그것은 일반적으로 웹 환경에서 사용하는 경우, 일부 콩 등록 및 웹 환경 관련
  • ConditionalOnResource은 특정 자원의 존재에 일치
  • ConditionalOnProperty 만 특정 속성이 환경의 필요성이 존재하고 기본이 참으로 일치합니다. 스위치에 사용하는 것은 특정 콩, 또는 정책 모드를 등록
  • 때 ConditionalOnNotWebApplication 만 일치하지 않는 웹의 ApplicationContext


봄 부팅에 다섯 .Conditional 시리즈

의 DispatcherServlet에서 1.spring 부팅하는 웹 컨테이너에 등록




상기 도면에서, 경우의 DispatcherServlet이 컨텍스트 등록 ServletRegistrationBean. DispatcherServlet에 대한 빈은 웹 컨테이너에 등록. ConditionalOnBean는 콩 사이에 등록 의존하고하는 데 사용됩니다.

자동 구성 2.spring 부트 데이터 소스




데이터 소스 및 클래스 패스에 EmbeddedDatabaseType 동시에 자동으로 데이터 소스를 구성 할 때. 그래서에만 스프링 부팅 스타터 JDBC를 도입 할 필요가 구성 자동으로 데이터 소스를 완료 할 수 있습니다. 데이터 소스는 클래스 패스에 결합 JDK 클래스이기 때문입니다. 스프링 부팅 스타터 JDBC하여 EmbeddedDatabaseType 클래스 경로를 도입, 스프링 JDBC 의존 모듈 전달은 데이터 소스의 자동 구성을 완료합니다.


VI. 요약

콩 선택은 콩을 등록할지 여부를 결정하는 조건부 봄은 등록을 조건으로한다. 자동 구성은 정말 응용 프로그램의 많은 수의 여전히 봄 부팅의 경우에 빛을. 조건부 자동, 다중 환경 구성 동적 무기를 구성됩니다.

추천

출처www.cnblogs.com/lxyit/p/12511735.html