当前位置: 代码网 > it编程>编程语言>Java > SpringBoot自定义starter方式

SpringBoot自定义starter方式

2025年02月18日 Java 我要评论
命名推荐以xxx-spring-boot-starter命名原理引入spring-boot-starter-jdbc后可直接使用datasource1.加载自动配置类通过spi(service pro

命名

推荐以xxx-spring-boot-starter命名

原理

引入spring-boot-starter-jdbc后可直接使用datasource

1.加载自动配置类

通过spi(service provider interface,java提供的服务发现机制,用于框架拓展和组件替换)原理

(1)@springbootapplication->@enableautoconfiguration->@import

(2)@import通过autoconfigurationimportselector::selectimports方法导入自动配置类

(3)在autoconfigurationimportselector::getcandidateconfigurations方法中得知导入的自动配置类在从meta-inf/spring/org.springframework.boot.autoconfigure.autoconfiguration.imports文件读取

(4)其中包含datasourceautoconfiguration类

2.通过xxxautoconfiguration再导入功能所需的bean

(1)

datasourceautoconfiguration->@enableconfigurationproperties(datasourceproperties.class)

将properties类生效,读取application.yml中数据(url、username、password...)

(2)

@import({ datasourceconfiguration.hikari.class... }) 

导入各种连接池,根据条件注解生效不同连接池

自定义starter

示例:@log的添加日志功能封装成starter

1.创建标准springboot项目引入所需依赖

        <dependency>
            <groupid>org.springframework.boot</groupid>
            <artifactid>spring-boot-starter-aop</artifactid>
        </dependency>
        <dependency>
            <groupid>org.projectlombok</groupid>
            <artifactid>lombok</artifactid>
            <optional>true</optional>
        </dependency>

2.编写properties类

@data
@component
@configurationproperties("log")
public class logproperties{
    private boolean classfullname= true; //日志展示全类名
    private boolean showusetime= true; //日志展示方法执行时间
}

3.编写application.yml配置文件

log:
    class-full-name: true #展示全类名
    show-use-time: true #展示方法执行时间

4.编写@log注解

@target(method) //该注解只能用于方法上
@retention(retentionpolicy.runtime)
@inherited
public @interface log{}

5.编写aop实现具体功能

@slf4j
@aspect
@component
public class logaop {
    @resource
    private logproperties logproperties;

    @around("@annotation(com.gok.log.annotation.log)")
    public object around(proceedingjoinpoint joinpoint) throws throwable {
        long begintime = system.currenttimemillis();
        class targetclass = joinpoint.getsignature().getdeclaringtype();
        string functionname = joinpoint.getsignature().getname();
        string name = (logproperties.getclassfullname() ? targetclass.getname() : targetclass.getsimplename()) + "#" + functionname;
        try {
            log.info("{}开始", name);
            object res = joinpoint.proceed(joinpoint.getargs());
            log.info("{}结束", name);
            return res;
        } catch (throwable t) {
            log.info("{}异常," + t.getmessage(), name);
            throw t;
        } finally {
            if (logproperties.getshowusetime()) {
                log.info("{}执行时间:{}ms", name, system.currenttimemillis() - begintime);
            }
        }
    }
}

springboot默认只扫描启动类所在目录,而log实现所在的包不会扫描,有@component也无效

所以通过原理中的spi机制导入

6.删除logproperties类和logaop类的@component注解

统一在logautoconfiguration导入

@configuration
//引入properties类
@enableconfigurationproperties(logproperties.class)
//引入aop
@import(logaop.class)
public class logautoconfiguration  {
}

7.编写文件

编写meta-inf/spring/org.springframework.boot.autoconfigure.autoconfiguration.imports文件

引入自动配置类com.gok.logstarter.config.logautoconfiguration

8.删除springboot启动类(main方法所在类)、删除pom.xml<build>标签

原因:作为starter不需要启动类

9.补充

(1)自定义starter的application.yml可以删除,最终生效的是引入starter项目中application.yml

(2)如果希望实现编写application.yml文件智能提示,需要在自定义starter的pom.xml添加如下依赖

        <dependency>
            <groupid>org.springframework.boot</groupid>
            <artifactid>spring-boot-configuration-processor</artifactid>
            <optional>true</optional>
        </dependency>

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com