我正在编写简单的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();
});
}
我如何提取用于初始化Datasource并配置DSLContext的代码,而只能注入DSLContext或某种DSLContextHolder并进行查询?
最佳答案
因此,通常,您希望注入尽可能高级别的对象。这与the Law of Demeter有关,简而言之就是组件可以知道其直接依赖关系,但不应该知道这些依赖关系的依赖关系。
就您而言,您实际上仅使用DSLContext
(ctx
)。 [这里的注释:您的代码有很多两个字母的名称-很难遵循。如果您写出例如ctx -> dslContext
,cp -> connectionProvider
]。这意味着您实际上只希望您的方法了解DSLContext
,而不是其依赖项。因此,最好将以下内容放入模块,然后仅注入DSLContext
:Configuration
ConnectionProvider
Properties
BasicDataSource
如果所有这些仅在此main()
中使用,则可以编写单个Provider
以返回DSLContext
。如果其中一些在多个地方使用(除了实例化此main()
的DSLContext
),那么它们可以放在自己的Provider
中。例如,如果将Provider
放在其自己的DSLContext
中,则Configuration
的Provider
看起来会像这样:
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