Spring注解配置IOC,DI的方法詳解
Annotation(注解)是JDK1.5及以后版本引入的。它可以用于創(chuàng)建文檔,跟蹤代碼中的依賴性,甚至執(zhí)行基本編譯時(shí)檢查。注解是以‘@注解名’在代碼中存在的。
前面講解 IOC 和 DI 都是通過 xml 文件來(lái)進(jìn)行配置的,我們發(fā)現(xiàn) xml 配置還是比較麻煩的,那么如何簡(jiǎn)化配置呢?答案就是使用注解!
1、注解 @Component
我們這里有個(gè)類 Person
package com.ys.annotation; public class Person { private int pid; private String pname; private String psex; public int getPid() { return pid; } public void setPid(int pid) { this.pid = pid; } public String getPname() { return pname; } public void setPname(String pname) { this.pname = pname; } public String getPsex() { return psex; } public void setPsex(String psex) { this.psex = psex; } }
如果我們不使用注解,通過前面講解的,要想讓 Spring 容器幫我們產(chǎn)生 Person 對(duì)象,我們要進(jìn)行如下配置:
applicationContext.xml
配置:
<bean id="person" class="com.ys.annotation.Person"></bean>
如果使用注解呢?
第一步:在 applicationContext.xml 中引入命名空間
這里我們簡(jiǎn)單講解一下這里引入的命名空間,簡(jiǎn)單來(lái)說(shuō)就是用來(lái)約束xml文件格式的。第一個(gè) xmlns:context ,這表示標(biāo)簽格式應(yīng)該是<context:標(biāo)簽名>
第二步:在 applicationContext.xml 文件中引入注解掃描器
<!-- 組件掃描,掃描含有注解的類 --> <context:component-scan base-package="com.ys.annotation"></context:component-scan>
base-package
:表示含有注解類的包名
如果掃描多個(gè)包,則上面的代碼書寫多行,改變 base-package 里面的內(nèi)容即可!
第三步:在 Person 類中添加注解@Component
第四步:測(cè)試
@Test public void testAnnotation(){ //1、啟動(dòng) spring 容器 //2、從 spring 容器中取出數(shù)據(jù) //3、通過對(duì)象調(diào)用方法 ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); Person person = (Person) context.getBean("person"); System.out.println(person.getPname()); }
如果看完上面的注解配置,你一臉懵逼,那沒關(guān)系,我們下面來(lái)詳細(xì)講解。
@Component
如果一個(gè)類上加了@Component注解,就會(huì)進(jìn)行如下的法則
如果其value屬性的值為""
@Component
publicclassPerson{}
等價(jià)于
<beanid="person"class="..Person">
如果其value屬性的值不為""
@Component("p")
publicclassPerson{}
等價(jià)于
<beanid="p"class="..Person">
那么這就很好理解測(cè)試程序中,我們直接 context.getBean("person")
這樣寫。
2、@Repository @Service @Controller
此外:下面三個(gè)注解是 @Component 注解的衍生注解,功能一樣
@Repository :dao層 @Service:service層 @Controller:web層
3、注解@Resource
@Resource 注解,它可以對(duì)類成員變量、方法及構(gòu)造函數(shù)進(jìn)行標(biāo)注,完成自動(dòng)裝配的工作。 通過 @Resource 的使用來(lái)消除 set ,get方法。
首先創(chuàng)建一個(gè) 學(xué)生類 Student.java
然后在 Person 類中添加一個(gè)屬性 Student
那么我們?nèi)绾潍@取 Person 對(duì)象,并調(diào)用 showStudent()方法呢?這個(gè)問題簡(jiǎn)化就是如何給屬性 Student 實(shí)例化,也就是依賴注入
不使用注解:
<property name="students"> <ref bean="student"/> </property> <bean id="student" class="com.ys.annotation_di.Student"></bean> 使用注解:
使用注解:
@Resource注解以后,判斷該注解name的屬性是否為""(name沒有寫)
①、如果沒有寫name屬性,則會(huì)讓屬性的名稱的值和spring配置文件bean中ID的值做匹配(如果沒有進(jìn)行配置,也和注解@Component進(jìn)行匹配),如果匹配成功則賦值,如果匹配不成功,則會(huì)按照spring配置文件class類型進(jìn)行匹配,如果匹配不成功,則報(bào)錯(cuò)
②、如果有name屬性,則會(huì)按照name屬性的值和spring的bean中ID進(jìn)行匹配,匹配成功,則賦值,不成功則報(bào)錯(cuò)
4、注解 @Autowired
功能和注解 @Resource 一樣,可以對(duì)類成員變量、方法及構(gòu)造函數(shù)進(jìn)行標(biāo)注,完成自動(dòng)裝配的工作。只不過注解@Resource 是按照名稱來(lái)進(jìn)行裝配,而@Autowired 則是按照類型來(lái)進(jìn)行裝配。
第一步:創(chuàng)建接口 PersonDao
package com.ys.autowired; public interface PersonDao { public void savePerson(); }
第二步:創(chuàng)建一個(gè)接口實(shí)現(xiàn)類 PersonDaoImplOne
package com.ys.autowired; import org.springframework.stereotype.Component; @Component("personDaoImplOne") public class PersonDaoImplOne implements PersonDao{ @Override public void savePerson() { System.out.println("save Person One"); } }
第三步:創(chuàng)建PersonService
package com.ys.autowired; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service("personService") public class PersonService{ @Autowired private PersonDao personDao; public void savePerson() { this.personDao.savePerson(); } }
注意:這里我們?cè)?code>private PesronDao personDao 上面添加了注解 @Autowired,它首先會(huì)根據(jù)類型去匹配,PersonDao 是一個(gè)接口,它的實(shí)現(xiàn)類是
PesronDaoImpOne
,那么這里的意思就是:PersonDao personDao = new PersonDaoImpOne();
那么問題來(lái)了,如果 PersonDao 的實(shí)現(xiàn)類有多個(gè)呢?我們創(chuàng)建第一個(gè)實(shí)現(xiàn)類 PersonDaoImpTwo
如果還是向上面那樣寫,那么測(cè)試就會(huì)報(bào)錯(cuò)。怎么解決呢?
第一種方法:更改名稱
第二種方法:@Autowired 和 @Qualifier("名稱") 配合使用
在使用@Autowired時(shí),首先在容器中查詢對(duì)應(yīng)類型的bean
- 如果查詢結(jié)果剛好為一個(gè),就將該bean裝配給@Autowired指定的數(shù)據(jù)
- 如果查詢的結(jié)果不止一個(gè),那么@Autowired會(huì)根據(jù)名稱來(lái)查找。
- 如果查詢的結(jié)果為空,那么會(huì)拋出異常。解決方法時(shí),使用required=false
總結(jié)
本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
Java Swing組件下拉菜單控件JComboBox用法示例
這篇文章主要介紹了Java Swing組件下拉菜單控件JComboBox用法,結(jié)合具體實(shí)例形式分析了Swing組件下拉菜單控件JComboBox的具體定義、使用方法及相關(guān)使用注意事項(xiàng),需要的朋友可以參考下2017-11-11詳解Spring Boot工程集成全局唯一ID生成器 UidGenerator的操作步驟
本文就在項(xiàng)目中來(lái)集成 UidGenerator這一工程來(lái)作為項(xiàng)目的全局唯一 ID生成器。接下來(lái)通過實(shí)例代碼給大家詳解詳解Spring Boot工程集成全局唯一ID生成器 UidGenerator的操作步驟,感興趣的朋友一起看看吧2018-10-10mybatis分頁(yè)及模糊查詢功能實(shí)現(xiàn)
這篇文章主要為大家詳細(xì)為大家詳細(xì)介紹了mybatis實(shí)現(xiàn)分頁(yè)及模糊查詢功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06Eclipse2020安裝了最新版本的JDK卻無(wú)法打開的問題
這篇文章主要介紹了Eclipse2020安裝了最新版本的JDK卻無(wú)法打開,提示版本太老的完美解決方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-12-12使用vscode搭建javaweb項(xiàng)目的詳細(xì)步驟
我個(gè)人是很喜歡VsCode的,開源免費(fèi)、功能全面,所以為了方便,我把我?guī)缀跛械倪\(yùn)行都集成到了VsCode上來(lái),JavaWeb也不例外,下面這篇文章主要給大家介紹了關(guān)于使用vscode搭建javaweb項(xiàng)目的相關(guān)資料,需要的朋友可以參考下2022-11-11Java設(shè)計(jì)模式之動(dòng)態(tài)代理
今天小編就為大家分享一篇關(guān)于Java設(shè)計(jì)模式之動(dòng)態(tài)代理,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-01-01