【问题标题】:Spring: How to pass configuration from application to librarySpring:如何将配置从应用程序传递到库
【发布时间】:2019-12-20 16:31:00
【问题描述】:

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

我查看了@Imports,但是,我认为这要求要导入的类位于同一个包中,但情况并非如此,因为应用程序将是与库完全不同的包。有没有办法只使用名称来搜索应用程序配置类?

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

这是我的配置类,应该能够接受应用程序的配置

@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();
    }
}

【问题讨论】:

    标签: java spring spring-data-jpa spring-annotations


    【解决方案1】:

    通过

    从你的库中引入配置、服务、repo ...的包
    @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

    【讨论】:

    • 哦,太好了!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多