Spring常用注解 使用注解來構(gòu)造IoC容器的方法
使用注解來構(gòu)造IoC容器
用注解來向Spring容器注冊(cè)Bean。需要在applicationContext.xml中注冊(cè)<context:component-scan base-package=”pagkage1[,pagkage2,…,pagkageN]”/>。
如:在base-package指明一個(gè)包
<context:component-scan base-package="cn.gacl.java"/>
表明cn.gacl.java包及其子包中,如果某個(gè)類的頭上帶有特定的注解【@Component/@Repository/@Service/@Controller】,就會(huì)將這個(gè)對(duì)象作為Bean注冊(cè)進(jìn)Spring容器。也可以在<context:component-scan base-package=” ”/>中指定多個(gè)包,如:
<context:component-scan base-package="cn.gacl.dao.impl,cn.gacl.service.impl,cn.gacl.action"/>
多個(gè)包逗號(hào)隔開。
1、@Component
@Component
是所有受Spring 管理組件的通用形式,@Component注解可以放在類的頭上,@Component不推薦使用。
2、@Controller
@Controller對(duì)應(yīng)表現(xiàn)層的Bean,也就是Action,例如:
@Controller @Scope("prototype") public class UserAction extends BaseAction<User>{ …… }
使用@Controller注解標(biāo)識(shí)UserAction之后,就表示要把UserAction交給Spring容器管理,在Spring容器中會(huì)存在一個(gè)名字為"userAction"的action,這個(gè)名字是根據(jù)UserAction類名來取的。注意:如果@Controller不指定其value【@Controller】,則默認(rèn)的bean名字為這個(gè)類的類名首字母小寫,如果指定value【@Controller(value="UserAction")】或者【@Controller("UserAction")】,則使用value作為bean的名字。
這里的UserAction還使用了@Scope注解,@Scope("prototype")表示將Action的范圍聲明為原型,可以利用容器的scope="prototype"來保證每一個(gè)請(qǐng)求有一個(gè)單獨(dú)的Action來處理,避免struts中Action的線程安全問題。spring 默認(rèn)scope 是單例模式(scope="singleton"),這樣只會(huì)創(chuàng)建一個(gè)Action對(duì)象,每次訪問都是同一Action對(duì)象,數(shù)據(jù)不安全,struts2 是要求每次次訪問都對(duì)應(yīng)不同的Action,scope="prototype" 可以保證當(dāng)有請(qǐng)求的時(shí)候都創(chuàng)建一個(gè)Action對(duì)象
3、@ Service
@Service對(duì)應(yīng)的是業(yè)務(wù)層Bean,例如:
@Service("userService") public class UserServiceImpl implements UserService { ……… }
@Service("userService")注解是告訴Spring,當(dāng)Spring要?jiǎng)?chuàng)建UserServiceImpl的的實(shí)例時(shí),bean的名字必須叫做"userService",這樣當(dāng)Action需要使用UserServiceImpl的的實(shí)例時(shí),就可以由Spring創(chuàng)建好的"userService",然后注入給Action:在Action只需要聲明一個(gè)名字叫“userService”的變量來接收由Spring注入的"userService"即可,具體代碼如下:
// 注入userService @Resource(name = "userService") private UserService userService;
注意:在Action聲明的“userService”變量的類型必須是“UserServiceImpl”或者是其父類“UserService”,否則由于類型不一致而無法注入,由于Action中的聲明的“userService”變量使用了@Resource注解去標(biāo)注,并且指明了其name = "userService",這就等于告訴Spring,說我Action要實(shí)例化一個(gè)“userService”,你Spring快點(diǎn)幫我實(shí)例化好,然后給我,當(dāng)Spring看到userService變量上的@Resource的注解時(shí),根據(jù)其指明的name屬性可以知道,Action中需要用到一個(gè)UserServiceImpl的實(shí)例,此時(shí)Spring就會(huì)把自己創(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();”主動(dòng)去創(chuàng)建實(shí)例對(duì)象,但使用了Spring之后,Action要使用UserServiceImpl時(shí),就不用主動(dòng)去創(chuàng)建UserServiceImpl的實(shí)例了,創(chuàng)建UserServiceImpl實(shí)例已經(jīng)交給Spring來做了,Spring把創(chuàng)建好的UserServiceImpl實(shí)例給Action,Action拿到就可以直接用了。
Action由原來的主動(dòng)創(chuàng)建UserServiceImpl實(shí)例后就可以馬上使用,變成了被動(dòng)等待由Spring創(chuàng)建好UserServiceImpl實(shí)例之后再注入給Action,Action才能夠使用。
這說明Action對(duì)“UserServiceImpl”類的“控制權(quán)”已經(jīng)被“反轉(zhuǎn)”了,原來主動(dòng)權(quán)在自己手上,自己要使用“UserServiceImpl”類的實(shí)例,自己主動(dòng)去new一個(gè)出來馬上就可以使用了,但現(xiàn)在自己不能主動(dòng)去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干活,那么就是對(duì)UserServiceImpl產(chǎn)生了依賴,Spring把Acion需要依賴的UserServiceImpl注入(也就是“給”)給Action,這就是所謂的“依賴注入”。對(duì)Action而言,Action依賴什么東西,就請(qǐng)求Spring注入給他,對(duì)Spring而言,Action需要什么,Spring就主動(dòng)注入給他。
4、@ Repository
@Repository對(duì)應(yīng)數(shù)據(jù)訪問層Bean ,例如:
@Repository(value="userDao") public class UserDaoImpl extends BaseDaoImpl<User> { ……… }
@Repository(value="userDao")注解是告訴Spring,讓Spring創(chuàng)建一個(gè)名字叫“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 都用來注入對(duì)象。其中@Resource可以以 name 或 type 方式注入,@AutoWired只能以 type 方式注入,@Qualifier 只能以 name 方式注入。
但它們有一些細(xì)微區(qū)別:
1、@Resource、@Qualifier默認(rèn)按 byName自動(dòng)注入,@Autowired默認(rèn)按byType自動(dòng)注入。
2、@Resource有兩個(gè)屬性是比較重要的,分是name和type。如果使用name屬性,則使用byName的自動(dòng)注入策略。而使用type屬性時(shí)則使用byType自動(dòng)注入策略。
3、@Resources是JDK提供的注解,而@Autowired是Spring提供的注解。
可以把 @Resource 當(dāng)成 @AutoWired @Qualifier 的老大吧,哈哈。你們有的,我都有,你們沒有的,我也有~
@Resource、@AutoWired、@Qualifier 都用來注入對(duì)象。其中@Resource可以以 name 或 type 方式注入,@AutoWired只能以 type 方式注入,@Qualifier 只能以 name 方式注入。
但它們有一些細(xì)微區(qū)別:
1、@Resource、@Qualifier默認(rèn)按 byName自動(dòng)注入,@Autowired默認(rèn)按byType自動(dòng)注入。
2、@Resource有兩個(gè)屬性是比較重要的,分是name和type。如果使用name屬性,則使用byName的自動(dòng)注入策略。而使用type屬性時(shí)則使用byType自動(dòng)注入策略。
3、@Resources是JDK提供的注解,而@Autowired是Spring提供的注解。
可以把 @Resource 當(dāng)成 @AutoWired @Qualifier 的老大吧,哈哈。你們有的,我都有,你們沒有的,我也有~
以上這篇Spring常用注解 使用注解來構(gòu)造IoC容器的方法就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java通過word模板實(shí)現(xiàn)創(chuàng)建word文檔報(bào)告
這篇文章主要為大家詳細(xì)介紹了Java如何通過word模板實(shí)現(xiàn)創(chuàng)建word文檔報(bào)告的教程,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以學(xué)習(xí)一下2022-09-09Sentinel結(jié)合Nacos實(shí)現(xiàn)數(shù)據(jù)持久化過程詳解
這篇文章主要介紹了Sentinel結(jié)合Nacos實(shí)現(xiàn)數(shù)據(jù)持久化過程,要持久化的原因是因?yàn)槊看螁?dòng)Sentinel都會(huì)使之前配置的規(guī)則就清空了,這樣每次都要再去設(shè)定規(guī)則顯得非常的麻煩,感興趣想要詳細(xì)了解可以參考下文2023-05-05SystemServer進(jìn)程啟動(dòng)過程解析
這篇文章主要為大家介紹了SystemServer進(jìn)程啟動(dòng)過程解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07mybatis-plus實(shí)體類中出現(xiàn)非數(shù)據(jù)庫映射字段解決辦法
這篇文章主要介紹了mybatis-plus實(shí)體類中出現(xiàn)非數(shù)據(jù)庫映射字段解決辦法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03java微信開發(fā)API第三步 微信獲取以及保存接口調(diào)用憑證
這篇文章主要為大家詳細(xì)介紹了java微信開發(fā)API第二步,微信獲取以及保存接口調(diào)用憑證,感興趣的小伙伴們可以參考一下2016-06-06idea導(dǎo)入springboot項(xiàng)目沒有maven的解決
這篇文章主要介紹了idea導(dǎo)入springboot項(xiàng)目沒有maven的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-04-04mybatis條件構(gòu)造器(EntityWrapper)的使用方式
這篇文章主要介紹了mybatis條件構(gòu)造器(EntityWrapper)的使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03關(guān)于Linux服務(wù)器配置java環(huán)境遇到的問題小結(jié)
這篇文章主要介紹了關(guān)于Linux服務(wù)器配置java環(huán)境遇到的問題小結(jié),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-12-12Apache?Commons?CLI構(gòu)建命令行應(yīng)用利器教程
這篇文章主要為大家介紹了構(gòu)建命令行應(yīng)用利器Apache?Commons?CLI的使用教程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12