Spring Boot手写starter

目录

  • 1.介绍
    • [1.1 什么是 Starter 机制?](#1.1 什么是 Starter 机制?)
    • [1.2 Starter 机制的工作原理?](#1.2 Starter 机制的工作原理?)
  • 2.starter自定义
    • [2.1 新建工程](#2.1 新建工程)
    • [2.2 自定义注解](#2.2 自定义注解)
    • [2.3 创建增强类](#2.3 创建增强类)
    • [2.4 创建自动配置类](#2.4 创建自动配置类)
    • [2.5 配置自动配置](#2.5 配置自动配置)
    • [2.6 测试](#2.6 测试)

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 新建工程

引入以下依赖:

xml 复制代码
 <!--日志-->
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
</dependency>
<!--aop相关-->
<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjweaver</artifactId>
</dependency>
<!--工具类-->
<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
</dependency>
<!--自动配置相关-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-autoconfigure</artifactId>
</dependency>

2.2 自定义注解

java 复制代码
package cn.smart.pagex.annotation;

import java.lang.annotation.*;
@Target({ElementType.METHOD})		//放在方法上
@Retention(RetentionPolicy.RUNTIME)		//运行时注解可见(用于通过反射读取注解)
@Documented

public @interface PageX {

    String value() default "";
}

2.3 创建增强类

java 复制代码
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 创建自动配置类

java 复制代码
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 测试

在其他模块引入依赖

<!--输出执行时间-->
        <dependency>
            <groupId>cn.smart</groupId>
            <artifactId>logtimex-spring-boot-starter</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>

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

properties 复制代码
//使starter有效,默认
cn.smart.logtimex.enable = true

//使starter无效,原理就是控制是否进行自动配置
cn.smart.logtimex.enable = false
相关推荐
希忘auto1 小时前
详解Servlet的使用
java·servlet·tomcat
ygl61503732 小时前
Vue3+SpringBoot3+Sa-Token+Redis+mysql8通用权限系统
java·spring boot·vue
Code哈哈笑2 小时前
【Java 学习】构造器、static静态变量、static静态方法、static构造器、
java·开发语言·学习
是老余2 小时前
Java三大特性:封装、继承、多态【详解】
java·开发语言
鸽鸽程序猿2 小时前
【JavaEE】Maven的介绍及配置
java·java-ee·maven
尘浮生3 小时前
Java项目实战II基于微信小程序的南宁周边乡村游平台(开发文档+数据库+源码)
java·开发语言·数据库·spring boot·微信小程序·小程序·maven
程序员阿龙3 小时前
基于微信小程序的校园二手交易平台设计与实现,微信小程序(定制+讲解+咨询)校园二手商品在线交易系统、校园二手市场管理与推荐工具、智能化商品交易与推荐平台
spring boot·微信小程序·毕业设计·在线商品交易与搜索优化平台·在线二手商品交易与支付平台·商品管理与交易评价平台·二手商品分类与交易管理系统
耀耀_很无聊7 小时前
第1章 初识SpringMVC
java·spring·mvc
麻衣带我去上学7 小时前
Spring源码学习(一):Spring初始化入口
java·学习·spring
东阳马生架构7 小时前
MySQL底层概述—1.InnoDB内存结构
java·数据库·mysql