Spring Boot 의 27 개 주해 [핵심]

13217 단어 SpringBoot
안내 【 설정 보다 약속 이 많 음 】
Spring Boot 방식 의 프로젝트 개발 은 자바 응용 개발 분야 의 주류 구조 가 되 었 다. 이 는 생산 급 Spring 응용 프로그램 을 편리 하 게 만 들 수 있 을 뿐만 아니 라 현재 비교적 뜨 거 운 마이크로 서비스 프레임 워 크 인 SpringCloud 와 쉽게 통합 할 수 있다.
한편, Spring Boot 가 응용 프로그램의 구축 과 다른 프레임 워 크 와 신속하게 통합 되 는 것 을 쉽게 실현 할 수 있 는 이 유 는 가장 핵심 적 인 이 유 는 프로젝트 의 설정 을 크게 간소화 하고 '약속 이 설정 보다 크다' 는 원칙 을 최대 화 시 켰 기 때문이다.그러나 Spring Boot 를 바탕 으로 개발 에 큰 편 의 를 주 었 지만 사람들 로 하여 금 '구름 과 안개 속', 특히 각종 주 해 는 사람들 로 하여 금 '알 지만 그 이 유 를 모른다' 고 하 게 하기 쉽다.
따라서 Spring Boot 를 잘 사용 하려 면 그 가 제공 하 는 각종 기능 에 대한 주 해 를 전면적 이 고 명확 하 게 인식 하고 이해 해 야 한다.한편 으로 는 Spring Boot 기반 의 개발 효율 을 높 일 수 있 고, 다른 한편 으로 는 면접 에서 프레임 워 크 원 리 를 물 었 을 때 반드시 파악 해 야 할 지식 이기 도 하 다.다음 내용 에서 소 편 은 여러분 을 데 리 고 Spring Boot 의 상용 주 해 를 탐구 해 보 겠 습 니 다!
      1, Spring 관련 6 개 주해 
Spring Boot 의 일부 주해 도 Spring 의 주해 와 배합 하여 사용 해 야 한다. 여기 서 작은 편집 은 프로젝트 에서 Spring Boot 주해 와 가장 밀접 하 게 조 화 를 이 루 는 6 개의 Spring 기초 프레임 워 크 의 주 해 를 정리 했다.
    1.1、@Configuration 
Spring 3.0, @ Configuration 에서 설정 클래스 를 정의 하 는 데 사 용 됩 니 다. xml 설정 파일 을 교체 할 수 있 습 니 다. 주 해 된 클래스 내부 에는 하나 이상 의 @ Bean 주해 방법 이 포함 되 어 있 습 니 다. 이 방법 들 은 AnnotationConfigApplication Context 또는 AnnotationConfigWebApplication Context 류 에 의 해 스 캔 되 고 bean 정 의 를 구축 하여 Spring 용 기 를 초기 화 합 니 다.
 
@Configuration
public class TaskAutoConfiguration {

    @Bean
    @Profile("biz-electrfence-controller")
    public BizElectrfenceControllerJob bizElectrfenceControllerJob() {
        return new BizElectrfenceControllerJob();
    }

    @Bean
    @Profile("biz-consume-1-datasync")
    public BizBikeElectrFenceTradeSyncJob bizBikeElectrFenceTradeSyncJob() {
        return new BizBikeElectrFenceTradeSyncJob();
    }
}

1.2、@ComponentScan
웹 개발 을 한 학생 들 은 반드시 @ Controller, @ Service, @ Repository 주 해 를 사용 한 적 이 있 습 니 다. 소스 코드 를 보면 그들 중 에 공 통 된 주해 가 있 습 니 다. @ Component, 맞습니다. @ Component Scan 주 해 는 기본적으로 @ Controller, @ Service, @ Repository, @ Component 주해 의 종 류 를 spring 용기 에 설치 합 니 다.
@ComponentScan(value = "com.gqz.check.api")
public class CheckApiApplication {
    public static void main(String[] args) {
        SpringApplication.run(CheckApiApplication.class, args);
    }
}

