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

Spring?@bean和@component注解區(qū)別

 更新時(shí)間:2022年01月18日 10:17:23   作者:公眾號(hào)_IT老哥  
本文主要介紹了Spring?@bean和@component注解區(qū)別,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文打算介紹幾個(gè)不太容易說(shuō)出其區(qū)別,或者用途的 Spring 注解,比如 @Component 與 @Bean 的比較,@ControllerAdvice 是如何處理自定義異常的等等。

Spring 中的一些注解

1. @Component 和 @Bean 的區(qū)別是什么?

作用對(duì)象不同:@Component 注解作用于類,而 @Bean 注解作用于方法、
@Component 通常是通過(guò)路徑掃描來(lái)自動(dòng)偵測(cè)以及自動(dòng)裝配到 Spring 容器中(我們可以使用 @ComponentScan 注解定義要掃描的路徑從中找出標(biāo)識(shí)了需要裝配的類自動(dòng)裝配到 Spring 的 bean 容器中)。@Bean 注解通常是我們?cè)跇?biāo)有該注解的方法中定義產(chǎn)生這個(gè) bean,@Bean 告訴了 Spring 這是某個(gè)類的實(shí)例,當(dāng)我們需要用它的時(shí)候還給我。
@Bean 注解比 @Component 注解的自定義性更強(qiáng),而且很多地方我們只能通過(guò) @Bean 注解來(lái)注冊(cè) bean。比如當(dāng)我們引用第三方庫(kù)中的類需要裝配到 Spring 容器時(shí),只能通過(guò) @Bean 來(lái)實(shí)現(xiàn)。

@Bean 注解使用示例:

@Configuration
public class AppConfig {
    @Bean
public TransferService transferService() {
return new TransferServiceImpl();
    }
}

@Component 注解使用示例:

@Component
public class ServiceImpl implements AService {
    ....
}

下面這個(gè)例子是通過(guò) @Component 無(wú)法實(shí)現(xiàn)的:

@Bean
public OneService getService(status) {
case (status)  {
when 1:
return new serviceImpl1();
when 2:
return new serviceImpl2();
when 3:
return new serviceImpl3();
    }
}

2. Autowire 和 @Resource 的區(qū)別

@Autowire 和 @Resource都可以用來(lái)裝配bean,都可以用于字段或setter方法。Spring Boot 學(xué)習(xí)筆記分享給你。
@Autowire 默認(rèn)按類型裝配,默認(rèn)情況下必須要求依賴對(duì)象必須存在,如果要允許 null 值,可以設(shè)置它的 required 屬性為 false。
@Resource 默認(rèn)按名稱裝配,當(dāng)找不到與名稱匹配的 bean 時(shí)才按照類型進(jìn)行裝配。名稱可以通過(guò) name 屬性指定,如果沒(méi)有指定 name 屬性,當(dāng)注解寫(xiě)在字段上時(shí),默認(rèn)取字段名,當(dāng)注解寫(xiě)在 setter 方法上時(shí),默認(rèn)取屬性名進(jìn)行裝配。
注意:如果 name 屬性一旦指定,就只會(huì)按照名稱進(jìn)行裝配。

@Autowire和@Qualifier配合使用效果和@Resource一樣:

@Autowired(required = false) @Qualifier("example")
private Example example;

@Resource(name = "example")
private Example example;

@Resource 裝配順序

  • 如果同時(shí)指定 name 和 type,則從容器中查找唯一匹配的 bean 裝配,找不到則拋出異常;
  • 如果指定 name 屬性,則從容器中查找名稱匹配的 bean 裝配,找不到則拋出異常;
  • 如果指定 type 屬性,則從容器中查找類型唯一匹配的 bean 裝配,找不到或者找到多個(gè)拋出異常;
  • 如果不指定,則自動(dòng)按照 byName 方式裝配,如果沒(méi)有匹配,則回退一個(gè)原始類型進(jìn)行匹配,如果匹配則自動(dòng)裝配。

3. 將一個(gè)類聲明為 Spring 的 bean 的注解有哪些?

  • @Component :通用的注解,可標(biāo)注任意類為 Spring 的組件。如果一個(gè) Bean 不知道屬于哪個(gè)層,可以使用 @Component 注解標(biāo)注。
  • @Repository :對(duì)應(yīng)持久層即 Dao 層,主要用于數(shù)據(jù)庫(kù)相關(guān)操作。
  • @Service :對(duì)應(yīng)服務(wù)層,主要設(shè)計(jì)一些復(fù)雜的邏輯,需要用到 Dao 層。
  • @Controller :對(duì)應(yīng) Spring MVC 控制層,主要用來(lái)接受用戶請(qǐng)求并調(diào)用 Service 層返回?cái)?shù)據(jù)給前端頁(yè)面。
  • @Configuration :聲明該類為一個(gè)配置類,可以在此類中聲明一個(gè)或多個(gè) @Bean 方法。

