说我有两个JdbcTemplates
,一个用于" employee_database"和#34; customer_database"。假设一个类EmployeeDAO
要求前者作为构造函数依赖,而CustomerDAO
需要后者。如果我自己写这些课程,我就
public class EmployeeDAO {
public EmployeeDAO(@Named("employee") JdbcTemplate employeeJdbcTemplate)
和
bind(JdbcTemplate.class).annotatedWith(Names.named("employee")).toInstance(employeeJdbcTemplateInstance);
同样适用于CustomerDAO
但我无法修改EmployeeDAO
以将Named
注释添加到构造函数参数中。
确保DAO对象在这种情况下获取各自的JdbcTemplates而不必自己实例化的规范方法是什么?
答案 0 :(得分:3)
从某种意义上说,这与"robot legs problem"类似,因为您正在尝试创建类似但稍微不同的对象树。在同名问题中,您正在使用可重复使用的Leg对象,该对象根据需要接收@Left Foot和@Right Foot;在这个问题中,您同样根据外部对象(DAO)的上下文改变内部对象(JdbcTemplate)的绑定。
“廉价方式”是使用@Provides
methods,如果您的消费者DAO具有很少的依赖性且不太可能经常更改,这是一种特别低成本的解决方案。当然,创建一个完整的Provider也会起作用,但是这种语法在大多数情况下都能正常工作。
public class YourModule extends AbstractModule {
@Override public void configure() {}
@Provides EmployeeDao createEmployeeDao( // Name doesn't matter.
@Named("employeeJdbcTemplate") JdbcTemplate employeeTemplate,
Dep2 dep2,
Provider<Dep3> dep3Provider) {
return new EmployeeDao(employeeTemplate, dep2, dep3Provider);
}
}
如果dep列表很长,deps经常更改,或者多个类依赖于JdbcTemplate,那么private modules可能就是这样。
install(new PrivateModule() {
@Override public void configure() {
bind(JdbcTemplate.class).toInstance(employeeJdbcTemplate);
expose(EmployeeDao.class);
}
});
上面的示例使用匿名内部类,但您也可以创建一个接受JdbcTemplate实例和DAO类文字的命名类(顶级或嵌套),并像这样调用它:
install(new DaoModule(employeeTemplate, EmployeeDao.class));
install(new DaoModule(customerTemplate, CustomerDao.class));