最近面試屢次被虐,不是自己不思進取,是不會總結,不會理清思路,以至於過不了多久就忘記關了,面試官隨便問問傻眼,雖然有些東西是鋪天蓋地的多,但是從自己的腦子裡出來的才是自己的,於是乎還是寫下。
下面就寫下spring mvc下開發的配置,因為弄了好幾天沒出來,說了確實丟人,
這裡只是jdbc整合的部分,也是一直出錯的部分,mvc的配置哪天我在黏上來
不知道為什麼,在spring 3 裡面注入
jdbcTemplate時候我在設定檔裡引用dataSource熟悉老是報錯,說我的property datasource is required.
我用的是spring 3.0.5,我查了好多資料,別人的這麼配也是可以的。
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"></property>
</bean>
dao:
package com.hmn.dao.manager;<br />import javax.annotation.Resource;<br />import javax.sql.DataSource;<br />import org.springframework.jdbc.core.JdbcTemplate;<br />import org.springframework.stereotype.Repository;<br />import com.hmn.dao.entity.User;<br />@Repository<br />public class UserDao extends JdbcTemplate {<br />@Resource<br />private JdbcTemplate jdbcTemplate;<br />public User getUserById(int id) {<br />User user = (User) jdbcTemplate.queryForObject(<br />"select * from user where id=?", new Object[] { id },<br />new UserRowMapper());<br />return user;<br />}<br />}<br />
但是我這卻一直報這個錯,不知道是不是在高版本裡改了實現還是怎麼說,後來我看一個spring視頻的時候得到啟示,
加了下面兩個地方
@Resource<br />private DataSource dataSource;<br />//public void setDataSource(DataSource dataSource) {<br />//this.jdbcTemplate = new JdbcTemplate(dataSource);<br />//}<br />/**<br /> * @author hoot<br /> * @return DataSource<br /> *<br /> * 可以不用setter,但是必須有getter,<br /> * 因為下面要給jdbcTemplate注入值<br /> */<br />public DataSource getDataSource() {<br />return this.dataSource;<br />}<br />
jdbcTemplate要從dataSource裡擷取串連等資訊是必然的,但是我就不明白為什麼前面的版本可以這麼寫
現在的卻為何不行。在UserDao裡面配置dataSource的get方法就可以給jdbcTemplate注入dataSource.
public JdbcTemplate(DataSource dataSource) {<br />setDataSource(dataSource);<br />afterPropertiesSet();<br />}
上面這是jdbcTemplate源碼裡的建構函式,從上面可以看出,DataSource是從這裡注入的,也就是你不提供
getDataSource方法也同樣報錯的緣故,因為雖然你注入了DataSource,但是沒有提供dataSource的訪問器函數,
spring無法給你的JdbcTemplate建構函式注入參數。所以提示你,dataSource is required,那為什麼我在
jdbcTemplate的源碼裡看不到任何DataSource的屬性呢,嘿嘿,請看下面兩處你就明白了,
public class JdbcTemplate extends JdbcAccessor implements JdbcOperations {}<br />注意下面<br />public abstract class JdbcAccessor implements InitializingBean {<br />/** Logger available to subclasses */<br />protected final Log logger = LogFactory.getLog(getClass());<br />private DataSource dataSource;<br />...<br />}<br />JdbcTemplate繼承了JdbcAccessor,主義accessor裡面的DataSource屬性
現在終於明白了為什麼注入熟悉跟建構函式注入參數他都可以
package com.hmn.dao.manager;<br />import javax.annotation.Resource;<br />import javax.sql.DataSource;<br />import org.springframework.jdbc.core.JdbcTemplate;<br />import org.springframework.stereotype.Repository;<br />import com.hmn.dao.entity.User;<br />@Repository<br />public class UserDao extends JdbcTemplate {<br />@Resource<br />private JdbcTemplate jdbcTemplate;<br />@Resource<br />private DataSource dataSource;<br />//public void setDataSource(DataSource dataSource) {<br />//this.jdbcTemplate = new JdbcTemplate(dataSource);<br />//}<br />/**<br /> * @author hoot<br /> * @return DataSource<br /> *<br /> * 可以不用setter,但是必須有getter,<br /> * 因為下面要給jdbcTemplate注入值<br /> */<br />public DataSource getDataSource() {<br />return this.dataSource;<br />}<br />public User getUserById(int id) {<br />User user = (User) jdbcTemplate.queryForObject(<br />"select * from user where id=?", new Object[] { id },<br />new UserRowMapper());<br />return user;<br />}<br />}
部落格已搬到http://marspring.mobi/