4. @Configuration :配置類注解

@Configuration 表明在一個(gè)類里可以聲明一個(gè)或多個(gè) @Bean 方法,并且可以由 Spring 容器處理,以便在運(yùn)行時(shí)為這些 bean 生成 bean 定義和服務(wù)請(qǐng)求,例如:

@Configuration
public class AppConfig {

? ? @Bean
public MyBean myBean() {
// instantiate, configure and return bean ...
? ? }
}

我們可以通過(guò) AnnotationConfigApplicationContext 來(lái)注冊(cè) @Configuration 類:

AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
ctx.register(AppConfig.class);
ctx.refresh();
MyBean myBean = ctx.getBean(MyBean.class);
// use myBean ...

另外也可以通過(guò)組件掃描(component scanning)來(lái)加載,@Configuration 使用 @Component 進(jìn)行原注解,因此 @Configuration 類也可以被組件掃描到(特別是使用 XML 的  元素)。@Configuration 類不僅可以使用組件掃描進(jìn)行引導(dǎo),還可以使用 @ComponentScan 注解自行配置組件掃描:

@Configuration
@ComponentScan("com.acme.app.services")
public class AppConfig {
// various @Bean definitions ...
}

使用 @Configuration 的約束:

  • 配置類必須以類的方式提供(比如不能是由工廠方法返回的實(shí)例)。
  • 配置類必須是非 final 的。
  • 配置類必須是非本地的(即可能不在方法中聲明),native 標(biāo)注的方法。
  • 任何嵌套的配置類必須聲明為 static。
  • @Bean 方法可能不會(huì)反過(guò)來(lái)創(chuàng)建更多的配置類。
  • 除了單獨(dú)使用 @Configuration 注解,我們還可以結(jié)合一些外部的 bean 或者注解共同使用,比如 Environment API,@PropertySource,@Value,@Profile 等等許多,這里就不做詳細(xì)介紹了,更多的用法可以參看 Spring @Configuration 的相關(guān)文檔 。

推薦一個(gè) Spring Boot 基礎(chǔ)教程及實(shí)戰(zhàn)示例:https://github.com/javastacks...

5. @ControllerAdvice :處理全局異常利器

在 Spring 3.2 中,新增了 @ControllerAdvice、@RestControllerAdvice、@RestController 注解,可以用于定義 @ExceptionHandler、@InitBinder、@ModelAttribute,并應(yīng)用到所有 @RequestMapping 、@PostMapping、@GetMapping等這些 Controller 層的注解中。

默認(rèn)情況下,@ControllerAdvice 中的方法應(yīng)用于全局所有的 Controller。而使用選擇器 annotations(),basePackageClasses() 和 basePackages() (或其別名value())來(lái)定義更小范圍的目標(biāo) Controller 子集。Spring Boot 學(xué)習(xí)筆記分享給你。

如果聲明了多個(gè)選擇器,則應(yīng)用 OR 邏輯,這意味著所選的控制器應(yīng)匹配至少一個(gè)選擇器。請(qǐng)注意,選擇器檢查是在運(yùn)行時(shí)執(zhí)行的,因此添加許多選擇器可能會(huì)對(duì)性能產(chǎn)生負(fù)面影響并增加復(fù)雜性。

@ControllerAdvice 我們最常使用的是結(jié)合 @ExceptionHandler 用于全局異常的處理。可以結(jié)合以下例子,我們可以捕獲自定義的異常進(jìn)行處理,并且可以自定義狀態(tài)碼返回:

@ControllerAdvice("com.developlee.errorhandle")
public class MyExceptionHandler {
    /**
     * 捕獲CustomException
     * @param e
     * @return json格式類型
     */
    @ResponseBody
    @ExceptionHandler({CustomException.class}) //指定攔截異常的類型
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) //自定義瀏覽器返回狀態(tài)碼
    public Map>String, Object< customExceptionHandler(CustomException e) {
        Map&lt;String, Object&gt; map = new HashMap&lt;&gt;();
map.put("code", e.getCode());
map.put("msg", e.getMsg());
return map;
    }
}

更多信息可以參看 Spring @ControllerAdvice 的官方文檔。推薦一個(gè) Spring Boot 基礎(chǔ)教程及實(shí)戰(zhàn)示例:https://github.com/javastacks/spring-boot-best-practice

6. @Component, @Repository, @Service 的區(qū)別

@Component是一個(gè)通用的Spring容器管理的單例bean組件。而@Repository, @Service, @Controller就是針對(duì)不同的使用場(chǎng)景所采取的特定功能化的注解組件。

因此,當(dāng)你的一個(gè)類被@Component所注解,那么就意味著同樣可以用@Repository, @Service, @Controller 來(lái)替代它,同時(shí)這些注解會(huì)具備有更多的功能,而且功能各異。

