springboot的自定义starter

一、 SpringBoot starter机制

统一管理,统一引入 减少繁琐配置,解决版本冲突

二、 自定义starter

1.开发中有很多独立于业务的配置模块,重复引用的时候在pom中引用即可使用。

例如:

  • 动态数据源。
  • 登录模块。
  • 基于AOP技术实现日志切面。
    ......

2.自定义starter的命名规则

  • SpringBoot提供的starter以spring-boot-starter-xxx 的方式命名的。
  • 官方建议自定义的starter使用xxx-spring-boot-starter 命名规则。以区分SpringBoot生态提供
    的starter

3.实现

3.1 新建maven jar工程,工程名为ldz-spring-boot-starter,导入依赖:

<dependencies>
        <dependency>
                <groupId>org.springframework.boot</groupId>
                                <artifactId>spring-boot-autoconfigure</artifactId>
                                <version>2.2.9.RELEASE</version>
                </dependency>
        </dependencies>

自动配置的核心依赖

3.2 编写javaBean实体

@EnableConfigurationProperties(SimpleBean.class)
@ConfigurationProperties(prefix = "simplebean")
public class SimpleBean {
      private int id;
      private String name;
      public int getId() {
            return id;
      }
      public void setId(int id) {
            this.id = id;
      }
      public String getName() {
            return name;
      }
      public void setName(String name) {
            this.name = name;
      }
      @Override
      public String toString() {
            return "SimpleBean{" +
            "id=" + id +
            ", name='" + name + '\'' +
            '}';
      }
}

通用的配置类实体(在调用的工程中配置调用的属性值)

3.3 编写配置类MyAutoConfiguration

@Configuration
public class MyAutoConfiguration {
      static {
            System.out.println("MyAutoConfiguration init....");
      }
      @Bean
      public SimpleBean simpleBean(){
            return new SimpleBean();
      }
}

实例化通用Javabean的类,这个类实例化的时候@Bean方法的结果会作为spring的bean放到ioc容器中,交由spring管理.

3.4 resources下创建/META-INF/spring.factories

META-INF是自己手动创建的目录,spring.factories也是手动创建的文件,在该文件中配置自
己的自动配置类

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.lagou.config.MyAutoConfiguration

spring启动的时候会根据key:org.springframework.boot.autoconfigure.EnableAutoConfiguration加载/META-INF/spring.factories下的value,然后实例化,并且执行@bean方法,进行配置bean的实例化。

4. 使用自定义starter

4.1 导入自定义starter的依赖

      <dependency>
           <groupId>com.lagou</groupId>
           <artifactId>ldz-spring-boot-starter</artifactId>
           <version>1.0-SNAPSHOT</version>
      </dependency>

4.2 在全局配置文件中配置属性值

simplebean.id=1
simplebean.name=自定义starter

4.2 测试

//测试自定义starter
      @Autowired
      private SimpleBean simpleBean;
      @Test
      public void zdyStarterTest(){
            System.out.println(simpleBean);
      }

三、 如果有一天我们不想要启动工程的时候自动装配SimpleBean

1. 删除pom.xml中的依赖 (low)

2. 热插拔技术

我们经常会在启动类Application上面加@EnableXXX注解,其实这个@Enablexxx注解就是一种热拔插技术,加了这个注解就可以启动对应的starter,当不需要对应的starter的时候只需要把这个注解注释掉就行。

2.1 改造ldz工程新增热插拔支持类

2.1.1 新增标记类ConfigMarker

   public class ConfigMarker {
   }

2.1.2 新增EnableRegisterServer注解

    @Target({ElementType.TYPE})
    @Retention(RetentionPolicy.RUNTIME)
    @Import({ConfigMarker.class})
    public @interface EnableRegisterServer {
    }

2.1.3 改造MyAutoConfiguration

新增条件注解@ConditionalOnBean(ConfigMarker.class) ,
@ConditionalOnBean 这个是条件注解,前面的意思代表只有当期上下文中含有ConfigMarker对象,被标注的类才会被实例化。

@Configuration
@ConditionalOnBean(ConfigMarker.class)
public class MyAutoConfiguration {
        static {
        System.out.println("MyAutoConfiguration init....");
        }
        @Bean
        public SimpleBean simpleBean(){
        return new SimpleBean();
        }
}

2.1.4 改造调用工程

在启动类上新增@EnableImRegisterServer注解


vvv.PNG

当加了@EnableImRegisterServer 的时候启动zdy工程就会自动装配SimpleBean,反之则不装配。

2.1.4 原理

当加了@EnableImRegisterServer 注解的时候,由于这个注解使用了@Import({ConfigMarker.class}) ,所以会导致Spring去加载ConfigMarker 到上下文中,而又因为条件注@ConditionalOnBean(ConfigMarker.class) 的存在,所以MyAutoConfiguration 类就会被实例化。

3 关于条件注解的讲解

  • @ConditionalOnBean:仅仅在当前上下文中存在某个对象时,才会实例化一个Bean。
  • @ConditionalOnClass:某个class位于类路径上,才会实例化一个Bean。
  • @ConditionalOnExpression:当表达式为true的时候,才会实例化一个Bean。基于SpEL表
    达式的条件判断。
  • @ConditionalOnMissingBean:仅仅在当前上下文中不存在某个对象时,才会实例化一个
    Bean。
  • @ConditionalOnMissingClass:某个class类路径上不存在的时候,才会实例化一个Bean。
  • @ConditionalOnNotWebApplication:不是web应用,才会实例化一个Bean。
  • @ConditionalOnWebApplication:当项目是一个Web项目时进行实例化。
  • @ConditionalOnProperty:当指定的属性有指定的值时进行实例化。
  • @ConditionalOnJava:当JVM版本为指定的版本范围时触发实例化。
  • @ConditionalOnResource:当类路径下有指定的资源时触发实例化。
  • @ConditionalOnJndi:在JNDI存在的条件下触发实例化。
  • @ConditionalOnSingleCandidate:当指定的Bean在容器中只有一个,或者有多个但是指定
    了首选的Bean时触发实例化。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,793评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,567评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,342评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,825评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,814评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,680评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,033评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,687评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,175评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,668评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,775评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,419评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,020评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,206评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,092评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,510评论 2 343

推荐阅读更多精彩内容