不要將@Autowired註解用於static方法

以 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);

}

 

數據處理類

@Repository

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 方法.

相關文章
相關標籤/搜索