最后,如果你不知道要在項(xiàng)目的業(yè)務(wù)層采用@Service還是@Component注解。那么,@Service是一個(gè)更好的選擇。

總結(jié)

以上簡(jiǎn)單介紹了幾種 Spring 中的幾個(gè)注解及代碼示例,就我個(gè)人而言,均是平時(shí)用到且不容易理解的幾個(gè),或者容易忽略的幾個(gè)。當(dāng)然,這篇文章并沒(méi)有完全介紹完,在今后還會(huì)繼續(xù)補(bǔ)充完善。

到此這篇關(guān)于Spring @bean和@component注解區(qū)別的文章就介紹到這了,更多相關(guān)Spring @bean @component內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java中的byte & 0xff到底有什么作用?

    Java中的byte & 0xff到底有什么作用?

    這篇文章主要介紹了Java中的byte & 0xff到底有什么作用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • 使用@RequestBody傳對(duì)象參數(shù)時(shí)碰到的坑

    使用@RequestBody傳對(duì)象參數(shù)時(shí)碰到的坑

    這篇文章主要介紹了使用@RequestBody傳對(duì)象參數(shù)時(shí)碰到的坑,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • Redis作為緩存應(yīng)用的情形詳細(xì)分析

    Redis作為緩存應(yīng)用的情形詳細(xì)分析

    實(shí)際開(kāi)發(fā)中緩存處理是必須的,不可能我們每次客戶端去請(qǐng)求一次服務(wù)器,服務(wù)器每次都要去數(shù)據(jù)庫(kù)中進(jìn)行查找,為什么要使用緩存?說(shuō)到底是為了提高系統(tǒng)的運(yùn)行速度
    2023-01-01
  • Java中Collections.sort的使用

    Java中Collections.sort的使用

    本文主要介紹了Java中Collections.sort的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • Spring Gateway處理微服務(wù)的路由轉(zhuǎn)發(fā)機(jī)制

    Spring Gateway處理微服務(wù)的路由轉(zhuǎn)發(fā)機(jī)制

    我們?cè)敿?xì)地介紹了Spring Gateway,這個(gè)基于Spring 5、Spring Boot 2和Project Reactor的API網(wǎng)關(guān),通過(guò)這篇文章,我們可以清晰地看到Spring Gateway的工作原理,以及它的強(qiáng)大之處,感興趣的朋友一起看看吧
    2024-08-08
  • Spring Boot + Vue 前后端分離項(xiàng)目如何踢掉已登錄用戶

    Spring Boot + Vue 前后端分離項(xiàng)目如何踢掉已登錄用戶

    這篇文章主要介紹了Spring Boot + Vue 前后端分離項(xiàng)目如何踢掉已登錄用戶,需要的朋友可以參考下
    2020-05-05
  • Java Predicate接口源碼使用示例

    Java Predicate接口源碼使用示例

    Java8引入了許多函數(shù)式接口(Functional Interface),Predicate(斷言)就是其中一個(gè),它的主要作用可以簡(jiǎn)單描述為:向其傳入一個(gè)對(duì)象(可以理解為參數(shù)),將得到一個(gè)布爾值作為輸出,這篇文章主要介紹了Java Predicate接口源碼使用示例,需要的朋友可以參考下
    2025-04-04
  • idea中如何連接hive

    idea中如何連接hive

    這篇文章主要介紹了idea中如何連接hive問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • Spring注解之@Import的簡(jiǎn)單介紹

    Spring注解之@Import的簡(jiǎn)單介紹

    @Import是Spring基于Java注解配置的主要組成部分,下面這篇文章主要給大家介紹了關(guān)于Spring注解之@Import的簡(jiǎn)單介紹,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-12-12
  • Java中@JSONField注解用法、場(chǎng)景與實(shí)踐詳解

    Java中@JSONField注解用法、場(chǎng)景與實(shí)踐詳解

    這篇文章主要給大家介紹了關(guān)于Java中@JSONField注解用法、場(chǎng)景與實(shí)踐的相關(guān)資料,并結(jié)合實(shí)際應(yīng)用場(chǎng)景,幫助開(kāi)發(fā)者在項(xiàng)目中更高效地處理JSON數(shù)據(jù),文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-12-12

最新評(píng)論

寿宁县| 陈巴尔虎旗| 张家口市| 徐水县| 托里县| 凤冈县| 南和县| 育儿| 大竹县| 建瓯市| 高台县| 内乡县| 东乡| 略阳县| 六安市| 凌海市| 田东县| 德安县| 城步| 南康市| 砚山县| 兴隆县| 铁岭县| 镶黄旗| 宁远县| 上蔡县| 松江区| 土默特右旗| 阿拉尔市| 嘉善县| 临海市| 法库县| 龙海市| 玛曲县| 蓝山县| 苍溪县| 长岛县| 新和县| 桑植县| 务川| 措美县|