Java创建JDBCTemplate Singleton Bean而无需编写DataSource

vxf3dgd4  于 2023-11-15  发布在  Java
关注(0)|答案(3)|浏览(106)

bounty将在2天内过期。回答此问题可获得+50声望奖励。mattsmith5正在寻找来自信誉良好的来源的**答案 *。

我试图使JdbcTemplate成为一个Singleton Bean,而不是在多个存储库中调用它。
在当前的代码库中,我甚至不需要编写DataSource配置。
对于我的新代码单例配置Bean尝试,是否有一种方法可以设置JDBCTemplate,而无需通过DataSource配置?

当前编码:

@Repository
public class CustomerRepositoryImpl implements CustomerRepository {

    private NamedParameterJdbcTemplate namedParameterJdbcTemplate;

    @Autowired
    public CustomerRepositoryImpl(NamedParameterJdbcTemplate namedParameterJdbcTemplate) {
        this.namedParameterJdbcTemplate = namedParameterJdbcTemplate;
    }

}

字符串
它将使用application.properties文件自动读取DataSource

spring.datasource.url= jdbc:sqlserver://localhost;encrypt=true;databaseName=Test
spring.datasource.username= sauser
spring.datasource.password= sauserpw

新代码尝试:

@Configuration
public class DatabaseConfig {
    
    @Bean
    public NamedParameterJdbcTemplate namedParameterJdbcTemplate(DataSource dataSource)
    {
        return new NamedParameterJdbcTemplate(dataSource);
    }
}

// trying to prevent writing this code in for Datasource if possible, and importing a new maven package com.microsoft.sqlserver.jdbc.SQLServerDataSource;

SQLServerDataSource dataSource = new SQLServerDataSource();
dataSource.setUser("sauser");
dataSource.setPassword("sauserpw");
dataSource.setServerName("localhost");
dataSource.setDatabaseName("Test");

@Repository
public class CustomerRepositoryImpl implements CustomerRepository {

    private NamedParameterJdbcTemplate namedParameterJdbcTemplate;

    @Autowired
    public CustomerRepositoryImpl(DatabaseConfig databaseConfig) {
        this.namedParameterJdbcTemplate = databaseConfig.namedParameterJdbcTemplate();


注意:没有错误,试图减少代码库并简化它

ohtdti5x

ohtdti5x1#

你为什么要创建DatabaseConfig呢?我手头没有源代码,但你现在的代码是工作的,你得到了一个jdbc-Template注入,它是由autocobfiguration创建的(作为一个单例)。
自动配置是以一种方式实现的,当满足某些条件时,它会退出,以便不干扰手动配置。
很有可能,通过自己创建jdbctemplate,jdbctemplate配置会退出。
你可以通过在调试模式下启动spring Boot 来检查这一点。你可以在那里看到选择了哪些自动配置,哪些被省略了,以及为什么。
如果你仍然想创建自己的jdbctemplate,你可以像spring Boot 一样创建jdbctemplate。在这种情况下,我看一下相应的spring Boot 源代码。例如,数据库属性加载在DatabaseProperties bean中。
顺便说一句,你的新Repository代码是不必要的复杂。如果你有一个Configuration类,它创建了一个bean,那么默认情况下它是一个单例。如果你自动连接那个bean,你会得到单例注入。注入配置类和调用bean方法使它变得不必要的复杂。我建议你使用调试器,并在执行过程中检查对象id,看看它是如何工作的。

bbuxkriu

bbuxkriu2#

尝试导入spring-boot-autoconfigure包,该包将具有autowired配置文件到spring中的能力。这样您就可以使用带有上面autowired注解的JdbcTemplate

eulz3vhy

eulz3vhy3#

您可以直接使用JdbcTemplate并将其作为bean注入,spring将自动处理一切。由于在您的情况下,您只需要连接单个数据源,提到强制依赖项和相关属性,将JdbcTemplate声明为bean将解决所有问题。

import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.jdbc.core.JdbcTemplate;
 import javax.sql.DataSource;

 @Configuration
 public class JdbcTemplateConfig {

    @Bean
    public JdbcTemplate jdbcTemplate(DataSource dataSource) {
       return new JdbcTemplate(dataSource);
    }
 }

字符串
这将是你的JdbcConfig。注意:你不需要JdbcConfig类,你可以直接在你的应用程序的配置中初始化JdbcTemplate bean。
在项目中包含spring-boot-starter-data-jpa依赖项。
您可以通过以下方式在存储库中使用此bean。

import org.springframework.beans.factory.annotation.Autowired;
   import org.springframework.jdbc.core.JdbcTemplate;
   import org.springframework.stereotype.Repository;

   @Repository
   public class YourRepository {

   private final JdbcTemplate jdbcTemplate;

   @Autowired
   public YourRepository(JdbcTemplate jdbcTemplate) {
      this.jdbcTemplate = jdbcTemplate;
   }

   public String fetchData() {

    String sql = "SELECT your_column FROM your_table WHERE some_condition";
    return jdbcTemplate.queryForObject(sql, String.class);
   }
}


希望这能解决你的问题。

相关问题