springboot 多个sevice类实现同一接口的调用
參考頁(yè)面:http://blog.csdn.net/xiao190128/article/details/54890759/;感謝分享
service ?是有用的相當(dāng)于 xml配置中得bean ?id = service ?也可以不指定 不指定相當(dāng)于 bean id = ?com. service.service 就是這個(gè)類的全限定名,表示給當(dāng)前類命名一個(gè)別名,方便注入到其他需要用到的類中;不加的話,默認(rèn)別名就是當(dāng)前類名,但是首字母小寫?
Spring注解@Component、@Repository、@Service、@Controller區(qū)別
如果 Web 應(yīng)用程序采用了經(jīng)典的三層分層結(jié)構(gòu)的話,最好在持久層、業(yè)務(wù)層和控制層分別采用 @Repository、@Service 和 @Controller 對(duì)分層中的類進(jìn)行注釋,而用 @Component 對(duì)那些比較中立的類進(jìn)行注釋。?
在一個(gè)稍大的項(xiàng)目中,通常會(huì)有上百個(gè)組件,如果這些組件采用xml的bean定義來(lái)配置,顯然會(huì)增加配置文件的體積,查找以及維護(hù)起來(lái)也不太方便。 Spring2.5為我們引入了組件自動(dòng)掃描機(jī)制,他可以在類路徑底下尋找標(biāo)注了@Component,@Service,@Controller,@Repository注解的類,并把這些類納入進(jìn)spring容器中管理。它的作用和在xml文件中使用bean節(jié)點(diǎn)配置組件時(shí)一樣的。要使用自動(dòng)掃描機(jī)制,我們需要打開(kāi)以下配置信息:?
Java代碼?
1. <?xml version="1.0" encoding="UTF-8" ?> <beansxmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beans??http://www.springframework.org/schema/beans/spring-beans-2.5.xsd??http://www.springframework.org/schema/context??http://www.springframework.org/schema/context/spring-context-2.5.xsd"?
2. >?
3.???
4.?<context:component-scan base-package=”com.eric.spring”>???
5. </beans>???
6. 其中base-package為需要掃描的包(含所有子包) @Service用于標(biāo)注業(yè)務(wù)層組件,@Controller用于標(biāo)注控制層組件(如struts中的action),@Repository用于標(biāo)注數(shù)據(jù)訪問(wèn)組件,即DAO組件,而@Component泛指組件,當(dāng)組件不好歸類的時(shí)候,我們可以使用這個(gè)注解進(jìn)行標(biāo)注。 ?
?
注入方式:?
把DAO實(shí)現(xiàn)類注入到service實(shí)現(xiàn)類中,把service的接口(注意不要是service的實(shí)現(xiàn)類)注入到action中,注?
入時(shí)不要new 這個(gè)注入的類,因?yàn)閟pring會(huì)自動(dòng)注入,如果手動(dòng)再new的話會(huì)出現(xiàn)錯(cuò)誤,然后屬性加上?
@Autowired后不需要getter()和setter()方法,Spring也會(huì)自動(dòng)注入。
注解:?
在 spring的配置文件里面只需要加上<context:annotation-config/>和<context:component-scanbase-package="需要實(shí)現(xiàn)注入的類所在包"/>,
可以使用base-package="*"表示全部的類。???
< context:component-scan base-package=”com.eric.spring”>?
其中base-package為需要掃描的包(含所有子包)?
在接口前面標(biāo)上@Autowired和@Qualifier注釋使得接口可以被容器注入,當(dāng)接口存在兩個(gè)實(shí)現(xiàn)類的時(shí)候必須指定其中一個(gè)來(lái)注入,
使用實(shí)現(xiàn)類首字母小寫的字符串來(lái)注入,如:?
??? @Autowired??????
???
????@Qualifier("chinese")???????
???
???? private Man man;????
否則可以省略,只寫@Autowired??。?
@Service服務(wù)層組件,用于標(biāo)注業(yè)務(wù)層組件,表示定義一個(gè)bean,自動(dòng)根據(jù)bean的類名實(shí)例化一個(gè)首寫字母為小寫的bean,
例如Chinese實(shí)例化為chinese,如果需要自己改名字則:@Service("你自己改的bean名")。???
@Controller用于標(biāo)注控制層組件(如struts中的action)?
@Repository持久層組件,用于標(biāo)注數(shù)據(jù)訪問(wèn)組件,即DAO組件?
@Component泛指組件,當(dāng)組件不好歸類的時(shí)候,我們可以使用這個(gè)注解進(jìn)行標(biāo)注。?
@Service?
public class VentorServiceImpl implements iVentorService {?
}?
@Repository?
public class VentorDaoImpl implements iVentorDao {?
}?
getBean 的默認(rèn)名稱是類名(頭字母小寫),如果想自定義,可以@Service(“aaaaa”) 這樣來(lái)指定,這種?
bean默認(rèn)是單例的,如果想改變,可以使用@Service(“beanName”)@Scope(“prototype”)來(lái)改變。?
可以使用以下方式指定初始化方法和銷毀方法(方法名任意):?
@PostConstruct?
public void init() {?
}?
@PreDestroy?
public void destory() {?
}?
Spring中@Autowired注解、@Resource注解的區(qū)別
Spring不但支持自己定義的@Autowired注解,還支持幾個(gè)由JSR-250規(guī)范定義的注解,它們分別是@Resource、@PostConstruct以及@PreDestroy。
@Resource的作用相當(dāng)于@Autowired,只不過(guò)@Autowired按byType自動(dòng)注入,而@Resource默認(rèn)按?byName自動(dòng)注入罷了。@Resource有兩個(gè)屬性是比較重要的,分是name和type,Spring將@Resource注解的name屬性解析為bean的名字,而type屬性則解析為bean的類型。所以如果使用name屬性,則使用byName的自動(dòng)注入策略,而使用type屬性時(shí)則使用byType自動(dòng)注入策略。如果既不指定name也不指定type屬性,這時(shí)將通過(guò)反射機(jī)制使用byName自動(dòng)注入策略。
@Resource裝配順序
1.?如果同時(shí)指定了name和type,則從Spring上下文中找到唯一匹配的bean進(jìn)行裝配,找不到則拋出異常
2.?如果指定了name,則從上下文中查找名稱(id)匹配的bean進(jìn)行裝配,找不到則拋出異常
3.?如果指定了type,則從上下文中找到類型匹配的唯一bean進(jìn)行裝配,找不到或者找到多個(gè),都會(huì)拋出異常
4.?如果既沒(méi)有指定name,又沒(méi)有指定type,則自動(dòng)按照byName方式進(jìn)行裝配;如果沒(méi)有匹配,則回退為一個(gè)原始類型進(jìn)行匹配,如果匹配則自動(dòng)裝配;
@Autowired?與@Resource的區(qū)別:
1、?@Autowired與@Resource都可以用來(lái)裝配bean.都可以寫在字段上,或?qū)懺趕etter方法上。
2、?@Autowired默認(rèn)按類型裝配(這個(gè)注解是屬業(yè)spring的),默認(rèn)情況下必須要求依賴對(duì)象必須存在,如果要允許null值,可以設(shè)置它的required屬性為false,如:@Autowired(required=false),如果我們想使用名稱裝配可以結(jié)合@Qualifier注解進(jìn)行使用,如下:
| 1 | @Autowired()?@Qualifier("baseDao") |
| 2 | private?BaseDao baseDao; |
3、@Resource(這個(gè)注解屬于J2EE的),默認(rèn)安裝名稱進(jìn)行裝配,名稱可以通過(guò)name屬性進(jìn)行指定,如果沒(méi)有指定name屬性,當(dāng)注解寫在字段上時(shí),默認(rèn)取字段名進(jìn)行安裝名稱查找,如果注解寫在setter方法上默認(rèn)取屬性名進(jìn)行裝配。當(dāng)找不到與名稱匹配的bean時(shí)才按照類型進(jìn)行裝配。但是需要注意的是,如果name屬性一旦指定,就只會(huì)按照名稱進(jìn)行裝配。
| 1 | @Resource(name="baseDao") | |
| 2 | private?BaseDao baseDao; | |
推薦使用:@Resource注解在字段上,這樣就不用寫setter方法了,并且這個(gè)注解是屬于J2EE的,減少了與spring的耦合。這樣代碼看起就比較優(yōu)雅。
轉(zhuǎn)載于:https://www.cnblogs.com/zmdd/p/8550022.html
總結(jié)
以上是生活随笔為你收集整理的springboot 多个sevice类实现同一接口的调用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: linux重定向输出命令?
- 下一篇: [ZJOI2012]数列