SpringJdbcDaoSupport的注入問題JdbcTemple
http://www.mkyong.com/spring/spring-jdbctemplate-jdbcdaosupport-examples/
http://stackoverflow.com/questions/4762229/spring-ldap-invoking-setter-methods-in-beans-configuration
Spring JdbcDaoSupport 的使用非常簡單,粗看沒什麼可疑的:
1.讓Dao extends JdbcDaoSupport :
public class JdbcCustomerDAO extends JdbcDaoSupport implements CustomerDAO
{
//no need to set datasource here
public void insert(Customer customer){
String sql = "INSERT INTO CUSTOMER " +
"(CUST_ID, NAME, AGE) VALUES (?, ?, ?)";
getJdbcTemplate().update(sql, new Object[] { customer.getCustId(),
customer.getName(),customer.getAge()
});
}
2.配置好資料來源。這裡是直接配置了,開發中可通過JNDI從Tomcat獲取:
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://localhost:3306/mkyongjava" /> <property name="username" value="root" /> <property name="password" value="password" /> </bean>
3.引用資料來源並注入:
<bean id="customerDAO" class="com.mkyong.customer.dao.impl.JdbcCustomerDAO"> <property name="dataSource" ref="dataSource" /> </bean>
但是,檢視JdbcDaoSupport原始碼會發現,JdbcDaoSupport並沒有dataSource這個欄位,它唯一的欄位是:
private JdbcTemplate jdbcTemplate;
那麼dataSource是怎麼注入到JdbcDaoSupport的呢?
原來,Spring注入時是根據property而不是field
檢視Spring的原始碼就會發現,Spring先解析bean.xml並儲存好property,然後通過反射呼叫property在類中對應的writeMethod(也就是set方法),把bean.xml中配置的值賦給bean;而不是反過來
例如你給customerDAO 配置了:
<property name=”dataSource” ref=”dataSource” />
那麼Spring就會到customerDAO 裡面找setDataSource這個方法並呼叫,而不管有沒有這個欄位
JdbcDaoSupport的setDataSource方法:
public final void setDataSource(DataSource dataSource) {
if (this.jdbcTemplate == null || dataSource != this.jdbcTemplate.getDataSource()) {
this.jdbcTemplate = createJdbcTemplate(dataSource);
initTemplateConfig();
}
}
protected JdbcTemplate createJdbcTemplate(DataSource dataSource) {
return new JdbcTemplate(dataSource);
}
在這裡,是直接通過new來建立一個 JdbcTemplate
有了JdbcTemplate,資料庫的操作就沒問題了
說到Spring的DataSource,我用jadclipse反編譯檢視某公司框架時,發現框架類似以下程式碼:
public abstract class JdbcBaseDao extends JdbcDaoSupport {
public void setDatasource(DataSource dataSource) {
setDataSource(dataSource);
}
}
在beans.xml裡面配置依賴注入的時候,採用了auto-scan:
<jee:jndi-lookup id="dataSource" jndi-name="jdbc/jdbcname_ljn" resource-ref="true"/> <context:component-scan base-package="com.ljn.spring" use-default-filters="false"> <context:include-filter type="regex" expression="com.ljn.spring..*"/> </context:component-scan>
並沒有像文章開頭那樣,顯式地把DataSource注入到Dao當中,但框架執行正常
dataSource是怎麼注入到Dao的呢?百思不得其解
後來用jd-gui.exe反編譯時,才發現在setDatasource方法上面還有一個註解:
@Resource(name=”dataSource”)
水落石出。。
下面說說java bean中property的定義,
測試程式碼:
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Field;
public class PropertyTest {
public static void main(String[] args) throws IntrospectionException {
PropertyDescriptor[] descriptors =
Introspector.getBeanInfo(Dummy.class, Object.class).getPropertyDescriptors();
for (PropertyDescriptor descriptor : descriptors) {
System.out.println(
"Property: " + descriptor.getName() +
", type: " + descriptor.getPropertyType());
}
Field[] fields = Dummy.class.getDeclaredFields();
for (Field field : fields) {
System.out.println(
"Field: " + field.getName() +
", type: " + field.getType());
}
}
}
class Dummy {
@SuppressWarnings("unused")
private String name;
public long getLength() {
return 1L;
}
public int getSeqid(long j) {
return 1;
}
public void setAge(int age) {
// empty
}
public void setSize() {
// empty
}
}
/*
以上程式輸出:
Property: age, type: int
Property: length, type: long
Field: name, type: class java.lang.String
由此可見
1.沒有getter也沒有setter的field並不認為是一個property
2.符合標準的getter或者setter,則認為是一個property
符合標準的getter:形如“<type> getYzz(){...}”,則property為yzz,property的type就是方法返回值的type,注意方法不能有引數
符合標準的setter:形如“void setYzz(<type> param){...}”property為yzz,property的type就是方法引數的type,注意方法必須有引數
上面程式中,getSeqid以及setSize都不是標準的getter/setter,因此不是一個property
*/
相關文章
- ibatis Order By注入問題BAT
- 再看ibatis Order By注入問題BAT
- 遠端執行緒注入引出的問題執行緒
- 對於Spring中注入物件失敗的問題Spring物件
- 監聽器中spring注入相關的問題Spring
- 如何解決sql注入安全漏洞問題SQL
- Action注入屬性值、字尾以及常量問題
- 解決Spring中singleton中注入prototype Bean的問題SpringBean
- php注入專題PHP
- 這幾個關於Spring 依賴注入的問題你清楚嗎?Spring依賴注入
- 程式碼注入之遠端呼叫執行緒的一些問題執行緒
- SpringBoot攔截器中service或者redis注入為空的問題Spring BootRedis
- Aop踩坑!記一次模板類呼叫注入屬性為空的問題
- Spring短生命週期bean注入長生命週期bean問題SpringBean
- SpringBoot學習——@Autowired自動注入報:could not be found問題的理解和解決方案Spring Boot
- 關於SpringBoot bean無法注入的問題(與檔案包位置有關)Spring BootBean
- 關於專案中NServiceBus和MEF注入(WCF服務代理失效)的兩個問題
- 學完這篇依賴注入,與面試官扯皮就沒有問題了。依賴注入面試
- 連表操作、子查詢、pymysql 模組、sql注入問題(感覺已沒有)MySql
- 在SpringMVCController中注入HttpServletRequest物件會不會造成執行緒安全的問題SpringMVCControllerHTTPServlet物件執行緒
- Angular Component 延遲載入 Lazy Load 的一個依賴注入的問題以及解決方案Angular依賴注入
- spingboot使用@Resource注入靜態變數報空指標的問題解決boot變數指標
- Spring注入:配置注入(set注入和構造器注入)與註解注入Spring
- 《扶蘇的問題》題解
- 一個非技術問題的問題
- Spring的問題,還是Tomcat的問題SpringTomcat
- 專案啟動報錯怎麼辦?看看你Spring自動注入用對了嘛?@Autowired XxxService注入問題解決Spring
- 使用DLL注入繞過“受控制的資料夾訪問”功能
- SQL 注入:聯合注入SQL
- sql注入之union注入SQL
- 程式注入之DLL注入
- iptables的問題
- sqlldr的問題SQL
- ServerSocket的問題Server
- 問題的核心
- jbuilderx的問題!!!UI
- localhost的問題???localhost
- Bitmap的問題