如何配置Guice以要求对整个应用程序(对于所有模块)进行显式绑定

时间:2019-01-07 10:37:19

标签: guice

为了在Guice中使用“显式”绑定,我可以在模块实现中调用package com.example.webapp.db; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import org.apache.tomcat.jdbc.pool.DataSource; import org.apache.tomcat.jdbc.pool.PoolProperties; public class DatabaseManager { // not final anymore and null as default private static DatabaseManager instance = null; private DatabaseManager() { PoolProperties p = new PoolProperties(); p.setUrl("jdbc:oracle:thin:@localhost:1521:xe"); p.setDriverClassName("oracle.jdbc.driver.OracleDriver"); p.setUsername("scott"); p.setPassword("tiger"); p.setJmxEnabled(true); p.setTestWhileIdle(false); p.setTestOnBorrow(true); p.setValidationQuery("SELECT 1"); p.setTestOnReturn(false); p.setValidationInterval(30000); p.setTimeBetweenEvictionRunsMillis(30000); p.setMaxActive(100); p.setInitialSize(10); p.setMaxWait(10000); p.setRemoveAbandonedTimeout(60); p.setMinEvictableIdleTimeMillis(30000); p.setMinIdle(10); p.setLogAbandoned(true); p.setRemoveAbandoned(true); p.setJdbcInterceptors("org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;" + "org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer"); javax.sql.DataSource datasource = new DataSource(); datasource.setPoolProperties(p); // use a try-with resource to get rid of the finally block... try (Connection con = datasource.getConnection()) { Statement st = con.createStatement(); ResultSet rs = st.executeQuery("select * from user"); int cnt = 1; while (rs.next()) { System.out.println((cnt++) + ". Host:" + rs.getString("Host") + " User:" + rs.getString("User") + " Password:" + rs.getString("Password")); } rs.close(); st.close(); // ... and handle the exception } catch (SQLException e) { System.err.println("SQLException while constructing the instance of DatabaseManager"); e.printStackTrace(); } } public static DatabaseManager getInstance() { // check for null here: if (instance == null) { instance = new DatabaseManager(); } return instance; } } ,例如

binder().requireExplicitBindings()

关于Guice API,它看起来像我需要在我的应用程序模块的所有实现中那样做。

是否没有办法在整个应用程序的一个地方配置此

我正在使用Guice 4.2.x

1 个答案:

答案 0 :(得分:3)

诸如requireExplicitBindings()之类的活页夹配置选项在使用Binder的任何地方都是全局的。因此,除非您对Guice SPI做一些不寻常的事情,否则它适用于构成同一Injector一部分的所有绑定。

最佳做法是每个应用程序只有一个Injector,因此Binder选项已经是有效的全局选项。

就其价值而言,我认为requireExplicitBindings()实在是太过分了。 requireAtInjectOnConstructors()之类的东西解决了隐式绑定中最严重的问题,同时仍然允许基于带注释的构造函数的JSR-330依赖项注入,这可能是一个非常方便的功能。