@ SpringBootApplication 주해 에 도 @ Componentscan 주해 가 포함 되 어 있 기 때문에 사용 중 에 도 @ SpringBootApplication 주해 의 scanBasePackages 속성 을 통 해 설정 할 수 있 습 니 다.
@SpringBootApplication(scanBasePackages = {"com.gqz.check.api", "com.gqz.check.service"})
public class CheckApiApplication {
    public static void main(String[] args) {
        SpringApplication.run(CheckApiApplication.class, args);
    }
}

     1.3、@Conditional
        @Conditional 은 Spring 4 에서 새로 제공 한 주해 입 니 다. @ Conditional 주 해 를 통 해 코드 에 설 정 된 조건 에 따라 서로 다른 bean 을 불 러 올 수 있 습 니 다. 조건 주 해 를 설정 하기 전에 불 러 온 bean 류 를 Condition 인 터 페 이 스 를 실현 한 다음 에 인터페이스의 클래스 설정 을 불 러 올 지 여 부 를 설정 해 야 합 니 다.
        Spring Boot 주해 의 @ ConditionalOnProperty, @ ConditionalOnBean 등 @ Conditional * 로 시작 하 는 주 해 는 모두 @ Conditional 을 통합 하여 해당 기능 을 실현 합 니 다.
     1.4、@Import
        가 져 오 는 방식 으로 인 스 턴 스 를 springIOC 용기 에 넣 습 니 다.필요 할 때 Spring 용기 에 관리 되 지 않 은 클래스 를 Spring 용기 에 가 져 올 수 있 습 니 다.
//   
public class Square { }

public class Circular  {}

//  
@Import({Square.class,Circular.class})
@Configuration
public class MainConfig{  }

 
     1.5、@ImportResource
         @ Import 와 유사 합 니 다. 차이 점 은 @ ImportResource 가 가 져 온 것 은 설정 파일 입 니 다.
//  xml  
@ImportResource("classpath:spring-redis.xml")      

public class CheckApiApplication {
    public static void main(String[] args) {
        SpringApplication.run(CheckApiApplication.class, args);
    }
}

         1.6、@Component 
        @Component 는 원 주해 로 다른 종류의 주 해 를 주석 할 수 있다 는 뜻 이다.
        예 를 들 어 @ Controller @ Service @ Repository.이 주 해 를 가 진 클래스 는 구성 요소 로 간주 되 며, 주 해 를 기반 으로 한 설정 과 클래스 경 로 를 스 캔 할 때 이 클래스 는 실례 화 됩 니 다.다른 클래스 의 주 해 는 @ Controller 와 같은 특수 한 유형의 구성 요소 로 인 정 될 수 있 습 니 다. 컨트롤 러 (주입 서비스), @ Service 서비스 (주입 dao), @ Repository dao (dao 접근 실현). @Component 는 구성 요 소 를 말 합 니 다. 구성 요소 가 분류 하기 어 려 울 때 이 주 해 를 사용 하여 표시 할 수 있 습 니 다. 역할 은 XML 설정 에 해당 합 니 다. 
    2. Spring Boot 의 가장 핵심 적 인 21 개의 주석
       Spring Boot 와 밀접 한 관 계 를 가 진 Spring 기초 주 해 를 마치 고 Spring Boot 가 제공 하 는 핵심 주해 의 내용 을 살 펴 보 겠 습 니 다!
    2.1、@SpringBootApplication
       이 주 해 는 Spring Boot 의 가장 핵심 적 인 주해 로 Spring Boot 의 주요 유형 에 사용 되 며, 표 지 는 Spring Boot 응용 으로 Spring Boot 를 여 는 각종 능력 입 니 다.실제로 이 주 해 는 @ Configuration, @ EnableAutoConfiguration, @ Componentscan 세 개의 주 해 를 조합 한 것 입 니 다.이러한 주 해 는 일반적으로 함께 사용 되 기 때문에 Spring Boot 는 통 일 된 주 해 를 제공 합 니 다 @ SpringBootApplication.
@SpringBootApplication(exclude = {
        MongoAutoConfiguration.class,
        MongoDataAutoConfiguration.class,
        DataSourceAutoConfiguration.class,
        ValidationAutoConfiguration.class,
        MybatisAutoConfiguration.class,
        MailSenderAutoConfiguration.class,
})
public class API {
    public static void main(String[] args) {
        SpringApplication.run(API.class, args);
    }
}

     2.2、@EnableAutoConfiguration
       Spring Boot 에서 자동 으로 주 해 를 설정 할 수 있 도록 합 니 다. 이 주 해 를 열 면 Spring Boot 는 현재 클래스 경로 의 가방 이나 클래스 에 따라 Spring Bean 을 설정 할 수 있 습 니 다.
        예 를 들 어 현재 클래스 경로 에 Mybatis 라 는 JAR 패키지 가 있 습 니 다. Mybatis AutoConfiguration 주 해 는 관련 매개 변수 에 따라 Mybatis 의 각 Spring Bean 을 설정 할 수 있 습 니 다.
        @EnableAutoConfiguration 실현 의 관건 은 AutoConfiguration ImportSelector 를 도입 하 는 것 입 니 다. 그 핵심 논 리 는 selectImports 방법 입 니 다. 논 리 는 대체적으로 다음 과 같 습 니 다.
          -설정 파일 META - INF / spring. factories 에서 사용 할 수 있 는 모든 자동 설정 클래스 를 불 러 옵 니 다.
          -무 거 운 것 을 제거 하고 exclude 와 excludeName 속성 이 지 니 고 있 는 클래스 를 제거 합 니 다.
          -필터, 조건 (@ conditional) 을 만족 시 키 는 자동 설정 클래스 를 되 돌려 줍 니 다.
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage

