Spring中Resources標籤和Autowired標籤的區別,ref和value的區別

對於Spring,人人都能說上來它的一些特點,也都會用個123,但是其實有很多細節,再加上每個公司的使用習慣不一樣,所以一開始學習一個現成項目的框架時問題就暴露出來了,其實很多問題很細節,也不好意思問同事,上網找許多答案也答非所問,就自己總結下。

1,@Resources標籤

來公司之前對Spring的自動封裝也有一些瞭解,但是涉及的類也好,DAO也好,都是用@Autowried標籤,那麼這兩個標籤有什麼區別呢?

從定義上講,@Resource默認按照名稱方式進行bean匹配,@Autowired默認按照類型方式進行bean匹配

@ResourceJ2EE的註解,引用路徑爲import javax.annotation.Resource;

@Autowired()Spring的註解,引用路徑爲import org.springframework.beans.factory.annotation.Autowired;

自己公司項目比較大,使用的框架比較多時,應該使用Resources標籤,因爲Spring屬於第三方,J2EE是Java自己的東西,使用@Resource可以減少代碼和Spring之間的耦合。

那麼Resources是如何利用名稱來進行bean匹配的呢?舉個例子,現在有一個接口Human,裏面定義了speak,walk兩個方法,他有兩個實現類分別是ManImpl和WomanImpl,對這兩個方法進行了自己的實現,而在Service層對Human進行了調用

接口Human  
public interface Human {  
    public void speak();  
    public void walk(); 
}  

實現類ManImpl 
public class ManImpl implements Human {  
public void speak() {  
    System.out.println(" man speaking!"); 
}  
publicvoid walk() { 
    System.out.println(" man walking!");  
    }  
}  
實現類WomanImpl就不寫了,是一樣的

主調類SequenceServiceImpl
public void generateId(Map map) {  
//起服務此處會報錯
@Resource
private Human human;  
}
報錯的地方給我們提示了:but found 2: manImpl,womanImpl      意思是Human有兩個實現類。解決方案如下:
@Resource(name = "manImpl")

注意是manImpl不是ManImpl,因爲使用@Service,容器爲我們創建bean時默認類名首字母小寫。

如果是使用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是什麼類型的至於使用哪個是依據你所用的屬性類型決定的,不是隨便使用的。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章