對於Spring,人人都能說上來它的一些特點,也都會用個123,但是其實有很多細節,再加上每個公司的使用習慣不一樣,所以一開始學習一個現成項目的框架時問題就暴露出來了,其實很多問題很細節,也不好意思問同事,上網找許多答案也答非所問,就自己總結下。
1,@Resources標籤
來公司之前對Spring的自動封裝也有一些瞭解,但是涉及的類也好,DAO也好,都是用@Autowried標籤,那麼這兩個標籤有什麼區別呢?
從定義上講,@Resource默認按照名稱方式進行bean匹配,@Autowired默認按照類型方式進行bean匹配
@Resource是J2EE的註解,引用路徑爲import javax.annotation.Resource;
@Autowired()是Spring的註解,引用路徑爲import org.springframework.beans.factory.annotation.Autowired;
那麼Resources是如何利用名稱來進行bean匹配的呢?舉個例子,現在有一個接口Human,裏面定義了speak,walk兩個方法,他有兩個實現類分別是ManImpl和WomanImpl,對這兩個方法進行了自己的實現,而在Service層對Human進行了調用
如果是使用Autowried則要加上@Qualifier標籤來說明:
@Autowired
@Qualifier("manImpl")
private Human human;
2,ref和value的區別
在spring的配置文件中定義一個bean需要定義一些property,那麼這裏的value和ref有什麼分別呢。
其實這是一個很簡單的問題,ref是一個引用,而value是一個String或者boolean的值,那麼之前爲什麼沒有發現呢?是因爲編譯器直接根據name的類型定義了這個量,讓你沒有機會去分別,還是一樣,舉個例子
這是一個bean的裝配定義,這裏需要使用的數據庫配置項肯定都是string,所以,後面跟着的都是value,
<bean id="dataSource" name = "dataSourceFans" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="${jdbc.driver}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </bean>
這裏用到了剛纔定義的dataSource,這是一個bean,那麼property重對他的調用就應該是引用了這個類,所以後面是ref
<!-- myBatis 配置 --> <bean id="defaultSqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource"/> <property name="mapperLocations" value="classpath:dal/mapper/*-sqlmap.xml"/> <property name="typeAliasesPackage" value="com.youzan.itemcenter.model"/> </bean>總之,ref代表的是引用這個對象,相當於傳入得是對象的引用,而value是引入的這個對象名字的字符串。ref是引用(指針),value是布爾、string等的值,用ref還是value,需要看源碼裏這個name是什麼類型的至於使用哪個是依據你所用的屬性類型決定的,不是隨便使用的。