欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

聊聊注解@controller@service@component@repository的區(qū)別

 更新時(shí)間:2021年08月20日 09:37:13   作者:青魚(yú)入云  
這篇文章主要介紹了聊聊注解@controller@service@component@repository的區(qū)別,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

注解@controller@service@component@repository的區(qū)別

查了一些網(wǎng)上的其他博客,發(fā)現(xiàn)幾個(gè)注解本質(zhì)上沒(méi)有什么區(qū)別,至少在spring2.5版本里,這幾個(gè)注解本質(zhì)是一樣的(當(dāng)然,新的版本有什么變化目前還沒(méi)細(xì)查)

命名不一樣主要是為了區(qū)分類(lèi)的作用和所屬層級(jí):

  • @Repository:持久層,用于標(biāo)注數(shù)據(jù)訪問(wèn)組件,即DAO組件。
  • @Service:業(yè)務(wù)層,用于標(biāo)注業(yè)務(wù)邏輯層主鍵。
  • @Controller:控制層,用于標(biāo)注控制層組件。
  • @Component:當(dāng)你不確定是屬于哪一層的時(shí)候使用。

之所以區(qū)分開(kāi)幾種類(lèi)型,一是spring想在以后的版本中為它們添加特殊技能,二是這種分層的做法使web架構(gòu)更清晰,易讀性與維護(hù)性更好。

/**
 * Indicates that an annotated class is a "Service", originally defined by Domain-Driven
 * Design (Evans, 2003) as "an operation offered as an interface that stands alone in the
 * model, with no encapsulated state."
 *
 * <p>May also indicate that a class is a "Business Service Facade" (in the Core J2EE
 * patterns sense), or something similar. This annotation is a general-purpose stereotype
 * and individual teams may narrow their semantics and use as appropriate.
 *
 * <p>This annotation serves as a specialization of {@link Component @Component},
 * allowing for implementation classes to be autodetected through classpath scanning.
 *
 * @author Juergen Hoeller
 * @since 2.5
 * @see Component
 * @see Repository
 */
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Service {
    /**
     * The value may indicate a suggestion for a logical component name,
     * to be turned into a Spring bean in case of an autodetected component.
     * @return the suggested component name, if any
     */
    String value() default "";
}

從@service的源碼看,service仍然是使用了@Component注解(@Controller與@Repository與service一樣,這里就不貼源碼了)。

component即組件,相當(dāng)于xml配置文件中的bean申明,通過(guò)spring的自動(dòng)掃描機(jī)制,在規(guī)定的類(lèi)路徑中尋找標(biāo)注了@Component,@Service,@Repository,@Controller注解的類(lèi),并把這些類(lèi)納入進(jìn)容器中進(jìn)行管理。

getBean的默認(rèn)名稱(chēng)是類(lèi)名(頭字母小寫(xiě)),并且是單例的,如果想自定義,可以使用@Service(“beanName”)@Scope(“prototype”)來(lái)改變。

/**自動(dòng)掃描base-package目錄下的所有文件,包括子目錄**/
<context:component-scan base-package="com.user.*"/>

Spring中的主要注解

Spring的一個(gè)核心功能是IOC,就是將Bean初始化加載到容器中, Bean加載到容器中可以使用 Spring注解方式或者 Spring XML配置方式。(通過(guò)注解將java中的一些類(lèi),加載到容器中)

1. 組件類(lèi)注解@Component、@Repository、@Service、@Controller【創(chuàng)建注解】

@Repository、@Service、@Controller的功能和@Component相同,但為了使標(biāo)注類(lèi)的用途更加清晰(層次化),在實(shí)際開(kāi)發(fā)中推薦使用:

@Repository標(biāo)注數(shù)據(jù)訪問(wèn)層(DAO層)、使用@Service標(biāo)注業(yè)務(wù)邏輯層(Service層)以及使用@Controller標(biāo)注控制器層(控制層)。

1.@Component 標(biāo)注為一個(gè)普通的spring Bean類(lèi)

該注解是一個(gè)泛化的概念,僅僅表示一個(gè)組件對(duì)象(Bean),可以作用在任何層次上。

2.@Repository 標(biāo)注為一個(gè)DAO層的組件類(lèi)