//  AutoConfigurationImportSelector   
@Import({EnableAutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration {
    String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";

    Class>[] exclude() default {};

    String[] excludeName() default {};
}

 
     2.3、@SpringBootConfiguration
        이 주 해 는 @ Configuration 주해 의 변형 입 니 다. Spring Boot 설정 을 수식 하거나 Spring Boot 의 후속 확장 에 유리 합 니 다.
     2.4、@ConditionalOnBean
       @Condition alOnBean (A. class) 은 현재 컨 텍스트 에 A 대상 이 존재 할 때 만 하나의 Bean 을 예화 합 니 다. 즉, A. class 가 spring 의 applicationContext 에 존재 할 때 만 현재 bean 을 만 들 수 있 습 니 다.
@Bean
//         DefaultMQProducer   ,    RocketMQProducerLifecycle  Bean
@ConditionalOnBean(DefaultMQProducer.class)
public RocketMQProducerLifecycle rocketMQLifecycle() {
     return new RocketMQProducerLifecycle();
}  

     2.5、@ConditionalOnMissingBean
        @ conditional 주 해 를 조합 합 니 다. @ conditional OnBean 주해 와 달리 현재 컨 텍스트 에 A 대상 이 존재 하지 않 을 때 만 Bean 을 예화 합 니 다.
 @Bean
  //           RocketMQProducer   ,     RocketMQProducer Bean  
  @ConditionalOnMissingBean(RocketMQProducer.class)
  public RocketMQProducer mqProducer() {
      return new RocketMQProducer();
  }

     2.6、@ConditionalOnClass
       그룹 @ Conditional 주 해 는 클래스 path 에 존재 할 때 만 빈 을 만 들 수 있 습 니 다.
  @Bean
  // classpath    HealthIndicator ,   HealthIndicator Bean  
  @ConditionalOnClass(HealthIndicator.class)
  public HealthIndicator rocketMQProducerHealthIndicator(Map producers) {
      if (producers.size() == 1) {
          return new RocketMQProducerHealthIndicator(producers.values().iterator().next());
      }
  }

 
     2.7、@ConditionalOnMissingClass
        @ conditional 주 해 를 조합 합 니 다. @ conditional OnMissingClass 주해 와 달리 classpath 에 지정 한 Class 가 없어 야 설정 을 시작 합 니 다.
     2.8、@ConditionalOnWebApplication
       @ Conditional 주 해 를 조합 하면 현재 항목 유형 은 WEB 항목 이 어야 설정 을 시작 합 니 다.현재 항목 은 다음 과 같은 세 가지 유형 이 있 습 니 다. ANY (모든 웹 항목 이 일치 합 니 다), SERVLET (기본 적 인 Servelet 항목 만 일치 합 니 다), REACTIVE (응답 기반 웹 프로그램 만 일치 합 니 다).
     2.9、@ConditionalOnNotWebApplication
       @ conditional 주 해 를 조합 합 니 다. @ conditional OnWebApplication 주해 와 달리 현재 프로젝트 유형 은 WEB 프로젝트 가 아니 어서 설정 을 시작 합 니 다.
     2.10、@ConditionalOnProperty 
       @ Conditional 주 해 를 조합 하여 지정 한 속성 이 지정 한 값 이 있 을 때 만 설정 을 시작 합 니 다.구체 적 인 작업 은 두 개의 속성 name 과 havingValue 를 통 해 이 루어 집 니 다. 그 중에서 name 은 application. properties 에서 특정한 속성 값 을 읽 고 이 값 이 비어 있 으 면 false 로 돌아 갑 니 다.값 이 비어 있 지 않 으 면 이 값 을 havingValue 가 지정 한 값 과 비교 하고 같 으 면 true 로 되 돌려 줍 니 다.그렇지 않 으 면 false 로 돌아 갑 니 다.반환 값 이 false 이면 이 configuration 은 유효 하지 않 습 니 다.true 이면 유효 합 니 다. 
 @Bean
 //    rocketmq.producer.enabled    true
 @ConditionalOnProperty(value = "rocketmq.producer.enabled", havingValue = "true", matchIfMissing = true)
 public RocketMQProducer mqProducer() {
     return new RocketMQProducer();
 }

      2.11、@ConditionalOnExpression
         @ conditional 주 해 를 조합 하여 SpEL 표현 식 이 true 일 때 만 설정 을 시작 합 니 다.
@Configuration
@ConditionalOnExpression("${enabled:false}")
public class BigpipeConfiguration {
    @Bean
    public OrderMessageMonitor orderMessageMonitor(ConfigContext configContext) {
        return new OrderMessageMonitor(configContext);
    }
}

 
     2.12、@ConditionalOnJava
        @ Conditional 주 해 를 조합 하여 실행 중인 자바 JVM 이 지정 한 버 전 범위 에 있 을 때 만 설정 을 시작 합 니 다.
     2.13、@ConditionalOnResource
        @ Conditional 주 해 를 조합 하면 클래스 경로 에 지정 한 자원 이 있어 야 설정 을 시작 합 니 다.
@Bean
@ConditionalOnResource(resources="classpath:shiro.ini")
protected Realm iniClasspathRealm(){
  return new Realm();
}

 
     2.14、@ConditionalOnJndi
       @ Conditional 주 해 를 조합 하여 지정 한 JNDI 가 존재 할 때 만 설정 을 엽 니 다.
     2.15、@ConditionalOnCloudPlatform
       @ Conditional 주 해 를 조합 하여 지정 한 클 라 우 드 플랫폼 이 활성화 되 었 을 때 설정 을 시작 합 니 다.
     2.16、@ConditionalOnSingleCandidate
       @ conditional 주 해 를 조합 합 니 다. 지정 한 class 가 용기 에 빈 이 하나 있 거나 여러 개 있 지만 첫 번 째 로 선택 할 때 만 설정 을 엽 니 다.
     2.17、@ConfigurationProperties
        Spring Boot 는 주석 을 사용 하여 사용자 정의 properties 파일 을 실체 bean 에 표시 할 수 있 습 니 다. 예 를 들 어 config. properties 파일 입 니 다.
@Data
@ConfigurationProperties("rocketmq.consumer")
public class RocketMQConsumerProperties extends RocketMQProperties {
    private boolean enabled = true;
    private String consumerGroup;
    private MessageModel messageModel = MessageModel.CLUSTERING;
    private ConsumeFromWhere consumeFromWhere = onsumeFromWhere.CONSUME_FROM_LAST_OFFSET;
    private int consumeThreadMin = 20;
    private int consumeThreadMax = 64;
    private int consumeConcurrentlyMaxSpan = 2000;
    private int pullThresholdForQueue = 1000;
    private int pullInterval = 0;
    private int consumeMessageBatchMaxSize = 1;
    private int pullBatchSize = 32;
}

 
     2.18、@EnableConfigurationProperties
        @ EnableConfigurationProperties 주해 가 @ Configuration 에 적 용 될 때 @ ConfigurationProperties 에 주 해 된 beans 는 자동 으로 Environment 속성 으로 설 정 됩 니 다.이런 스타일 의 설정 은 SpringApplication 의 외부 YAML 설정 과 함께 사용 하기에 특히 적합 하 다.
@Configuration
@EnableConfigurationProperties({
    RocketMQProducerProperties.class,
    RocketMQConsumerProperties.class,
})
@AutoConfigureOrder
public class RocketMQAutoConfiguration {
    @Value("${spring.application.name}")
    private String applicationName;
}

 
     2.19、@AutoConfigureAfter
       자동 설정 클래스 에 사용 하면 이 자동 설정 클래스 는 다른 자동 설정 클래스 가 설 정 된 후에 사용 해 야 한 다 는 것 을 표시 합 니 다.
       Mybatis 의 자동 설정 클래스 와 같이 데이터 원본 자동 설정 클래스 뒤에 있어 야 합 니 다.
@AutoConfigureAfter(DataSourceAutoConfiguration.class)
public class MybatisAutoConfiguration {

}

 
    2.20、@AutoConfigureBefore
       이것 은 @ AutoConfigure After 주석 과 반대로 이 자동 설정 클래스 는 다른 자동 설정 클래스 설정 전에 필요 합 니 다.
    2.21、@AutoConfigureOrder
      Spring Boot 1.3.0 에 새 주석 @ AutoConfigureOrder 가 있 습 니 다. 불 러 오 는 우선 순 위 를 설정 하 는 데 사 용 됩 니 다.
  @AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE) //             
  @Configuration
  @ConditionalOnWebApplication //    web  
  @Import(BeanPostProcessorsRegistrar.class) //          
  public class EmbeddedServletContainerAutoConfiguration {
      @Configuration
      @ConditionalOnClass({ Servlet.class, Tomcat.class })
      @ConditionalOnMissingBean(value = EmbeddedServletContainerFactory.class, search = SearchStrategy.CURRENT)
      public static class EmbeddedTomcat {
         // ...
      }

      @Configuration
      @ConditionalOnClass({ Servlet.class, Server.class, Loader.class, WebAppContext.class })
      @ConditionalOnMissingBean(value = EmbeddedServletContainerFactory.class, search = SearchStrategy.CURRENT)
      public static class EmbeddedJetty {
         // ...
      }
}

좋은 웹페이지 즐겨찾기