使用 Guice 进行 SparkJava JOOQ 依赖注入
SparkJava JOOQ dependency injection with Guice
我正在编写简单的 CRUD 应用程序,它会从 数据库 中获取个人记录,我正在使用 SparkJava 框架我有从 数据库 获取记录的工作代码,但我想提取 JOOQ DSLContext 代码并将其作为 bean 注入并在另一个 class 中初始化它以获得更清晰的代码,但我不确定如何实现它这是目前包含所有内容的主要方法:
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
,而不是它的依赖项。因此,最好将以下内容拉出到模块中,然后注入 just a DSLContext
:
Configuration
ConnectionProvider
Properties
BasicDataSource
如果所有这些东西都只用在这个main()
中,你可以写一个Provider
到return一个DSLContext
。如果其中一些在多个地方使用(不仅仅是为了实例化这个 main()
的 DSLContext
),那么它们可以放在自己的 Provider
中。例如,如果 Configuration
放在它自己的 Provider
:
中,DSLContext
的 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
我正在编写简单的 CRUD 应用程序,它会从 数据库 中获取个人记录,我正在使用 SparkJava 框架我有从 数据库 获取记录的工作代码,但我想提取 JOOQ DSLContext 代码并将其作为 bean 注入并在另一个 class 中初始化它以获得更清晰的代码,但我不确定如何实现它这是目前包含所有内容的主要方法:
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
,而不是它的依赖项。因此,最好将以下内容拉出到模块中,然后注入 just a DSLContext
:
Configuration
ConnectionProvider
Properties
BasicDataSource
如果所有这些东西都只用在这个main()
中,你可以写一个Provider
到return一个DSLContext
。如果其中一些在多个地方使用(不仅仅是为了实例化这个 main()
的 DSLContext
),那么它们可以放在自己的 Provider
中。例如,如果 Configuration
放在它自己的 Provider
:
DSLContext
的 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