該注解用于將數(shù)據(jù)訪問(wèn)層(DAO)的類(lèi)標(biāo)識(shí)為Bean,即注解數(shù)據(jù)訪問(wèn)層Bean,其功能與@Component()相同。

3.@Service 標(biāo)注為Service層(業(yè)務(wù)邏輯層)的組件類(lèi)

該注解用于標(biāo)注一個(gè)業(yè)務(wù)邏輯組件類(lèi)(Service層),其功能與@Component()相同。

4.@Controller 標(biāo)注一個(gè)控制器組件類(lèi)

該注解用于標(biāo)注一個(gè)控制器組件類(lèi)(Spring MVC的Controller),其功能與@Component()相同。

2. 裝配bean時(shí)常用注解 @Autowired、@Resource【獲取注解】

2.1 @Autowired【***常用】

該注解可以對(duì)類(lèi)成員變量、方法及構(gòu)造方法進(jìn)行標(biāo)注,完成自動(dòng)裝配的工作(按照Bean的類(lèi)型進(jìn)行裝配)。 通過(guò) @Autowired的使用來(lái)消除setter 和getter方法。默認(rèn)按照Bean的類(lèi)型進(jìn)行裝配。(屬于Spring 的org.springframework.beans.factory.annotation包)

通過(guò)@Autowired注解,如果在容器中有對(duì)應(yīng)的bean,就可以通過(guò)@Autowired自動(dòng)裝載,也就是賦值。裝載之后自動(dòng)的按照類(lèi)型在spring容器中查找相同類(lèi)型,然后為該字段其注入那個(gè)類(lèi)型的bean實(shí)例。

其實(shí)就是一種依賴(lài)注入的方式,此方式必須確保加注解的類(lèi)在spring中有對(duì)應(yīng)的bean(怎樣加進(jìn)去不管),并且字段的類(lèi)型需要在spring容器中有相同類(lèi)型的bean,才能創(chuàng)建bean實(shí)例,為其注入。

@Autowired注解就相當(dāng)于從Spring容器中通過(guò)類(lèi)型,實(shí)例化了當(dāng)前對(duì)象,可以直接調(diào)用它的方法。

@Autowired
private UserService userService;
//  相當(dāng)于執(zhí)行了實(shí)例化  private UserService userService = new UserServiceImpl();

2.2 @Resource(不屬于spring的注解,是javax.annotation注解)

該注解與@Autowired功能一樣。區(qū)別在于,該注解默認(rèn)是按照名稱(chēng)來(lái)裝配注入的,只有當(dāng)找不到與名稱(chēng)匹配的Bean才會(huì)按照類(lèi)型來(lái)裝配注入;而@Autowired默認(rèn)按照Bean的類(lèi)型進(jìn)行裝配,如果想按照名稱(chēng)來(lái)裝配注入,則需要結(jié)合@Qualifier注解一起使用。

@Resource注解有兩個(gè)屬性:name和type。name屬性指定Bean實(shí)例名稱(chēng),即按照名稱(chēng)來(lái)裝配注入;type屬性指定Bean類(lèi)型,即按照Bean的類(lèi)型進(jìn)行裝配。

2.3 @Qualifier(不能單獨(dú)使用)

該注解與@Autowired注解配合使用。當(dāng)@Autowired注解需要按照名稱(chēng)來(lái)裝配注入,則需要結(jié)合該注解一起使用,Bean的實(shí)例名稱(chēng)由@Qualifier注解的參數(shù)指定。

2.4 @Autowired和@Qualifier的混合使用

@Autowired注解默認(rèn)按照類(lèi)型裝配,如果容器中包含多個(gè)同一類(lèi)型的Bean,那么啟動(dòng)容器時(shí)會(huì)報(bào)找不到指定類(lèi)型bean的異常,解決辦法是結(jié)合 @Qualifier 注解進(jìn)行限定,指定注入的bean名稱(chēng)。

比如接口BaseInterface,它有兩個(gè)實(shí)現(xiàn)類(lèi)AClass和BClass,如果用@Autowired自動(dòng)裝載BaseInterface,會(huì)無(wú)法識(shí)別到底是哪一個(gè)實(shí)現(xiàn)類(lèi)(AClass/BClass),所以就需要用@Qualifier來(lái)配合 @Autowired區(qū)分。

