命名
推荐以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>总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论