为了在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
答案 0 :(得分:3)
诸如requireExplicitBindings()
之类的活页夹配置选项在使用Binder
的任何地方都是全局的。因此,除非您对Guice SPI做一些不寻常的事情,否则它适用于构成同一Injector
一部分的所有绑定。
最佳做法是每个应用程序只有一个Injector
,因此Binder
选项已经是有效的全局选项。
就其价值而言,我认为requireExplicitBindings()
实在是太过分了。 requireAtInjectOnConstructors()
之类的东西解决了隐式绑定中最严重的问题,同时仍然允许基于带注释的构造函数的JSR-330依赖项注入,这可能是一个非常方便的功能。