我可以告诉我的bean不要注入到某个库/类吗?

问题描述 投票:0回答:1

我正在使用一个外部库,其中有

@Inject 
private Optional<DataSource> dataSource;

我非常想留空。

在我的服务中,我有 2 个数据源(读写和只读)。当我运行程序时,出现错误:

Message: Multiple possible bean candidates found: [javax.sql.DataSource, javax.sql.DataSource]

因为它不知道要使用哪个DataSource。我怎样才能告诉它两者都不使用?

这是我的数据源 Beans

@Factory
public class DataSourceFactory {

    @Singleton
    @Named("read-only")
    public DataSource dataSource(ReadOnlyDataSourceConfig config) {
        HikariConfig hikariConfig = new HikariConfig();
        hikariConfig.setJdbcUrl(config.getUrl());
        hikariConfig.setUsername(config.getUsername());
        hikariConfig.setPassword(config.getPassword());
        hikariConfig.setDriverClassName(config.getDriverClassName());
        return new HikariDataSource(hikariConfig);
    }

    @Singleton
    @Named("read-and-write")
    public DataSource dataSource(ReadAndWriteDataSourceConfig config) {
        HikariConfig hikariConfig = new HikariConfig();
        hikariConfig.setJdbcUrl(config.getUrl());
        hikariConfig.setUsername(config.getUsername());
        hikariConfig.setPassword(config.getPassword());
        hikariConfig.setDriverClassName(config.getDriverClassName());
        return new HikariDataSource(hikariConfig);
    }

}

是否可以配置我的 DataSource Bean 以防止注入外部库、特定类或包?

我尝试使用@Named,但这似乎没有什么区别

dependency-injection javabeans micronaut
1个回答
0
投票

那个

@Inject 
private Optional<DataSource> dataSource;

很可能位于用

@Singleton
@Context
注释的类中。现在我们将其命名为
ClassWithInject
。如果我们可以从上下文中删除此类,问题就应该得到解决。

一种方法可能是实现一个空类来替换

ClassWithInject

@Singleton
@Replaces(ClassWithInject.class)
public class ReplacementForClassWithInject {
}

正确的方法是使用 ApplicationContextBuilder,如 yawkat 在 this issues 中提到的那样,但由于只需要删除一个 bean,因此很容易使用上述方法。

如果

ClassWithInject
无法从上下文中删除,您必须使用正确的数据源自行配置并将其放入上下文中。

@Factory
public class ClassWithInjectFactory {

    @Singleton
    @Replaces(ClassWithInject.class)
    public ClassWithInject buildClassWithInject(@Named("read-only") HikariDataSource dataSource) {
        // configure and return ClassWithInject instance
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.