Spring中如何使用注解來構(gòu)造IoC容器

小編給大家分享一下Spring中如何使用注解來構(gòu)造IoC容器,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

專注于為中小企業(yè)提供網(wǎng)站建設(shè)、網(wǎng)站制作服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)永順免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動了上千多家企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。

使用注解來構(gòu)造IoC容器

用注解來向Spring容器注冊Bean。需要在applicationContext.xml中注冊<context:component-scan base-package=”pagkage1[,pagkage2,…,pagkageN]”/>。

如:在base-package指明一個包

<context:component-scan base-package="cn.gacl.java"/>

表明cn.gacl.java包及其子包中,如果某個類的頭上帶有特定的注解【@Component/@Repository/@Service/@Controller】,就會將這個對象作為Bean注冊進(jìn)Spring容器。也可以在<context:component-scan base-package=” ”/>中指定多個包,如:

<context:component-scan base-package="cn.gacl.dao.impl,cn.gacl.service.impl,cn.gacl.action"/>

多個包逗號隔開。

1、@Component

@Component

是所有受Spring 管理組件的通用形式,@Component注解可以放在類的頭上,@Component不推薦使用。

2、@Controller

@Controller對應(yīng)表現(xiàn)層的Bean,也就是Action,例如:

 @Controller
 @Scope("prototype")
 public class UserAction extends BaseAction<User>{
 ……
 }

使用@Controller注解標(biāo)識UserAction之后,就表示要把UserAction交給Spring容器管理,在Spring容器中會存在一個名字為"userAction"的action,這個名字是根據(jù)UserAction類名來取的。注意:如果@Controller不指定其value【@Controller】,則默認(rèn)的bean名字為這個類的類名首字母小寫,如果指定value【@Controller(value="UserAction")】或者【@Controller("UserAction")】,則使用value作為bean的名字。

這里的UserAction還使用了@Scope注解,@Scope("prototype")表示將Action的范圍聲明為原型,可以利用容器的scope="prototype"來保證每一個請求有一個單獨(dú)的Action來處理,避免struts中Action的線程安全問題。spring 默認(rèn)scope 是單例模式(scope="singleton"),這樣只會創(chuàng)建一個Action對象,每次訪問都是同一Action對象,數(shù)據(jù)不安全,struts2 是要求每次次訪問都對應(yīng)不同的Action,scope="prototype" 可以保證當(dāng)有請求的時(shí)候都創(chuàng)建一個Action對象

3、@ Service

@Service對應(yīng)的是業(yè)務(wù)層Bean,例如:

@Service("userService")
 public class UserServiceImpl implements UserService {
 ………
 }

@Service("userService")注解是告訴Spring,當(dāng)Spring要創(chuàng)建UserServiceImpl的的實(shí)例時(shí),bean的名字必須叫做"userService",這樣當(dāng)Action需要使用UserServiceImpl的的實(shí)例時(shí),就可以由Spring創(chuàng)建好的"userService",然后注入給Action:在Action只需要聲明一個名字叫“userService”的變量來接收由Spring注入的"userService"即可,具體代碼如下:

 // 注入userService
 @Resource(name = "userService")
 private UserService userService;

注意:在Action聲明的“userService”變量的類型必須是“UserServiceImpl”或者是其父類“UserService”,否則由于類型不一致而無法注入,由于Action中的聲明的“userService”變量使用了@Resource注解去標(biāo)注,并且指明了其name = "userService",這就等于告訴Spring,說我Action要實(shí)例化一個“userService”,你Spring快點(diǎn)幫我實(shí)例化好,然后給我,當(dāng)Spring看到userService變量上的@Resource的注解時(shí),根據(jù)其指明的name屬性可以知道,Action中需要用到一個UserServiceImpl的實(shí)例,此時(shí)Spring就會把自己創(chuàng)建好的名字叫做"userService"的UserServiceImpl的實(shí)例注入給Action中的“userService”變量,幫助Action完成userService的實(shí)例化,這樣在Action中就不用通過“UserService userService = new UserServiceImpl();”這種最原始的方式去實(shí)例化userService了。

如果沒有Spring,那么當(dāng)Action需要使用UserServiceImpl時(shí),必須通過“UserService userService = new UserServiceImpl();”主動去創(chuàng)建實(shí)例對象,但使用了Spring之后,Action要使用UserServiceImpl時(shí),就不用主動去創(chuàng)建UserServiceImpl的實(shí)例了,創(chuàng)建UserServiceImpl實(shí)例已經(jīng)交給Spring來做了,Spring把創(chuàng)建好的UserServiceImpl實(shí)例給Action,Action拿到就可以直接用了。

