根据 Spring 文档,JDBCTemplate 类“可以通过使用 DataSource 引用直接实例化在服务实现中使用,或者在应用程序上下文中做好准备并作为 bean 引用提供给服务。”
public class JdbcCorporateEventDao implements CorporateEventDao {
private JdbcTemplate jdbcTemplate;
public void setDataSource(DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
}
我想知道,与在上下文中将
jdbctemplate
定义为单例并直接将其注入到 Dao
中相比,此解决方案有什么优势
public class JdbcCorporateEventDao implements CorporateEventDao {
@Autowired
private JdbcTemplate jdbcTemplate;
public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
}
来自JdbcTemplate的类级文档:
可以通过直接实例化在服务实现中使用 使用数据源参考,或在应用程序上下文中做好准备 并作为 bean 参考提供给服务。
两者都可以。这里我有一个大型应用程序(50 个 DAO,100 个并发用户),整个应用程序有一个 jdbcTemplate 对象,在 Spring 上下文中定义。这很好用。
直接注入
JdbcTemplate
的一个缺点是如果您需要/决定使用 SQLExceptionTranslator
。
如果您的
JdbcTemplate
是单例,则在任何类中设置 SQLExceptionTranslator
都会影响使用该模板的所有类。
例如...
public class JbdcUserDAO implements UserDAO{
@Autowired
private JdbcTemplate jdbcTemplate;
public JbdcUserDAO() {
this.jdbcTemplate.setExceptionTranslator(new UserSQLExceptionTranslator());
}
public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
}
并且
public class JdbcCompanyDAO implements CompanyDAO{
@Autowired
private JdbcTemplate jdbcTemplate;
public JdbcCompanyDAO() {
}
public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
}
通过 SQLException
提出的
JdbcCompanyDAO
也将通过 UserSQLExceptionTranslator
运行,即使看起来没有翻译者注册。