以 spring 讀取數據庫爲例, 配置文件spring-bean.xmlspring
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">sql
<property name="driverClassName" value="${jdbc.driverClassName}"/>數據庫
<property name="url" value="${jdbc.url}"/>app
<property name="username" value="${jdbc.username}"/>this
<property name="password" value="${jdbc.password}"/>url
</bean>.net
服務類xml
@Serviceget
public class ProductService {it
@Autowired // 這裏的注入是沒問題的
private ProductDao productDao;
public static Product getByBarCode(String barCode) {
// 注意這是一個靜態方法, 是不能使用上面productDao類變量的
ProductDao pdDao = new ProductDao();
return pdDao.getByBarCode(barCode);
}
數據處理類
public class ProductDao implements IProductDao {
private NamedParameterJdbcTemplate namedParameterJdbcTemplate;
@Autowired
public void setDataSource(DataSource dataSource) {
this.namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(dataSource);
}
public Product get(String sql, SqlParameterSource namedParameters) {
Product reObj;
try {
reObj = this.namedParameterJdbcTemplate.queryForObject(sql, namedParameters, new BeanPropertyRowMapper<Product>(Product.class));
} catch (EmptyResultDataAccessException e) {
return null;
}
}
@Autowired註解是沒法用於static方法的.間接使用可能不報錯, 但沒法取得spring注入的內容. 好比上例一個service的static方法 new 了一個 dao, 這個 dao 中感受應注入的內容就沒有被注入.
上例表現爲在setDataSource方法中, 斷點觀察namedParameterJdbcTemplate能夠取到數據, 但在get方法中namedParameterJdbcTemplate老是null.
這個錯誤比較隱蔽, 因此在spring有注入的場合應避免使用 static 方法.