Spring 中静态 JdbcTemplate 的替代方案
Alternative to static JdbcTemplate in Spring
我在 Spring 中实现了抽象 DAO 工厂。
我有两个自动装配方法如下:
private DataSource dataSource;
private JdbcTemplate jdbcTemplate;
@Autowired
public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
@Autowired
public void setDataSource(DataSource dataSource) {
this.dataSource = dataSource;
}
一开始,jdbcTemplate 和 dataSource 在其中获得了正确的值。但是当我使用写有上述方法的 new 关键字调用 class 的构造函数时,jdbcTemplate 和 dataSource 被设置为 NULL。
但是如果我将它们声明为静态的,那么之前正确的值将被保留。
我想知道如果我想保留以上两个的以前的值,是否有替代 spring 中的 static 的方法?
您应该在 class 之上添加 @Component 以获取 dataSource 和 jdbcTemplate 的对象值。您不应该使用 class 的 new 关键字来获取自动装配的引用。
以下代码可能对您的问题有所帮助。
import javax.sql.DataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
@Configuration
@ComponentScan("com.ledara.demo")
public class ApplicationConfig {
@Bean
public DataSource getDataSource() {
DriverManagerDataSource dmds = new DriverManagerDataSource();
dmds.setDriverClassName("com.mysql.jdbc.Driver");
dmds.setUrl("yourdburl");
dmds.setUsername("yourdbusername");
dmds.setPassword("yourpassword");
return dmds;
}
@Bean
public JdbcTemplate getJdbcTemplate() {
JdbcTemplate jdbcTemplate = new JdbcTemplate(getDataSource());
return jdbcTemplate;
}
}
及以下 class 具有 jdbcTemplate 和 dataSource 的自动装配字段
import javax.sql.DataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;
@Component
public class SampleInfo{
@Autowired(required=true)
DataSource getDataSource;
@Autowired(required=true)
JdbcTemplate getJdbcTemplate;
public void callInfo() {
System.out.println(getDataSource);
System.out.println(getJdbcTemplate);
}
}
下面是主要内容class
public class MainInfo {
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
context.register(ApplicationConfig.class);
context.refresh();
SampleInfo si=context.getBean(SampleInfo.class);
si.callInfo();
}
}
我在 Spring 中实现了抽象 DAO 工厂。
我有两个自动装配方法如下:
private DataSource dataSource;
private JdbcTemplate jdbcTemplate;
@Autowired
public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
@Autowired
public void setDataSource(DataSource dataSource) {
this.dataSource = dataSource;
}
一开始,jdbcTemplate 和 dataSource 在其中获得了正确的值。但是当我使用写有上述方法的 new 关键字调用 class 的构造函数时,jdbcTemplate 和 dataSource 被设置为 NULL。
但是如果我将它们声明为静态的,那么之前正确的值将被保留。
我想知道如果我想保留以上两个的以前的值,是否有替代 spring 中的 static 的方法?
您应该在 class 之上添加 @Component 以获取 dataSource 和 jdbcTemplate 的对象值。您不应该使用 class 的 new 关键字来获取自动装配的引用。
以下代码可能对您的问题有所帮助。
import javax.sql.DataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
@Configuration
@ComponentScan("com.ledara.demo")
public class ApplicationConfig {
@Bean
public DataSource getDataSource() {
DriverManagerDataSource dmds = new DriverManagerDataSource();
dmds.setDriverClassName("com.mysql.jdbc.Driver");
dmds.setUrl("yourdburl");
dmds.setUsername("yourdbusername");
dmds.setPassword("yourpassword");
return dmds;
}
@Bean
public JdbcTemplate getJdbcTemplate() {
JdbcTemplate jdbcTemplate = new JdbcTemplate(getDataSource());
return jdbcTemplate;
}
}
及以下 class 具有 jdbcTemplate 和 dataSource 的自动装配字段
import javax.sql.DataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;
@Component
public class SampleInfo{
@Autowired(required=true)
DataSource getDataSource;
@Autowired(required=true)
JdbcTemplate getJdbcTemplate;
public void callInfo() {
System.out.println(getDataSource);
System.out.println(getJdbcTemplate);
}
}
下面是主要内容class
public class MainInfo {
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
context.register(ApplicationConfig.class);
context.refresh();
SampleInfo si=context.getBean(SampleInfo.class);
si.callInfo();
}
}