吃透SpringBoot中27个核心注解,轻松拿下SpringBoot!「建议收藏」

吃透SpringBoot中27个核心注解,轻松拿下SpringBoot!「建议收藏」Spring Boot 是由 Pivotal 团队提供的全新框架,其设计目的是用来简化新 Spring 全家桶的初始搭建以及开发过程。

欢迎大家来到IT世界,在知识的湖畔探索吧!

吃透SpringBoot中27个核心注解,轻松拿下SpringBoot!「建议收藏」

1 SpringBoot简介

Spring Boot 是由 Pivotal 团队提供的全新框架,其设计目的是用来简化新 Spring 全家桶的初始搭建以及开发过程。

Spring Boot最主要的就是解决了Spring全家桶的配置,整合框架,类似于pom整合所有包一样的。

2 SpringBoot执行流程

1、启动SpringBootmain(0

2、然后拉起一个内置的tomcat

3、初始化一个Spring容器,自动的配置web.xml、applicationContext-*.xml配置文件

4、扫描@SpringBootApplication注解所在的类对应的所有包下的类,并交给Spring管理。

图例解释:

吃透SpringBoot中27个核心注解,轻松拿下SpringBoot!「建议收藏」

3 SpringBoot中21大核心注解

  • @SpringBootConfiguration

该注解表示该应用是一个Springboot应用,最核心的注解。

看过底层源码的都知道实际@SpringBootApplication是@Configuration,@EnableAutoConfiguration,@ComponentScan三个注解合体。

@EnableDiscoveryClient
@RefreshScope
@EnableCustomConfig
@EnableRyFeignClients
@SpringBootApplication(exclude = {GsonAutoConfiguration.class})
@EnableConfigurationProperties
@EnableAsync
public class MerchantServiceApplication {
	public static void main(String[] args) {
  	SpringApplication.run(MerchantServiceApplication.class, args);
  }
}

欢迎大家来到IT世界,在知识的湖畔探索吧!

  • @EnableAutoConfiguration

使用该注解注后,Spring Boot 可以根据当前类路径下的包或者类来配置 Spring Bean

该注解源码:

欢迎大家来到IT世界,在知识的湖畔探索吧!package org.springframework.boot.autoconfigure;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.context.annotation.Import;

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration {
    String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";

    Class<?>[] exclude() default {};

    String[] excludeName() default {};
}
  • @EnableConfigurationProperties

如果你用了@EnableConfigurationProperties 和 @Configuration 时,那么所有使用了@ConfigurationProperties注解的beans都会自动被Environment配置。

使用示例:

@Configuration
@EnableConfigurationProperties({
 UnionpayQrCodeProperties.class,
})

@AutoConfigureOrder
public class UnionpayQrCodeConfiguration {
 @Value("${spring.application.name}")
 private String applicationName;
}
  • @AutoConfigureAfter

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

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

使用示例:

欢迎大家来到IT世界,在知识的湖畔探索吧!@AutoConfigureAfter(DataSourceAutoConfiguration.class)
public class MybatisAutoConfiguration {
}
  • @AutoConfigureBefore

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

  • @AutoConfigureOrder

该注解用来确定配置加载的优先级顺序。

  • @SpringBootConfiguration

该注解其实就是@Configuration 注解的升级版,就只是标识是Springboot中的注解而已。

  • @ConditionalOnJndi

如果指定的 JNDI 存在时该注解才会生效。

  • @ConditionalOnMissingClass

使用该注解后,当classpath中没有指定的 Class才生效。

  • @ConditionalOnWebApplication

如果项目是一个 WEB 项目,使用该注解才会生效。

  • @ConditionalOnNotWebApplication

如果项目不是一个 WEB 项目,使用该注解才会生效。

  • @ConditionalOnCloudPlatform

如果指定的云平台激活时,此时该注解才会生效。

  • @ConditionalOnBean

@ConditionalOnBean(Product.class),只有Product.class 在Spring的ApplicationContext(上下文)中存在时,才能创建该bean。

  • @ConditionalOnMissingBean

@ConditionalOnMissingBean(Product.class),只有Product.class 在Spring的ApplicationContext(上下文)中不存在时,才能创建该bean。

  • @ConditionalOnClass

使用该注解后,当类存在于classpath上时,才会创建Bean。

  • @ConditionalOnProperty

使用该注解时,需指定其属性该注解才会生效。

该注解和其属性使用示例:

@ConditionalOnProperty(value = "rocketmq.producer.enabled", havingValue = "true", matchIfMissing = true)
其中name用来从application.properties中读取某个属性值,如果该值为空,则返回false;
如果值不为空,则将该值与havingValue指定的值进行比较,如果一样则返回true;否则返回false。
如果返回值为false,则该configuration不生效;为true则生效。
  • @ConditionalOnExpression

如果SpEL 表达式值为 true 时该注解才生效。

该注解使用示例:

@ConditionalOnExpression("${enabled:false}")
  • @ConditionalOnJava

如果你当前运行的 Java JVM 版本,在设定的版本内该注解才生效。

  • @ConditionalOnResource

如果类路径下有指定的资源使用该注解才生效。

该注解使用示例;

@ConditionalOnResource(resources="classpath:shiro.ini")
  • @ConditionalOnSingleCandidate

如果指定的 class 在Spring中就一个 Bean,或为首选bean时,该注解才会生效。

  • @ConfigurationProperties

使用该注解可以把自定义的properties文件映射到实体bean中。

使用示例:

@Data
@Configuration
@ConfigurationProperties(prefix = "test.qrcode")
public class UnionpayQrCodeProperties {
    private Integer merchantId;

    private String instMid;

    private String mid;

    private String tid;

    private String notifyUrl;

    private String returnUrl;

    private String appId;

    private String appKey;

    private String sourceCode;

    private String payUrl;

    private String queryUrl;

    private String refundUrl;

    private String refundQueryUrl;

    private String closeUrl;
}

4 Spring中6大核心注解

因为SpringBoot主要就是整合Spring全家桶框架的,这里也聊一聊SpringBoot和Spring最紧密的6个注解。

  • @ComponentScan

这个注解大家应该很熟悉了吧,最常用的注解之一。@ComponentScan注解默认会装配标识了@Controller,@Service,@Repository,@Component注解的类到spring容器中。

注意:@SpringBootApplication注解已经包含了@ComponentScan注解。因此Springboot中不需要再单独使用@ComponentScan注解。

使用示例:

@ComponentScan(value = "com.sllt.qyg.test.mapper")
public class MyApiApplication {
 public static void main(String[] args) {
 	SpringApplication.run(MyApplication.class, args);
 }
}
  • @Conditional

Spring4才支持该注解,该注解主要功能是根据设置的条件来装载不同的bean,因此该注解又称为条件注解。

使用该注解后首先把装载的bean对应的类实现Condition接口,再对该接口实现类设置是否装载,最后才是设置条件注解

SpringBoot中以@Conditional*开头的注解,都是已经集成了@Conditional注解相应功能的。

  • @Component

@Component是一个元注解,即可以注解其他类注解。

比如@Controller、@Service、@Repository等注解就使用该注解。

源码示例:

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Service {
    @AliasFor(
        annotation = Component.class
    )
    String value() default "";
}
  • @ImportResource

通过导入的方式实现把实例加入springIOC容器中,使用该注解后导入的是配置文件。

使用示例:

@ImportResource("classpath:spring-redis.xml") //导入xml配置
public class MyApplication {
 public static void main(String[] args) {
 SpringApplication.run(MyApplication.class, args);
 }
}
  • @Import

通过导入的方式实现把实例加入springIOC容器中。

使用示例:

//定义两个类
public class A {}
public class B {}

//导入类
@Import({A.class,B.class})
@Configuration
public class TestConfig{}
  • @Configuration

该注解仅持支Spring3.0+,它用来定义配置类,可替换xml配置文件,被注解的类内部包含有一个或多个被@Bean注解的方法,这些方法将会被AnnotationConfigApplicationContextAnnotationConfigWebApplicationContext类进行扫描,并用于构建bean定义,初始化Spring容器。

使用示例:

import org.apache.ibatis.reflection.MetaObject;
import org.apache.ibatis.reflection.wrapper.MapWrapper;
import org.apache.ibatis.reflection.wrapper.ObjectWrapper;
import org.apache.ibatis.reflection.wrapper.ObjectWrapperFactory;
import org.mybatis.spring.boot.autoconfigure.ConfigurationCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.Map;

@Configuration
public class MybatisConfig {
   
   /**
    * 自定义Mybatis输出处理
    * 需配套配置 mybatis.configuration.map-underscore-to-camel-case=true
    * @return
    */
   @Bean
   public ConfigurationCustomizer mybatisConfigurationCustomizer(){
      return new ConfigurationCustomizer() {
         @Override
         public void customize(org.apache.ibatis.session.Configuration configuration) {
            configuration.setObjectWrapperFactory(new MapWrapperFactory());
         }
      };
   }
   
   /**
    * 自定义ObjectWrapperFactory
    * 实现接口 ObjectWrapperFactory,通过包装工厂来创建自定义的包装类,通过hasWrapperFor判断参数不为空,并且类型是Map的时候才使用自己扩展的ObjectWrapper  
    * @date 2020年6月22日 
    *
    */
   static class MapWrapperFactory implements ObjectWrapperFactory {

      @Override
       public boolean hasWrapperFor(Object object) {
           return object != null && object instanceof Map;
       }

       @Override
       public ObjectWrapper getWrapperFor(MetaObject metaObject, Object object) {
           return new MyMapWrapper(metaObject, (Map) object);
       }  
   }
   
   /**
    * 自定义MapWrapper
    * 承类 MapWrapper,重写findProperty, 通过useCamelCaseMapping来判断是否开启使用驼峰
    * @date 2020年6月22日 
    *
    */
   static class MyMapWrapper extends MapWrapper {
      MyMapWrapper(MetaObject metaObject, Map<String, Object> map) {
           super(metaObject, map);
       }

       @Override
       public String findProperty(String name, boolean useCamelCaseMapping) {
           if (useCamelCaseMapping
                   && ((name.charAt(0) >= 'A' && name.charAt(0) <= 'Z')
                   || name.contains("_"))) {
               return underlineToCamelhump(name);
           }
           return name;
       }

       /**
        * 将下划线风格替换为驼峰风格
        *
        * @param inputString
        * @return
        */
       private String underlineToCamelhump(String inputString) {
           StringBuilder sb = new StringBuilder();

           boolean nextUpperCase = false;
           for (int i = 0; i < inputString.length(); i++) {
               char c = inputString.charAt(i);
               if (c == '_') {
                   if (sb.length() > 0) {
                       nextUpperCase = true;
                   }
               } else {
                   if (nextUpperCase) {
                       sb.append(Character.toUpperCase(c));
                       nextUpperCase = false;
                   } else {
                       sb.append(Character.toLowerCase(c));
                   }
               }
           }
           return sb.toString();
       }
   }
}

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/22943.html

(0)

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们YX

mu99908888

在线咨询: 微信交谈

邮件:itzsgw@126.com

工作时间:时刻准备着!

关注微信