单例与原型 JdbcTemplate

问题描述 投票:0回答:2

根据 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;
        }
    
    }
spring jdbc singleton spring-jdbc
2个回答
5
投票

来自JdbcTemplate的类级文档:

可以通过直接实例化在服务实现中使用 使用数据源参考,或在应用程序上下文中做好准备 并作为 bean 参考提供给服务。

两者都可以。这里我有一个大型应用程序(50 个 DAO,100 个并发用户),整个应用程序有一个 jdbcTemplate 对象,在 Spring 上下文中定义。这很好用。


2
投票

直接注入

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
运行,即使看起来没有翻译者注册。

© www.soinside.com 2019 - 2024. All rights reserved.