繁体   English   中英

使用 Guice 进行 SparkJava JOOQ 依赖注入

[英]SparkJava JOOQ dependency injection with Guice

我写简单的CRUD应用程序,它会从数据库中获取的个人记录,我使用SparkJava框架我有工作代码,获取从数据库中的记录,但我想提取JOOQ DSLContext代码,并注入它作为一个bean,而在另一个类初始化为了获得更清晰的代码,但我不确定如何实现它,这是目前包含所有内容的主要方法:

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

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

所以,一般来说,你想注入你能注入的最高级别的对象 这与Demeter 定律有关,简而言之,组件可以知道其直接依赖项,但不应该知道这些依赖项的依赖项。

在您的情况下,您实际上只使用DSLContext ( ctx )。 [请注意:您的代码有很多由两个字母组成的名称 - 很难理解。 如果你写出例如ctx -> dslContext , cp -> connectionProvider ] 会更容易。 这意味着你真的只希望你的方法知道DSLContext ,而不是它的依赖项。 因此,最好将以下内容提取到一个模块中,然后注入一个DSLContext

  1. Configuration
  2. ConnectionProvider
  3. Properties
  4. BasicDataSource

如果所有这些东西都只在这个main() ,你可以编写一个Provider来返回一个DSLContext 如果其中一些在多个地方使用(不仅仅是实例化这个main()DSLContext ),那么它们可以进入自己的Provider 例如,如果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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM