Spring: 如何将配置从应用程序传递到库

Spring: How to pass configuration from application to library

我正在构建一个 Spring 包,任何 Spring 应用程序都可以使用它来执行会话管理(很像 NodeJS 中的快速会话)。这个库需要接受应用程序的 JPA 配置(例如 url 数据库、用户名、密码和其他额外的数据源属性,就像 express-session 一样),以及一些其他特定于库的属性。我还希望应用程序能够将函数传递给库,如果应用程序希望使用自己的令牌生成函数,库可以调用该函数来生成令牌。

我查看了@Imports,但是,我认为这需要将要导入的 class 放在同一个包中,但情况并非如此,因为应用程序将完全不同包比图书馆。有没有一种方法可以仅使用其名称来搜索应用程序配置 class?

我知道我可以要求应用程序制作一个 application.properties 文件,然后使用 @EnableAutoConfiguration 来传递这些值,但是当我还想传递一个函数时,这会失败。我想解决这个问题的方法是传递一个函数名并使用反射调用它?虽然我不确定这将如何工作,但我不想那样做。

这是我的配置 class 它应该能够接受应用程序的配置

@Configuration
public class SuperTokensAppConfig {

    @Bean
    public DataSource dataSource() {
        // use the application's datasource here and return it
    }

这是具有所有必要的特定于库的属性和函数的接口。应用程序应该能够扩展它,我应该能够使用这个接口的名称自动装配那个 bean(见下文)

public interface SuperTokensAccessKeyConfig {
    public String userFunction();
    public boolean dynamic;
    ... 
}

这是将使用用户生成的函数的服务

@Service
public class AccessTokenKey {
    ...
    @Autowired
    private SuperTokensAccessKeyConfig userConfig = null; // this would have the function I need

    private String useUserFunction() {
        return userConfig.userFunction();
    }
}

通过

从您的库中引入配置、服务、回购包...
@ComponentScan({"com.my.package.first","com.library.session.management.config"})

在您的主应用程序中。

不过,更好的解决方案是创建您自己的自动配置:https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-developing-auto-configuration.html