• Spring Boot手写starter


    1.介绍

    1.1 什么是 Starter 机制?

    Starter 机制是 Spring Boot 提供的一种约定优于配置的实现方式,可以抛弃以前繁杂的配置,将其统一集成进starter,应用者只需要在maven中引入starter依赖,SpringBoot就能自动扫描到要加载的信息并启动相应的默认配置

    starter让我们摆脱了各种依赖库的处理,需要配置各种信息的困扰。SpringBoot会自动通过classpath路径下的类发现需要的Bean,并注册进IOC容器

    1.2 Starter 机制的工作原理?

    当 Spring Boot 应用启动时,它会扫描 classpath 下的 META-INF/spring.factories 文件,查找所有标记为 org.springframework.boot.autoconfigure.EnableAutoConfiguration 的配置类。这些配置类中定义了应用所需的 Bean 和自动配置逻辑。

    Spring Boot 会根据条件注解(如 @ConditionalOnClass@ConditionalOnMissingBean 等)来决定是否进行自动配置。

    2.starter自定义

    springboot 官方推荐使用格式:

    • springboot官方:spring-boot-starter-xxx
    • 第三方开发者自定义:xxxx-spring-boot-starter

    自定义一个的启动器,包含一个自定义的记录方法执行时间的注解:logtimex-spring-boot-starter

    2.1 新建工程

    引入以下依赖:

     
    <dependency>
        <groupId>org.slf4jgroupId>
        <artifactId>slf4j-apiartifactId>
    dependency>
    
    <dependency>
        <groupId>org.aspectjgroupId>
        <artifactId>aspectjweaverartifactId>
    dependency>
    
    <dependency>
        <groupId>cn.hutoolgroupId>
        <artifactId>hutool-allartifactId>
    dependency>
    
    <dependency>
        <groupId>org.springframework.bootgroupId>
        <artifactId>spring-boot-autoconfigureartifactId>
    dependency>
    

    2.2 自定义注解

    package cn.smart.pagex.annotation;
    
    import java.lang.annotation.*;
    @Target({ElementType.METHOD})		//放在方法上
    @Retention(RetentionPolicy.RUNTIME)		//运行时注解可见(用于通过反射读取注解)
    @Documented
    
    public @interface PageX {
    
        String value() default "";
    }
    

    2.3 创建增强类

    package cn.smart.logtimex.aop;
    
    import cn.hutool.core.date.StopWatch;
    import lombok.extern.slf4j.Slf4j;
    import org.aspectj.lang.ProceedingJoinPoint;
    import org.aspectj.lang.annotation.Around;
    import org.aspectj.lang.annotation.Aspect;
    import org.aspectj.lang.annotation.Pointcut;
    import org.springframework.stereotype.Component;
    
    @Component
    @Aspect
    @Slf4j
    public class LogTimeXAop {
    	//指定注解为切入点
        @Pointcut("@annotation(cn.smart.core.annotation.LogTimeX)")
        public void pointCut() {}
    
        @Around("pointCut()")
        public Object around(ProceedingJoinPoint pjp) throws Throwable {
            StopWatch stopWatch = new StopWatch();
            //开始计时
            stopWatch.start();
    
    		//放行被增强的方法
            Object result = pjp.proceed();
    
    		//结束计时
            stopWatch.stop();
            log.debug("方法执行时间:{}", stopWatch.getTotalTimeMillis());
            return result;
        }
    }
    

    2.4 创建自动配置类

    package cn.smart.logtimex.autoconfiguration;
    
    import cn.smart.logtimex.aop.LogTimeXAop;
    import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.context.annotation.Import;
    
    @Configuration
    @Import(LogTimeXAop.class)
    //开关
    //cn.smart.logtimex.enable = true
    @ConditionalOnProperty(prefix = "cn.smart.logtimex",value = "enable", havingValue = "true", matchIfMissing = true)
    public class LogTimeXAutoConfiguration { //领头羊
    }
    

    2.5 配置自动配置

    resourecs文件目录下创建META-INF,并创建我们自己的spring.factories,并把我们的 LogTimeXAutoConfiguration 添加进去

    org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
    cn.smart.logtimex.autoconfiguration.LogTimeXAutoConfiguration
    

    2.6 测试

    在其他模块引入依赖

    
            
                cn.smart
                logtimex-spring-boot-starter
                0.0.1-SNAPSHOT
            
    

    application.properties配置文件中可以对我们的starter进行设置

    //使starter有效,默认
    cn.smart.logtimex.enable = true
    
    //使starter无效,原理就是控制是否进行自动配置
    cn.smart.logtimex.enable = false
    
  • 相关阅读:
    PCB 各层定义
    iOS CGRect CGPoint NSRange等结构体的NSLog打印输出
    数据结构“入门”—堆的实现
    浅谈嵌入式系统的持续集成
    6.3物联网RK3399项目开发实录-驱动开发之I2C 使用(wulianjishu666)
    React组件复用
    Mybatis-Plus入门
    Django DRF 自动生成接口文档
    电脑休眠之后唤不醒
    pgsl基于docker的安装
  • 原文地址:https://blog.csdn.net/qq_57036151/article/details/140232124