【问题标题】:SparkJava JOOQ dependency injection with Guice使用 Guice 的 SparkJava JOOQ 依赖注入
【发布时间】:2019-12-10 08:38:54
【问题描述】:

我正在编写简单的 CRUD 应用程序,该应用程序将从 database 获取人员记录,并且我正在使用 SparkJava 框架我有工作代码可以获取database 中的记录,但我想提取 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();
    });
}

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

【问题讨论】:

    标签: java guice jooq spark-java


    【解决方案1】:

    因此,一般来说,您希望注入您可以注入的最高级别的对象。这与the Law of Demeter 相关,简而言之,组件可以知道它的直接依赖关系,但它不应该知道这些依赖关系的依赖关系。

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

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

    如果所有这些东西都只用在这个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
    

    【讨论】:

      猜你喜欢
      • 2011-12-09
      • 1970-01-01
      • 2012-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多