gpt4 book ai didi

java - SparkJava JOOQ 使用 Guice 进行依赖注入(inject)

转载 作者:行者123 更新时间:2023-12-01 19:35:07 25 4
gpt4 key购买 nike

我正在编写简单的CRUD应用程序,它将从数据库获取人员记录,并且我正在使用SparkJava框架我有可以获取的工作代码来自数据库的记录,但我想提取JOOQDSLContext代码并将其作为bean注入(inject)并在另一个类中初始化它以获得更多更干净的代码,但我不确定如何实现它,这里的主要方法当前包含所有内容:

 public static void main(String[] args) throws IOException {
final BasicDataSource ds = new BasicDataSource();
final Properties properties = new Properties();
properties.load(BankApiApplication.class.getResourceAsStream("/application.properties"));
ds.setDriverClassName(properties.getProperty("db.driver"));
ds.setUrl(properties.getProperty("db.url"));
ds.setUsername(properties.getProperty("db.username"));
ds.setPassword(properties.getProperty("db.password"));

final ConnectionProvider cp = new DataSourceConnectionProvider(ds);
final Configuration configuration = new DefaultConfiguration()
.set(cp)
.set(SQLDialect.H2)
.set(new ThreadLocalTransactionProvider(cp, true));
final DSLContext ctx = DSL.using(configuration);
final JSONFormat format = new JSONFormat().format(true).header(false).recordFormat(JSONFormat.RecordFormat.OBJECT);

port(8080);

get("/persons", (request, response) -> {
return ctx.select().from(Person.PERSON).fetch().formatJSON();
});
}

我如何提取初始化Datasource并配置DSLContext的代码,而我可以只注入(inject)DSLContext或某种DSLContextHolder 并进行查询?

最佳答案

因此,一般来说,您希望注入(inject)可以注入(inject)的最高级别的对象。这与the Law of Demeter有关,简而言之,组件可以了解其直接依赖项,但它不应该了解这些依赖项的依赖项。

就您而言,您实际上只使用了DSLContext (ctx)。 [此处注意:您的代码有很多两个字母的名称 - 很难理解。如果你写出例如,会更容易ctx -> dslContextcp -> connectionProvider]。这意味着您实际上只希望您的方法了解 DSLContext,而不是其依赖项。因此,最好将以下内容提取到模块中,然后注入(inject) DSLContext:

  1. 配置
  2. ConnectionProvider
  3. 属性
  4. 基本数据源

如果所有这些东西只在这个main()中使用,您可以编写一个Provider来返回一个DSLContext。如果其中一些在多个地方使用(不仅仅是实例化此 main()DSLContext),那么它们可以进入自己的 Providers.例如,如果将 Configuration 放置在其自己的 Provider 中,则 DSLContextProvider 将如下所示:

public class MyModule extends AbstractModule {

// other providers
// ...

@Provides
@Singleton
public DSLContext dslContext(Configuration configuration) {
return SL.using(configuration);
}
}

然后,在您的 main() 中,您将编写:

Injector injector = Guice.createInjector(yourModule());
DSLContext myContext = injector.getInstance(DSLContext.class);

// ... use it

关于java - SparkJava JOOQ 使用 Guice 进行依赖注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59228981/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com