Spring 조건 주해@Conditional 예시 상세 설명

머리말
@Conditional 은 Spring 4 가 새로 제공 한 주해 로 특정한 조건 에 따라 특정한 Bean 을 만 들 고 Condition 인 터 페 이 스 를 실현 하 며 matches 인 터 페 이 스 를 다시 써 서 판단 조건 을 구성 하 는 역할 을 합 니 다.전체적으로 말 하면 특정한 조건 에 따라 Bean 의 생 성 행 위 를 제어 하 는 것 입 니 다.그러면 우 리 는 이 특성 을 이용 하여 자동 으로 설정 할 수 있 습 니 다.
본 고 는 세 부분 으로 나 뉘 는데@conditional 소스 코드 의 소개,Condition 의 사용 예시 와@conditional 의 확장 주해 에 대한 소개 이다.
1.@Conditional 의 소스 코드

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Conditional {

  /**
   * All {@link Condition Conditions} that must {@linkplain Condition#matches match}
   * in order for the component to be registered.
   */
  Class<? extends Condition>[] value();

}
원본 코드 에서 볼 수 있 듯 이@Conditional 주 해 는 클래스 와 방법 에 사용 할 수 있 으 며 Condition 인터페이스 class 배열 을 실현 해 야 합 니 다.
코드 예시
다음은 서로 다른 운영 체 제 를 조건 으로 Condition 인 터 페 이 스 를 실현 하고 matches 방법 을 재 작성 하여 판단 조건 을 구성 할 것 이다.Windows 시스템 에서 프로그램 을 실행 하면 출력 목록 명령 은 dir 입 니 다.Linux 시스템 에서 프로그램 을 실행 하면 출력 목록 명령 은 ls 입 니 다.
1.판단 조건 류 의 정의
(1).윈도 의 조건 판단

package com.study.day01;

import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.type.AnnotatedTypeMetadata;

/**
 * @Auther: lifq
 * @Description:
 */
public class WindowsCondition implements Condition {
  public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
    return context.getEnvironment().getProperty("os.name").contains("Windows");
  }
}
(2).리 눅 스 의 조건 판단

package com.study.day01;

import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.type.AnnotatedTypeMetadata;

/**
 * @Auther: lifq
 * @Description:
 */
public class LinuxCondition implements Condition {
  public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
    return context.getEnvironment().getProperty("os.name").contains("Linux");
  }
}
2.서로 다른 시스템 의 Bean 클래스
(1).인터페이스 코드

package com.study.day01;

import org.springframework.stereotype.Service;

/**
 * @Auther: lifq
 * @Description:
 */
public interface ListService {

  public String showListCmd();

}
(2).Windows 구현 클래스 코드

package com.study.day01;

/**
 * @Auther: lifq
 * @Description:
 */
public class WindowsService implements ListService {
  public String showListCmd() {
    return "dir";
  }
}
(3).Linux 구현 클래스 코드

package com.study.day01;

/**
 * @Auther: lifq
 * @Description:
 */
public class LinuxService implements ListService {
  public String showListCmd() {
    return "ls";
  }
}
3.설정 클래스

package com.study.day01;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration;

/**
 * @Auther: lifq
 * @Description:
 */
@Configuration
public class Config {

  @Bean
  @Conditional(WindowsCondition.class)
  public ListService window() {
    return new WindowsService();
  }

  @Bean
  @Conditional(LinuxCondition.class)
  public ListService linux() {
    return new LinuxService();
  }
}
4.운행 클래스

package com.study.day01;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

/**
 * @Auther: lifq
 * @Description:
 */
public class Main01 {

  public static void main (String []args) {

    AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(Config.class);

    ListService listService = applicationContext.getBean(ListService.class);

    System.out.println(applicationContext.getEnvironment().getProperty("os.name") + "         :" + listService.showListCmd());
  }
}
저 는 윈도 운영 체제 입 니 다.출력 결 과 는 dir 입 니 다.캡 처 는 다음 과 같 습 니 다.
캡 처 실행

@Conditional 주해 예 시연 완료,문제 가 있 으 면 댓 글 소통 을 환영 합 니 다!
전체 원본 주소:https://github.com/suisui2019/springboot-study
3.@conditional 의 확장 설명
  • @ConditionalOnBean:현재 컨 텍스트 에 어떤 대상 이 존재 할 때 만 Bean 을 예화 할 수 있 습 니 다
  • @Conditional OnClass:어떤 class 가 클래스 경로 에 있어 야 Bean 을 실례 화 할 수 있 습 니 다
  • @ConditionalOnExpression:표현 식 이 true 일 때 빈 을 실례 화 합 니 다
  • @ConditionalOnMissingBean:현재 컨 텍스트 에 대상 이 존재 하지 않 을 때 만 Bean 을 예화 할 수 있 습 니 다
  • @ConditionalOnMissingClass:어떤 class 클래스 경로 가 존재 하지 않 을 때 만 Bean 을 실례 화 합 니 다
  • @ConditionalOnNotWebApplication:웹 응용 프로그램 이 아니 어야 빈 을 예화 할 수 있 습 니 다
  • @ConditionalOnBean:용기 에 지 정 된 Bean 이 있 는 조건 에서 실례 화 합 니 다
  • @ConditionalOnMissingBean:용기 에 Bean 이 지정 되 지 않 은 조건 에서 실례 화 합 니 다
  • @Conditional OnClass:classpath 류 경로 에서 지정 한 클래스 가 있 는 조건 에서 예화 합 니 다
  • @ConditionalOnMissingClass:클래스 경로 에서 지정 한 클래스 가 없 는 조건 에서 예화 합 니 다
  • @ConditionalOnWebApplication:프로젝트 가 웹 프로젝트 일 때 실례 화 합 니 다
  • @ConditionalOnNotWebApplication:프로젝트 가 웹 프로젝트 가 아 닐 때 실례 화 합 니 다
  • @ConditionalOnProperty:지정 한 속성 이 지정 한 값 이 있 을 때 실례 화 합 니 다
  • @ConditionalOnExpression:SpEL 표현 식 의 조건 에 따라 판단 합 니 다.
  • @ConditionalOnJava:JVM 버 전이 지정 한 버 전 범위 일 때 실례 화 를 촉발 합 니 다
  • @ConditionalOnResource:클래스 경로 에 지정 한 자원 이 있 을 때 실례 화 를 촉발 합 니 다
  • @ConditionalOnJndi:JNDI 가 존재 하 는 조건 에서 실례 화 를 촉발 합 니 다
  • @Conditional OnSingle Candidate:지정 한 Bean 이 용기 에 하나 밖 에 없 거나 여러 개 있 지만 선택 한 Bean 을 지정 할 때 실례 화 를 촉발 합 니 다
  • 총결산
    이상 은 이 글 의 모든 내용 입 니 다.본 고의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가 치 를 가지 기 를 바 랍 니 다.여러분 의 저희 에 대한 지지 에 감 사 드 립 니 다.

    좋은 웹페이지 즐겨찾기