现在很多开源的组件都会提供对应的
springboot-starter
包给我们去用,要做一个starter
包并不难。参照Spring内置的实现就好了:
1、在工程里引入 starter 打包相关的依赖。
2、在我们工程内建 spring.factories 文件,编写我们配置类的全限类名。
一、自定义步骤详解
使用AOP实现拦截方法执行和打印日志的功能
1.1、创建Starter项目
名称 zhinian-log-spring-boot-starter
, 版本号是 1.0-SNAPSHOT
。且同时引入下方依赖。
1.2、引入pom依赖
project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
modelVersion>4.0.0modelVersion>
groupId>com.zn.opit.basegroupId>
artifactId>zhinian-log-spring-boot-starterartifactId>
version>1.0-SNAPSHOTversion>
properties>
maven.compiler.source>8maven.compiler.source>
maven.compiler.target>8maven.compiler.target>
properties>
dependencies>
dependency>
groupId>org.springframework.bootgroupId>
artifactId>spring-boot-configuration-processorartifactId>
version>2.7.13version>
optional>trueoptional>
dependency>
dependency>
groupId>org.springframework.bootgroupId>
artifactId>spring-boot-starter-aopartifactId>
version>2.7.13version>
dependency>
dependencies>
build>
plugins>
plugin>
groupId>org.springframework.bootgroupId>
artifactId>spring-boot-maven-pluginartifactId>
configuration>
classifier>execclassifier>
configuration>
plugin>
plugins>
build>
project>
1.3、定义Starter需要的配置类(Properties)
package com.zn.opit.base.config;
import org.springframework.boot.context.properties.ConfigurationProperties;
@ConfigurationProperties(prefix = "zn.log")
public class ZhiNianLogProperties {
private boolean enabled;
public boolean isEnabled() {
return enabled;
}
public void setEnabled(boolean enabled) {
this.enabled = enabled;
}
}
如果我们需要从 application.yaml 或 application.properties 中拿到一些使用者配置的数据,那么我们就需要定义一个properties类。这个properties类主要作用是将 application.yaml 或 application.properties 中的配置信息映射成实体类,比如我们这里指定 prefix = “zn.log” 这样,我们就能将以zn.log为前缀的配置项拿到了。
1.4、编写Starter项目的业务功能
AOP切面逻辑
package com.zn.opit.base.component;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
@Aspect
@Component
public class WebLogAspect {
@Pointcut("execution(* *..*Controller.*(..))")
public void webLog(){}
@Before("webLog()")
public void doBefore(JoinPoint joinPoint) throws Throwable {
//方法开始前,打印开始日志
System.out.println("zn-starter --------doBefore");
}
@AfterReturning(returning = "ret", pointcut = "webLog()")
public void doAfterReturning(Object ret) throws Throwable {
// 处理完请求,打印结束日志
System.out.println("zn-starter --------doAfterReturning");
}
}
1.5、编写自动配置类
package com.zn.opit.base.config;
import com.zn.opit.base.component.WebLogAspect;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration // 表示该类是一个配置类
@EnableConfigurationProperties({ZhiNianLogProperties.class}) // 该注解的作用是为 xxxProperties 开启属性配置功能,并将这个类以组件的形式注入到容器中
@ConditionalOnProperty(prefix = "zn.log", value = "enabled") // 当指定的配置项等于你想要的时候,配置类生效
public class ZnLogAutoConfig {
@Bean // @Bean:该注解用于将方法的返回值以 Bean 对象的形式添加到容器中
@ConditionalOnMissingBean // @ConditionalOnMissingBean(xxx.class):该注解表示当容器中没有 xxx 类时,该方法才生效
public WebLogAspect webLogAspect() {
return new WebLogAspect();
}
}
1.6、编写spring.factories文件加载自动配置类
org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.zn.opit.base.config.ZnLogAutoConfig
1.7、构建starter制品包
build>
plugins>
plugin>
groupId>org.springframework.bootgroupId>
artifactId>spring-boot-maven-pluginartifactId>
configuration>
classifier>execclassifier>
configuration>
plugin>
plugins>
build>
在项目根目录下执行mvn clean install,打包并放到maven仓库中(maven仓库地址和配置有关)
显示build success,表示starter制品包打包完成
二、其它项目引用验证
2.1、pom中引入自定义starter依赖
project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSche服务器托管网ma-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
modelVersion>4.0.0modelVersion>
groupId>com.zn.opit.basegroupId>
artifactId>zhinian-log-starter-testartifactId>
version>1.0-SNAPSHOTversion>
properties>
maven.c服务器托管网ompiler.source>8maven.compiler.source>
maven.compiler.target>8maven.compiler.target>
properties>
dependencies>
dependency>
groupId>org.springframework.bootgroupId>
artifactId>spring-boot-starter-webartifactId>
version>2.7.13version>
dependency>
dependency>
groupId>com.zn.opit.basegroupId>
artifactId>zhinian-log-spring-boot-starterartifactId>
version>1.0-SNAPSHOTversion>
dependency>
dependencies>
project>
2.2、写一个Controller接口
(要符合starter里的aop拦截表达式规则,否则拦截不到)
package com.zn.opit.base.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RequestMapping("/hello")
@RestController
public class HelloController {
@GetMapping("/test")
public String test() {
return "SUCCESS";
}
}
2.3、配置文件 application.properties
zn.log.enabled=true
server.port=8077
2.4、验证
启动业务项目,访问接口,验证
至此,一个简单的starter示例就写完了。
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net