SpringBoot自定义start启动器图文教程(详细)

1.SpringBoot启动器原理

我们新建一个空的spring boot项目,他都是由启动类上标注了这个注解@SpringBootApplication 我们猜想为什么他就能启动呢?我们点进@SpringBootApplication注解,可以看到 @EnableAutoConfiguration 点进AutoConfigurationImportSelector.class

总结: 发现 META-INF/spring.factories文件中,都是配置类

2.自定义starter

因此,我们仿照上天原理,自己写一个,架构如图, 场景:做个日志配置starter,只要在加了注解(@LogAnnotation())就能记录日志。

第一步,新建一个spring boot项目,取名为:spring-boot-starter-log,这是大致的项目结构图 第二步, 新建注解LogAnnotation类

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface LogAnnotation {
          
   
    String module() default "test";
}

第三步,新建配置类

@Configuration
@Import(LogSelector.class)
public class LogAutoConfiguration {
          
   
    @Bean
    public Object getObj(){
          
   
        System.out.println("自动生成Object对象到spring bean工厂");
        return new Object();
    }
}

第四步,新建文件,spring.factories,里面写第二步新建配置类信息

# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=
com.hsq.log.LogAutoConfiguration

第五步:文件LogAop类

@Aspect
@Order(-1)
public class LogAop {
          
   
    @Autowired
    @Qualifier("getObj")
    private Object getObj;

    @Around("@annotation(la)")
    public Object logRecord(ProceedingJoinPoint proceedingJoinPoint, LogAnnotation la) {
          
   
        Long start = System.currentTimeMillis();
        try {
          
   
            Object proceed = proceedingJoinPoint.proceed();
            System.out.println(la.module() + "模块的" +
                    proceedingJoinPoint.getSignature().getName() +
                    "方法,执行的耗时时间为:" +
                    (System.currentTimeMillis() - start) + "ms");
            System.out.println(getObj);
        } catch (Throwable e) {
          
   
            e.printStackTrace();
        }
        return null;
    }
}

第六步,新建LogSelector类

public class LogSelector implements ImportSelector {
          
   
    @Override
    public String[] selectImports(AnnotationMetadata annotationMetadata) {
          
   
        return new String[]{
          
   
                "com.hsq.log.aop.LogAop"
        };
    }
}

到这已经完成启动stater启动的配置了

测试,新建springboot-demo项目,maven中导入web,导入spring-boot-starter-log 在controller中

@RestController
@RequestMapping("/hello")
public class MyTestController {
          
   

    @LogAnnotation()
    @RequestMapping("/test")
    public String getTest() throws InterruptedException {
          
   
        Thread.sleep(2000);
        return "我正在测试自定义springboot的starter的启动器";
    }

    @LogAnnotation()
    @RequestMapping("aa")
    public String getString() {
          
   
        return "aaa";
    }
}

访问url,查看控制台信息。

经验分享 程序员 微信小程序 职场和发展