最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

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

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

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

之所以區(qū)分開幾種類型,一是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申明,通過spring的自動(dòng)掃描機(jī)制,在規(guī)定的類路徑中尋找標(biāo)注了@Component,@Service,@Repository,@Controller注解的類,并把這些類納入進(jìn)容器中進(jìn)行管理。

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

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

Spring中的主要注解

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

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

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

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

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

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

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

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

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

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

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

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

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

2.1 @Autowired【***常用】

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

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

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

@Autowired注解就相當(dāng)于從Spring容器中通過類型,實(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)是按照名稱來裝配注入的,只有當(dāng)找不到與名稱匹配的Bean才會(huì)按照類型來裝配注入;而@Autowired默認(rèn)按照Bean的類型進(jìn)行裝配,如果想按照名稱來裝配注入,則需要結(jié)合@Qualifier注解一起使用。

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

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

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

2.4 @Autowired和@Qualifier的混合使用

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

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

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

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

相關(guān)文章

  • SpringCloud Hystrix熔斷器使用方法介紹

    SpringCloud Hystrix熔斷器使用方法介紹

    通過hystrix可以解決雪崩效應(yīng)問題,它提供了資源隔離、降級(jí)機(jī)制、融斷、緩存等功能。接下來通過本文給大家分享SpringCloud集成Hystrix熔斷,感興趣的朋友一起看看吧
    2023-03-03
  • 詳解Java如何使用注解來配置Spring容器

    詳解Java如何使用注解來配置Spring容器

    這篇文章我們將介紹如何在Java代碼中使用注解來配置Spring容器,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)有一定參考價(jià)值,感興趣的可以了解一下
    2022-06-06
  • Java?Unsafe創(chuàng)建對(duì)象的方法實(shí)現(xiàn)

    Java?Unsafe創(chuàng)建對(duì)象的方法實(shí)現(xiàn)

    Java中使用Unsafe實(shí)例化對(duì)象是一項(xiàng)十分有趣而且強(qiáng)大的功能,本文主要介紹了Java?Unsafe創(chuàng)建對(duì)象的方法實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • 分析Spring框架之設(shè)計(jì)與實(shí)現(xiàn)資源加載器

    分析Spring框架之設(shè)計(jì)與實(shí)現(xiàn)資源加載器

    Spring框架是由于軟件開發(fā)的復(fù)雜性而創(chuàng)建的。然而,Spring的用途不僅僅限于服務(wù)器端的開發(fā)。從簡(jiǎn)單性、可測(cè)試性和松耦合性角度而言,絕大部分Java應(yīng)用都可以從Spring中受益。今天來分析它的設(shè)計(jì)與實(shí)現(xiàn)資源加載器,從Spring.xml解析和注冊(cè)Bean對(duì)象
    2021-06-06
  • Spring配置數(shù)據(jù)源流程與作用詳解

    Spring配置數(shù)據(jù)源流程與作用詳解

    這篇文章主要介紹了使用SpringBoot配置多數(shù)據(jù)源的經(jīng)驗(yàn)分享,本文通過示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-08-08
  • es(elasticsearch)整合SpringCloud(SpringBoot)搭建教程詳解

    es(elasticsearch)整合SpringCloud(SpringBoot)搭建教程詳解

    這篇文章主要介紹了es(elasticsearch)整合SpringCloud(SpringBoot)搭建教程,本文通過實(shí)例圖文相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-06-06
  • Java多線程中線程池常見7個(gè)參數(shù)的詳解以及執(zhí)行流程

    Java多線程中線程池常見7個(gè)參數(shù)的詳解以及執(zhí)行流程

    本文主要介紹了Java多線程中線程池常見7個(gè)參數(shù)的詳解以及執(zhí)行流程,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • JPA默認(rèn)值設(shè)置沒有效果的解決

    JPA默認(rèn)值設(shè)置沒有效果的解決

    這篇文章主要介紹了JPA默認(rèn)值設(shè)置沒有效果的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • 圖解如何在Spring Boot中使用JSP頁面

    圖解如何在Spring Boot中使用JSP頁面

    這篇文章主要介紹了圖解如何在Spring Boot中使用JSP頁面,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-07-07
  • 兩種java實(shí)現(xiàn)二分查找的方式

    兩種java實(shí)現(xiàn)二分查找的方式

    這篇文章主要給大家分享的是java實(shí)現(xiàn)二分查找的方式,二分查找是一種查詢效率非常高的查找算法。又稱折半查找。下面文章我們介紹了兩種方法,需要的朋友可以參考一下
    2021-09-09

最新評(píng)論

武汉市| 长顺县| 尚义县| 涪陵区| 老河口市| 丰镇市| 远安县| 印江| 广东省| 积石山| 宝清县| 松滋市| 盐亭县| 田阳县| 禄丰县| 扎囊县| 樟树市| 鲁山县| 丹阳市| 鹤岗市| 抚宁县| 淮滨县| 吉安市| 玉树县| 宝应县| 洪雅县| 和林格尔县| 扎兰屯市| 剑川县| 黄龙县| 扎鲁特旗| 荣成市| 渝北区| 阆中市| 将乐县| 阿巴嘎旗| 绥棱县| 秦皇岛市| 张家口市| 明溪县| 大埔县|