public class Demo{
@Autowired
@Qualifier("id值")  //默認(rèn)類(lèi)名首字母小寫(xiě)  @Qualifier("aClass")
 private BaseInterface base;
}

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • SpringMVC ajax請(qǐng)求的處理方法介紹

    SpringMVC ajax請(qǐng)求的處理方法介紹

    Ajax即異步的 JavaScript和XML,是一種無(wú)需重新加載整個(gè)網(wǎng)頁(yè)的情況下,能夠更新部分模塊的網(wǎng)頁(yè)技術(shù),下面這篇文章主要給大家介紹了關(guān)于SpringMVC Ajax請(qǐng)求的處理,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-11-11
  • SpringMVC學(xué)習(xí)之JSON和全局異常處理詳解

    SpringMVC學(xué)習(xí)之JSON和全局異常處理詳解

    在項(xiàng)目上線之后,往往會(huì)出現(xiàn)一些不可預(yù)料的異常信息,對(duì)于邏輯性或設(shè)計(jì)性問(wèn)題,開(kāi)發(fā)人員或者維護(hù)人員需要通過(guò)日志,查看異常信息并排除異常,這篇文章主要給大家介紹了關(guān)于SpringMVC學(xué)習(xí)之JSON和全局異常處理的相關(guān)資料,需要的朋友可以參考下
    2022-10-10
  • JAVA關(guān)鍵字及作用詳解

    JAVA關(guān)鍵字及作用詳解

    本文主要介紹了Java關(guān)鍵字及作用,具有很好的參考價(jià)值,下面跟著小編一起來(lái)看下吧
    2017-02-02
  • SpringBoot?整合?Spring-Session?實(shí)現(xiàn)分布式會(huì)話項(xiàng)目實(shí)戰(zhàn)

    SpringBoot?整合?Spring-Session?實(shí)現(xiàn)分布式會(huì)話項(xiàng)目實(shí)戰(zhàn)

    本文主要介紹了SpringBoot?整合?Spring-Session?實(shí)現(xiàn)分布式會(huì)話項(xiàng)目實(shí)戰(zhàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • JAVA實(shí)現(xiàn)漢字轉(zhuǎn)拼音功能代碼實(shí)例

    JAVA實(shí)現(xiàn)漢字轉(zhuǎn)拼音功能代碼實(shí)例

    這篇文章主要介紹了JAVA實(shí)現(xiàn)漢字轉(zhuǎn)拼音功能代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-05-05
  • Android內(nèi)存泄漏實(shí)戰(zhàn)解析

    Android內(nèi)存泄漏實(shí)戰(zhàn)解析

    Java是垃圾回收語(yǔ)言的一種。這篇文章主要介紹了Android內(nèi)存泄漏 的相關(guān)資料,需要的朋友可以參考下
    2016-10-10
  • SpringBoot一個(gè)非常蛋疼的無(wú)法啟動(dòng)的問(wèn)題解決

    SpringBoot一個(gè)非常蛋疼的無(wú)法啟動(dòng)的問(wèn)題解決

    這篇文章主要介紹了SpringBoot一個(gè)非常蛋疼的無(wú)法啟動(dòng)的問(wèn)題解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • FasfDFS整合Java實(shí)現(xiàn)文件上傳下載功能實(shí)例詳解

    FasfDFS整合Java實(shí)現(xiàn)文件上傳下載功能實(shí)例詳解

    這篇文章主要介紹了FasfDFS整合Java實(shí)現(xiàn)文件上傳下載功能實(shí)例詳解,需要的朋友可以參考下
    2017-08-08
  • SpringBoot使用Interceptor攔截器的實(shí)例

    SpringBoot使用Interceptor攔截器的實(shí)例

    這篇文章主要介紹了SpringBoot使用Interceptor攔截器的相關(guān)知識(shí),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-03-03
  • nodejs連接dubbo服務(wù)的java工程實(shí)現(xiàn)示例

    nodejs連接dubbo服務(wù)的java工程實(shí)現(xiàn)示例

    這篇文章主要介紹了在項(xiàng)目遷移中,nodejs連接dubbo服務(wù)的java工程實(shí)現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2022-03-03

最新評(píng)論