mirror of
https://github.moeyy.xyz/https://github.com/GeWuYou/forgeboot
synced 2025-10-27 16:14:32 +08:00
feat(banner): Add Forge Banner Module
- Added Banner module, including API, implementation and automatic configuration components - Add banner configuration properties and policy enumeration - Implement configurable banner provider class - Create necessary project structures and configuration files
This commit is contained in:
parent
58593f7b21
commit
bd03558440
@ -30,4 +30,10 @@ object Modules {
|
|||||||
const val IMPL = ":forgeboot-trace-spring-boot-starter:forgeboot-trace-impl"
|
const val IMPL = ":forgeboot-trace-spring-boot-starter:forgeboot-trace-impl"
|
||||||
const val AUTOCONFIGURE = ":forgeboot-trace-spring-boot-starter:forgeboot-trace-autoconfigure"
|
const val AUTOCONFIGURE = ":forgeboot-trace-spring-boot-starter:forgeboot-trace-autoconfigure"
|
||||||
}
|
}
|
||||||
|
object Banner {
|
||||||
|
const val STARTER = ":forgeboot-banner"
|
||||||
|
const val API = ":forgeboot-banner:forgeboot-banner-api"
|
||||||
|
const val IMPL = ":forgeboot-banner:forgeboot-banner-impl"
|
||||||
|
const val AUTOCONFIGURE = ":forgeboot-banner:forgeboot-banner-autoconfigure"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
3
forgeboot-banner/.gitattributes
vendored
Normal file
3
forgeboot-banner/.gitattributes
vendored
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
/gradlew text eol=lf
|
||||||
|
*.bat text eol=crlf
|
||||||
|
*.jar binary
|
||||||
40
forgeboot-banner/.gitignore
vendored
Normal file
40
forgeboot-banner/.gitignore
vendored
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
HELP.md
|
||||||
|
.gradle
|
||||||
|
build/
|
||||||
|
!gradle/wrapper/gradle-wrapper.jar
|
||||||
|
!**/src/main/**/build/
|
||||||
|
!**/src/test/**/build/
|
||||||
|
|
||||||
|
### STS ###
|
||||||
|
.apt_generated
|
||||||
|
.classpath
|
||||||
|
.factorypath
|
||||||
|
.project
|
||||||
|
.settings
|
||||||
|
.springBeans
|
||||||
|
.sts4-cache
|
||||||
|
bin/
|
||||||
|
!**/src/main/**/bin/
|
||||||
|
!**/src/test/**/bin/
|
||||||
|
|
||||||
|
### IntelliJ IDEA ###
|
||||||
|
.idea
|
||||||
|
*.iws
|
||||||
|
*.iml
|
||||||
|
*.ipr
|
||||||
|
out/
|
||||||
|
!**/src/main/**/out/
|
||||||
|
!**/src/test/**/out/
|
||||||
|
|
||||||
|
### NetBeans ###
|
||||||
|
/nbproject/private/
|
||||||
|
/nbbuild/
|
||||||
|
/dist/
|
||||||
|
/nbdist/
|
||||||
|
/.nb-gradle/
|
||||||
|
|
||||||
|
### VS Code ###
|
||||||
|
.vscode/
|
||||||
|
|
||||||
|
### Kotlin ###
|
||||||
|
.kotlin
|
||||||
6
forgeboot-banner/build.gradle.kts
Normal file
6
forgeboot-banner/build.gradle.kts
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
extra{
|
||||||
|
setProperty(ProjectFlags.IS_ROOT_MODULE,true)
|
||||||
|
}
|
||||||
|
dependencies {
|
||||||
|
|
||||||
|
}
|
||||||
3
forgeboot-banner/forgeboot-banner-api/.gitattributes
vendored
Normal file
3
forgeboot-banner/forgeboot-banner-api/.gitattributes
vendored
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
/gradlew text eol=lf
|
||||||
|
*.bat text eol=crlf
|
||||||
|
*.jar binary
|
||||||
40
forgeboot-banner/forgeboot-banner-api/.gitignore
vendored
Normal file
40
forgeboot-banner/forgeboot-banner-api/.gitignore
vendored
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
HELP.md
|
||||||
|
.gradle
|
||||||
|
build/
|
||||||
|
!gradle/wrapper/gradle-wrapper.jar
|
||||||
|
!**/src/main/**/build/
|
||||||
|
!**/src/test/**/build/
|
||||||
|
|
||||||
|
### STS ###
|
||||||
|
.apt_generated
|
||||||
|
.classpath
|
||||||
|
.factorypath
|
||||||
|
.project
|
||||||
|
.settings
|
||||||
|
.springBeans
|
||||||
|
.sts4-cache
|
||||||
|
bin/
|
||||||
|
!**/src/main/**/bin/
|
||||||
|
!**/src/test/**/bin/
|
||||||
|
|
||||||
|
### IntelliJ IDEA ###
|
||||||
|
.idea
|
||||||
|
*.iws
|
||||||
|
*.iml
|
||||||
|
*.ipr
|
||||||
|
out/
|
||||||
|
!**/src/main/**/out/
|
||||||
|
!**/src/test/**/out/
|
||||||
|
|
||||||
|
### NetBeans ###
|
||||||
|
/nbproject/private/
|
||||||
|
/nbbuild/
|
||||||
|
/dist/
|
||||||
|
/nbdist/
|
||||||
|
/.nb-gradle/
|
||||||
|
|
||||||
|
### VS Code ###
|
||||||
|
.vscode/
|
||||||
|
|
||||||
|
### Kotlin ###
|
||||||
|
.kotlin
|
||||||
6
forgeboot-banner/forgeboot-banner-api/build.gradle.kts
Normal file
6
forgeboot-banner/forgeboot-banner-api/build.gradle.kts
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
|
||||||
|
dependencies {
|
||||||
|
compileOnly(platform(libs.springBootDependencies.bom))
|
||||||
|
compileOnly(libs.springBootStarter.web)
|
||||||
|
kapt(libs.springBoot.configuration.processor)
|
||||||
|
}
|
||||||
@ -0,0 +1,16 @@
|
|||||||
|
package com.gewuyou.forgeboot.banner.api.config.entities
|
||||||
|
|
||||||
|
import com.gewuyou.forgeboot.banner.api.enums.BannerStrategy
|
||||||
|
import org.springframework.boot.context.properties.ConfigurationProperties
|
||||||
|
|
||||||
|
/**
|
||||||
|
*横幅配置
|
||||||
|
*
|
||||||
|
* @since 2025-06-03 12:55:18
|
||||||
|
* @author gewuyou
|
||||||
|
*/
|
||||||
|
@ConfigurationProperties("forgeboot.banner")
|
||||||
|
class BannerProperties {
|
||||||
|
var path: String = "banners/"
|
||||||
|
var strategy: BannerStrategy = BannerStrategy.Random
|
||||||
|
}
|
||||||
@ -0,0 +1,13 @@
|
|||||||
|
package com.gewuyou.forgeboot.banner.api.enums
|
||||||
|
|
||||||
|
/**
|
||||||
|
*横幅策略
|
||||||
|
*
|
||||||
|
* @since 2025-06-03 13:04:30
|
||||||
|
* @author gewuyou
|
||||||
|
*/
|
||||||
|
enum class BannerStrategy {
|
||||||
|
First,
|
||||||
|
Random,
|
||||||
|
All
|
||||||
|
}
|
||||||
@ -0,0 +1,18 @@
|
|||||||
|
package com.gewuyou.forgeboot.banner.api.provider
|
||||||
|
|
||||||
|
import java.io.PrintStream
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 横幅提供商接口,用于定义横幅输出行为
|
||||||
|
*
|
||||||
|
* @since 2025-06-03 12:17:19
|
||||||
|
* @author gewuyou
|
||||||
|
*/
|
||||||
|
fun interface BannerProvider {
|
||||||
|
/**
|
||||||
|
* 输出横幅内容到指定的输出流
|
||||||
|
*
|
||||||
|
* @param out 输出流对象
|
||||||
|
*/
|
||||||
|
fun printBanner(out: PrintStream)
|
||||||
|
}
|
||||||
3
forgeboot-banner/forgeboot-banner-impl/.gitattributes
vendored
Normal file
3
forgeboot-banner/forgeboot-banner-impl/.gitattributes
vendored
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
/gradlew text eol=lf
|
||||||
|
*.bat text eol=crlf
|
||||||
|
*.jar binary
|
||||||
40
forgeboot-banner/forgeboot-banner-impl/.gitignore
vendored
Normal file
40
forgeboot-banner/forgeboot-banner-impl/.gitignore
vendored
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
HELP.md
|
||||||
|
.gradle
|
||||||
|
build/
|
||||||
|
!gradle/wrapper/gradle-wrapper.jar
|
||||||
|
!**/src/main/**/build/
|
||||||
|
!**/src/test/**/build/
|
||||||
|
|
||||||
|
### STS ###
|
||||||
|
.apt_generated
|
||||||
|
.classpath
|
||||||
|
.factorypath
|
||||||
|
.project
|
||||||
|
.settings
|
||||||
|
.springBeans
|
||||||
|
.sts4-cache
|
||||||
|
bin/
|
||||||
|
!**/src/main/**/bin/
|
||||||
|
!**/src/test/**/bin/
|
||||||
|
|
||||||
|
### IntelliJ IDEA ###
|
||||||
|
.idea
|
||||||
|
*.iws
|
||||||
|
*.iml
|
||||||
|
*.ipr
|
||||||
|
out/
|
||||||
|
!**/src/main/**/out/
|
||||||
|
!**/src/test/**/out/
|
||||||
|
|
||||||
|
### NetBeans ###
|
||||||
|
/nbproject/private/
|
||||||
|
/nbbuild/
|
||||||
|
/dist/
|
||||||
|
/nbdist/
|
||||||
|
/.nb-gradle/
|
||||||
|
|
||||||
|
### VS Code ###
|
||||||
|
.vscode/
|
||||||
|
|
||||||
|
### Kotlin ###
|
||||||
|
.kotlin
|
||||||
6
forgeboot-banner/forgeboot-banner-impl/build.gradle.kts
Normal file
6
forgeboot-banner/forgeboot-banner-impl/build.gradle.kts
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
|
||||||
|
dependencies {
|
||||||
|
compileOnly(platform(libs.springBootDependencies.bom))
|
||||||
|
compileOnly(libs.springBootStarter.web)
|
||||||
|
compileOnly(project(Modules.Banner.API))
|
||||||
|
}
|
||||||
@ -0,0 +1,75 @@
|
|||||||
|
package com.gewuyou.forgeboot.banner.impl
|
||||||
|
|
||||||
|
import com.gewuyou.forgeboot.banner.api.enums.BannerStrategy
|
||||||
|
import com.gewuyou.forgeboot.banner.api.provider.BannerProvider
|
||||||
|
import com.gewuyou.forgeboot.banner.api.config.entities.BannerProperties
|
||||||
|
import org.springframework.core.io.Resource
|
||||||
|
import org.springframework.core.io.support.PathMatchingResourcePatternResolver
|
||||||
|
import java.io.PrintStream
|
||||||
|
import java.util.Random
|
||||||
|
import java.util.Scanner
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 可配置横幅提供者类,根据配置属性输出横幅
|
||||||
|
*
|
||||||
|
* @param properties 横幅属性配置对象
|
||||||
|
*/
|
||||||
|
class ConfigurableBannerProvider(
|
||||||
|
private val properties: BannerProperties,
|
||||||
|
): BannerProvider {
|
||||||
|
/**
|
||||||
|
* 输出横幅内容到指定的输出流
|
||||||
|
*
|
||||||
|
* @param out 输出流对象,可为空
|
||||||
|
*/
|
||||||
|
override fun printBanner(out: PrintStream) {
|
||||||
|
try {
|
||||||
|
// 根据属性配置获取横幅资源路径模式
|
||||||
|
val pattern = "classpath*:" + properties.path + "*.txt"
|
||||||
|
// 使用路径匹配获取所有符合条件的资源
|
||||||
|
val resources: Array<Resource?> = PathMatchingResourcePatternResolver().getResources(pattern)
|
||||||
|
// 如果没有找到任何资源,则输出提示信息并返回
|
||||||
|
if (resources.isEmpty()) {
|
||||||
|
out.println("No banner found in: " + properties.path)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
// 根据配置的策略选择横幅输出方式
|
||||||
|
when (properties.strategy) {
|
||||||
|
BannerStrategy.First-> resources[0]?.let { printResource(it, out) }
|
||||||
|
BannerStrategy.Random -> resources[Random().nextInt(resources.size)]?.let { printResource(it, out) }
|
||||||
|
BannerStrategy.All -> {
|
||||||
|
for (resource in resources) {
|
||||||
|
resource?.let { printResource(it, out) }
|
||||||
|
out.println()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (e: Exception) {
|
||||||
|
// 异常处理:输出错误信息
|
||||||
|
out.println("Error loading banners: " + e.message)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 打印资源内容到指定的输出流
|
||||||
|
*
|
||||||
|
* @param resource 要打印的资源对象
|
||||||
|
* @param out 输出流对象
|
||||||
|
*/
|
||||||
|
private fun printResource(resource: Resource, out: PrintStream) {
|
||||||
|
try {
|
||||||
|
// 使用输入流读取资源内容并输出
|
||||||
|
resource.inputStream.use { `is` ->
|
||||||
|
Scanner(`is`).useDelimiter("\\A").use { scanner ->
|
||||||
|
while (scanner.hasNext()) {
|
||||||
|
out.println(scanner.next())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (e: java.lang.Exception) {
|
||||||
|
// 异常处理:输出错误信息
|
||||||
|
out.println("Failed to print banner: " + e.message)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1 @@
|
|||||||
|
spring.application.name=forgeboot-banner-impl
|
||||||
3
forgeboot-banner/forgeboot-banner-launcher/.gitattributes
vendored
Normal file
3
forgeboot-banner/forgeboot-banner-launcher/.gitattributes
vendored
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
/gradlew text eol=lf
|
||||||
|
*.bat text eol=crlf
|
||||||
|
*.jar binary
|
||||||
40
forgeboot-banner/forgeboot-banner-launcher/.gitignore
vendored
Normal file
40
forgeboot-banner/forgeboot-banner-launcher/.gitignore
vendored
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
HELP.md
|
||||||
|
.gradle
|
||||||
|
build/
|
||||||
|
!gradle/wrapper/gradle-wrapper.jar
|
||||||
|
!**/src/main/**/build/
|
||||||
|
!**/src/test/**/build/
|
||||||
|
|
||||||
|
### STS ###
|
||||||
|
.apt_generated
|
||||||
|
.classpath
|
||||||
|
.factorypath
|
||||||
|
.project
|
||||||
|
.settings
|
||||||
|
.springBeans
|
||||||
|
.sts4-cache
|
||||||
|
bin/
|
||||||
|
!**/src/main/**/bin/
|
||||||
|
!**/src/test/**/bin/
|
||||||
|
|
||||||
|
### IntelliJ IDEA ###
|
||||||
|
.idea
|
||||||
|
*.iws
|
||||||
|
*.iml
|
||||||
|
*.ipr
|
||||||
|
out/
|
||||||
|
!**/src/main/**/out/
|
||||||
|
!**/src/test/**/out/
|
||||||
|
|
||||||
|
### NetBeans ###
|
||||||
|
/nbproject/private/
|
||||||
|
/nbbuild/
|
||||||
|
/dist/
|
||||||
|
/nbdist/
|
||||||
|
/.nb-gradle/
|
||||||
|
|
||||||
|
### VS Code ###
|
||||||
|
.vscode/
|
||||||
|
|
||||||
|
### Kotlin ###
|
||||||
|
.kotlin
|
||||||
@ -0,0 +1,8 @@
|
|||||||
|
|
||||||
|
dependencies {
|
||||||
|
compileOnly(platform(libs.springBootDependencies.bom))
|
||||||
|
compileOnly(libs.springBootStarter.web)
|
||||||
|
compileOnly(project(Modules.Banner.IMPL))
|
||||||
|
compileOnly(project(Modules.Banner.API))
|
||||||
|
implementation(project(Modules.Core.EXTENSION))
|
||||||
|
}
|
||||||
@ -0,0 +1,34 @@
|
|||||||
|
package com.gewuyou.forgeboot.banner.launcher
|
||||||
|
|
||||||
|
import com.gewuyou.forgeboot.banner.api.config.entities.BannerProperties
|
||||||
|
import com.gewuyou.forgeboot.banner.impl.ConfigurableBannerProvider
|
||||||
|
import org.springframework.boot.Banner
|
||||||
|
import org.springframework.boot.builder.SpringApplicationBuilder
|
||||||
|
import org.springframework.boot.context.properties.bind.Binder
|
||||||
|
import org.springframework.core.env.StandardEnvironment
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 使用Forge横幅运行Spring应用的函数
|
||||||
|
* 该函数主要用于简化Spring应用的启动过程,特别是当需要自定义横幅时
|
||||||
|
* 它通过反射启动一个Spring应用,并允许开发者在启动时自定义横幅
|
||||||
|
*
|
||||||
|
* @param T Spring应用的主类类型,必须是Any的子类
|
||||||
|
* @param args 命令行参数,传递给Spring应用
|
||||||
|
*/
|
||||||
|
inline fun <reified T : Any> runApplicationWithForgeBanner(vararg args: String) {
|
||||||
|
// 创建并配置Spring应用的环境
|
||||||
|
val env = StandardEnvironment()
|
||||||
|
// 获取配置属性绑定器
|
||||||
|
val binder = Binder.get(env)
|
||||||
|
// 从配置中绑定BannerProperties属性,如果没有找到,则使用默认值
|
||||||
|
val props = binder.bind("banner", BannerProperties::class.java).orElse(BannerProperties())
|
||||||
|
// 创建一个自定义的Banner实例
|
||||||
|
val banner = Banner { _, _, out -> ConfigurableBannerProvider(props).printBanner(out) }
|
||||||
|
// 构建并运行Spring应用
|
||||||
|
SpringApplicationBuilder()
|
||||||
|
.sources(T::class.java)
|
||||||
|
.banner(banner)
|
||||||
|
.environment(env)
|
||||||
|
.run(*args)
|
||||||
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user