Spring 和 SpringMVC , SpringBoot 基础知识的认识

SpringBoot的主要的注解:

  @SpringBootApplication 

   是SpringBoot启动类上的注解。 也是springboot 最核心的注解,它是由三个注解组成的 @Configuration , @EnableAutoConfiguration , @ComponentScan 三个注解组成。 所以SpringBoot 的统一注解就是SpringBootApplication

  @EnableAutoConfiguration 

   允许SpringBoot 自动配置注解,开启这个注解后,Springboot就根据当前类路径下的包或者类来配置Springbean。

  如:当前类路径下有mybatis的jar包。 MybatisAutoConfiguration 注解就能根据相关的参数来配置mybatis 的各个Springbean。

  @EnableAutoConfiguration 实现的关键在于引入了 AutoConfigurationImportSelector,  其核心的逻辑为selectImports 的方法。

  @SpringBootConfiguration

  这个注解就是@Configuration注解的变体, 只是用来修饰Spring boot的配置,或者可利于Springboot后续的扩展。

  @ConditionalOnBean

  @conditionalOnBean(A.class)  仅仅在当前上下文中存在A对象时,才会实例化一个Bean,也就是说只有当A.class 在Spring的ApplicationContext中存在时,这个当前的bean才能创建。

  @ConditionalOnMissingBean

  这个注解的意思是组合@Conditional 注解 和 @ConditiionalOnbean 注解相反, 仅仅在当前上下文不存在A对象,才会实例化一个bean。

  @ConditionalOnClass

  组合@conditional注解,可以仅当某些类存在于classpath上时候才创建某个bean。

  

  @Bean
  //当classpath中存在类HealthIndicator时,才创建HealthIndicator Bean对象
  @ConditionalOnClass(HealthIndicator.class)
  public HealthIndicator rocketMQProducerHealthIndicator(Map<String, DefaultMQProducer> producers) {
      if (producers.size() == 1) {
          return new RocketMQProducerHealthIndicator(producers.values().iterator().next());
      }
  

  @ConditionalOnMissingClass

  组合@Conditional注解,和 @ConditionalOnClass 注解相反,当classspath中没有指定的class才开启配置。

  @ConditionalOnWenApplication

  组合@Conditional注解,当前项目类型是web项目才会开启配置, 当项目由以下3中类型: ANY(任何web项目都匹配) , servlet (仅但基础的servlet项目才会匹配) REACTIVE(只有基于响应的web应用程序才匹配)。

  @ConditionalOnNotWebApplication

  组合@Conditional 注解 和 @ConditionalOnWebApplication 注解相反 当前项目类型不是web 项目才开启配置。

  @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();
 }

  @ConditionalOnExpression

  组合@Conditional 注解, 当spEl 表达式为true是才开启配置。

@Configuration
@ConditionalOnExpression("${enabled:false}")
public class BigpipeConfiguration {
    @Bean
    public OrderMessageMonitor orderMessageMonitor(ConfigContext configContext) {
        return new OrderMessageMonitor(configContext);
    }
}

  @ConditionalOnJava

  组合@Conditional注解, 在运行Java jvm在指定的版本范围内开启配置。

   @ConditionalOnResource

  组合@Conditional注解 , 当类路径下由指定的资源才会开启配置。

@Bean
@ConditionalOnResource(resources="classpath:shiro.ini")
protected Realm iniClasspathRealm(){
  return new Realm();
}

  @ConditionalOnJndi

  组合Conditional注解, 当指定的 JNDI存在时才开启配置。

  @ConditionalOnCloudPlatform

  组合Conditional注解, 当指定的云平台激活时才开启配置。

  @ConditionalOnSingleCandidate

  组合Conditional注解 , 当指定的class在容器中只有一个bean, 或者同时由多个但为首选时才会开启配置。

  @ConditionalOnProperties

  spring boot 可以使用注解的方式将自定义的properties文件映射到实体bean中,

@Data
@ConfigurationProperties("rocketmq.consumer")
public class RocketMQConsumerProperties extends RocketMQProperties {
    private boolean enabled = true;

    private String consumerGroup;

    private MessageModel messageModel = MessageModel.CLUSTERING;

    private ConsumeFromWhere consumeFromWhere = ConsumeFromWhere.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;
}

  @EnableConfigurationProperties

  当@EnableConfigurationProperties 注解一个用用到你的@Configuration时,任何被@ConfigurationProperties 注解beans 将自动被Environment 属性配置,这种风格的配置特别适合于SpringApplicationde 外部YAML配置经i选哪个配合使用。

@Configuration
@EnableConfigurationProperties({
    RocketMQProducerProperties.class,
    RocketMQConsumerProperties.class,
})
@AutoConfigureOrder
public class RocketMQAutoConfiguration {
    @Value("${spring.application.name}")
    private String applicationName;
}

  @AutoConfigureAfter

  用在自动配置类上面,表示该自动类需要在另外指定自动配置类配置完之后,

如 Mybatis 的自动配置类,需要在数据源自动配置类之后。

@AutoConfigureAfter(DataSourceAutoConfiguration.class)
public class MybatisAutoConfiguration {
}

  @AutoConfigureBefore

  这个和@AutoConfigureAfter注解使用相反, 表示该自动类配置类需要在另外指定的自动配置类之前。

  @AutoConfigureOrder

   Spring boot 中由一个新的 注解 @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 {
         // ...
      }
}

猜你喜欢

转载自www.cnblogs.com/yishuo/p/12631214.html