Action由原來的主動創(chuàng)建UserServiceImpl實(shí)例后就可以馬上使用,變成了被動等待由Spring創(chuàng)建好UserServiceImpl實(shí)例之后再注入給Action,Action才能夠使用。

這說明Action對“UserServiceImpl”類的“控制權(quán)”已經(jīng)被“反轉(zhuǎn)”了,原來主動權(quán)在自己手上,自己要使用“UserServiceImpl”類的實(shí)例,自己主動去new一個出來馬上就可以使用了,但現(xiàn)在自己不能主動去new“UserServiceImpl”類的實(shí)例,new“UserServiceImpl”類的實(shí)例的權(quán)力已經(jīng)被Spring拿走了,只有Spring才能夠new“UserServiceImpl”類的實(shí)例,而Action只能等Spring創(chuàng)建好“UserServiceImpl”類的實(shí)例后,再“懇求”Spring把創(chuàng)建好的“UserServiceImpl”類的實(shí)例給他,這樣他才能夠使用“UserServiceImpl”,這就是Spring核心思想“控制反轉(zhuǎn)”,也叫“依賴注入”,“依賴注入”也很好理解,Action需要使用UserServiceImpl干活,那么就是對UserServiceImpl產(chǎn)生了依賴,Spring把Acion需要依賴的UserServiceImpl注入(也就是“給”)給Action,這就是所謂的“依賴注入”。對Action而言,Action依賴什么東西,就請求Spring注入給他,對Spring而言,Action需要什么,Spring就主動注入給他。

4、@ Repository

@Repository對應(yīng)數(shù)據(jù)訪問層Bean ,例如:

@Repository(value="userDao")
public class UserDaoImpl extends BaseDaoImpl<User> {
………
}

@Repository(value="userDao")注解是告訴Spring,讓Spring創(chuàng)建一個名字叫“userDao”的UserDaoImpl實(shí)例。

當(dāng)Service需要使用Spring創(chuàng)建的名字叫“userDao”的UserDaoImpl實(shí)例時(shí),就可以使用@Resource(name = "userDao")注解告訴Spring,Spring把創(chuàng)建好的userDao注入給Service即可。

// 注入userDao,從數(shù)據(jù)庫中根據(jù)用戶Id取出指定用戶時(shí)需要用到
@Resource(name = "userDao")
private BaseDao<User> userDao;

@Resource、@AutoWired、@Qualifier 都用來注入對象。其中@Resource可以以 name 或 type 方式注入,@AutoWired只能以 type 方式注入,@Qualifier 只能以 name 方式注入。

但它們有一些細(xì)微區(qū)別:

1、@Resource、@Qualifier默認(rèn)按 byName自動注入,@Autowired默認(rèn)按byType自動注入。

2、@Resource有兩個屬性是比較重要的,分是name和type。如果使用name屬性,則使用byName的自動注入策略。而使用type屬性時(shí)則使用byType自動注入策略。

3、@Resources是JDK提供的注解,而@Autowired是Spring提供的注解。

可以把 @Resource 當(dāng)成 @AutoWired @Qualifier 的老大吧,哈哈。你們有的,我都有,你們沒有的,我也有~

@Resource、@AutoWired、@Qualifier 都用來注入對象。其中@Resource可以以 name 或 type 方式注入,@AutoWired只能以 type 方式注入,@Qualifier 只能以 name 方式注入。

但它們有一些細(xì)微區(qū)別:

1、@Resource、@Qualifier默認(rèn)按 byName自動注入,@Autowired默認(rèn)按byType自動注入。

2、@Resource有兩個屬性是比較重要的,分是name和type。如果使用name屬性,則使用byName的自動注入策略。而使用type屬性時(shí)則使用byType自動注入策略。

3、@Resources是JDK提供的注解,而@Autowired是Spring提供的注解。

可以把 @Resource 當(dāng)成 @AutoWired @Qualifier 的老大吧,哈哈。你們有的,我都有,你們沒有的,我也有~

以上是“Spring中如何使用注解來構(gòu)造IoC容器”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!

網(wǎng)站標(biāo)題:Spring中如何使用注解來構(gòu)造IoC容器
本文鏈接:http://muchs.cn/article40/pppjho.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供做網(wǎng)站網(wǎng)站策劃、外貿(mào)網(wǎng)站建設(shè)、微信公眾號品牌網(wǎng)站設(shè)計(jì)、App開發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站優(yōu)化排名