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

Spring @Bean vs @Service注解區(qū)別

 更新時間:2017年12月13日 09:36:19   作者:Mr_Hospital  
本篇文章主要介紹了Spring @Bean vs @Service注解區(qū)別,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

今天跟同事討論了一下在Spring Boot中,是使用@Configuration和@Bean的組合來創(chuàng)建Bean還是直接使用 @Service等注解放在類上的方式。筆者傾向于使用第一種,即@Configuration和@Bean的組合。

先來看一個例子,目標(biāo)是創(chuàng)建SearchService的一個Bean。

直接使用@Service的方式:

// SearchService.java
package li.koly.search;
import java.util.List;
public interface SearchService {
  List<Object> search(String q);
}

// ElasticSearchServiceImpl.java
package li.koly.search;
import org.springframework.stereotype.Service;
import java.util.Arrays;
import java.util.List;
@ServiceComponent
public class ElasticSearchServiceImpl implements SearchService {
  @Override
  public List<Object> search(String q) {
    return Arrays.asList("hello", q);
  }
}

// Application.java
package li.koly.search;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@SpringBootApplication
@RestController
public class Application {
  @Autowired
  private SearchService searchService;

  @GetMapping("/search")
  public List<Object> hello(String q) {
    return searchService.search(q);
  }

  public static void main(String[] args) {
    SpringApplication.run(Application.class, args);
  }
}

啟動Application,瀏覽器訪問: http://localhost:8081/search?q=koly ,頁面顯示:["hello","koly"]

使用@Configuration和@Bean的方式:

// ElasticSearchServiceImpl.java
package li.koly.search;
import java.util.Arrays;
import java.util.List;
public class ElasticSearchServiceImpl implements SearchService {
  @Override
  public List<Object> search(String q) {
    return Arrays.asList("hello", q);
  }
}

// AppConfig.java
package li.koly.search;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class AppConfig {
  @Bean
  public SearchService searchService() {
    return new ElasticSearchServiceImpl();
  }
}

相比直接使用@Service的代碼,多了一個AppConfig類,移除了放在ElasticSearchServiceImpl上面的@Service注解。一眼看去,代碼和類還多了。那么使用后者的好處是什么呢?

筆者認(rèn)為,好處有:

關(guān)注點分離

使用@Configuration和@Bean的方式,Bean的創(chuàng)建全部放到了一個地方,接口及其實現(xiàn)完全跟Bean創(chuàng)建沒有了關(guān)系。

如果Bean的創(chuàng)建需要改動,那么只需要查看并修改對應(yīng)的Configuration類就行,并不需要去到對應(yīng)的Java Bean進行改動。比如可能有時候Bean創(chuàng)建需要同@Scope或者@Profile配合,此時只需要修改Configuration類就行了。

單一職責(zé)

@service注解本身就承擔(dān)了兩個職責(zé):

一是Bean的創(chuàng)建;

二是將一個類標(biāo)識為一個服務(wù)。

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."

上面是Spring對于@Service注解的說明。也就是說@Service實際上表示了DDD中的無狀態(tài)的,獨立的,以接口的形式提供的一個操作。

而采用@Bean和@Configuration配合的方式,Bean的創(chuàng)建交給了單獨的類,而Service的標(biāo)識交給了Java中的Interface以及類的名字。這點在Spring Data也有所體現(xiàn),比如Repository就是通過名字來標(biāo)識,如CrudRepository。因此Service也通過名字來體現(xiàn)。具體層次定義,通過名字而不依賴Spring提供的注解,便于根據(jù)項目提供更多的層次,比如Mapper層,Validator層等。

另為,本身Bean和Service就是兩個維度的概念。一個關(guān)于具體實現(xiàn),另一個關(guān)于DDD中的概念。

更靈活

使用@Bean的方式,能夠創(chuàng)建庫里面的類的實例。如果使用@Service的方式,沒辦法在庫里面對應(yīng)的類上添加@Service注解。

least knowledge(最小知識原則)

最小知識原則的意思是:

完成功能需要的技術(shù)或者知識越少越好,這樣才能保證項目簡單,同時降低項目的學(xué)習(xí)難度。

由于使用@Service無法創(chuàng)建類庫中的類的實例,因此在遇到類似需求時,不得不使用@Configuration和@Bean的形式。此時,整個項目中就同時存在@Service,@Configuration和@Bean等注解,而這些注解所做的事情都是一樣的,即Bean的創(chuàng)建。

使用@Service,很有可能出現(xiàn)@Service,@Component,@Configuration和@Bean同時存在的情況。

而使用@Configuration和@Bean則完全可以不使用@Service和@Component,符合最小知識原則。

最后,順便說一句,之前Spring的Bean創(chuàng)建是在xml里面,后面使用了Java做配置。不使用xml的主要原因是xml不夠簡潔,且沒有編譯時檢查等功能,而不是說需要將Bean的創(chuàng)建分散到各個類里。

綜上,筆者更傾向與使用@Configuration和@Bean的方式。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 使用OpenFeign實現(xiàn)服務(wù)調(diào)用的方法詳解

    使用OpenFeign實現(xiàn)服務(wù)調(diào)用的方法詳解

    OpenFeign是運行在客戶端的聲明式服務(wù)調(diào)用的框架,通過聲明接口的方式來達到對服務(wù)的調(diào)用,本文就來和大家講講如何使用OpenFeign實現(xiàn)服務(wù)調(diào)用吧
    2023-06-06
  • Java隱藏特性之雙括號初始化詳解

    Java隱藏特性之雙括號初始化詳解

    Java?語言擁有許多隱藏而強大的特性,其中之一是雙括號初始化,這篇文章將詳細(xì)介紹雙括號初始化的概念、用法和示例代碼,希望對大家有所幫助
    2023-12-12
  • Java HashMap算法原理詳細(xì)講解

    Java HashMap算法原理詳細(xì)講解

    在java開發(fā)中,HashMap是最常用、最常見的集合容器類之一,文中通過示例代碼介紹HashMap為啥要二次Hash,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2023-02-02
  • JAVA?module-info.java文件詳解

    JAVA?module-info.java文件詳解

    這篇文章主要介紹了JAVA?module-info.java文件詳解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • java使用influxDB數(shù)據(jù)庫的詳細(xì)代碼

    java使用influxDB數(shù)據(jù)庫的詳細(xì)代碼

    這篇文章主要為大家介紹了java使用influxDB數(shù)據(jù)庫的詳細(xì)代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-07-07
  • java input 調(diào)用手機相機和本地照片上傳圖片到服務(wù)器然后壓縮的方法

    java input 調(diào)用手機相機和本地照片上傳圖片到服務(wù)器然后壓縮的方法

    今天小編就為大家分享一篇java input 實現(xiàn)調(diào)用手機相機和本地照片上傳圖片到服務(wù)器然后壓縮的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-08-08
  • springboot中nacos-client獲取配置的實現(xiàn)方法

    springboot中nacos-client獲取配置的實現(xiàn)方法

    本文主要介紹了springboot中nacos-client獲取配置的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • Java SpringBoot自動裝配原理詳解及源碼注釋

    Java SpringBoot自動裝配原理詳解及源碼注釋

    SpringBoot的自動裝配是拆箱即用的基礎(chǔ),也是微服務(wù)化的前提。其實它并不那么神秘,我在這之前已經(jīng)寫過最基本的實現(xiàn)了,大家可以參考這篇文章,來看看它是怎么樣實現(xiàn)的,我們透過源代碼來把握自動裝配的來龍去脈
    2021-10-10
  • SpringBoot中使用Quartz管理定時任務(wù)的方法

    SpringBoot中使用Quartz管理定時任務(wù)的方法

    這篇文章主要介紹了SpringBoot中使用Quartz管理定時任務(wù)的方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-09-09
  • Java時間處理第三方包Joda?Time使用詳解

    Java時間處理第三方包Joda?Time使用詳解

    這篇文章主要為大家介紹了Java時間處理第三方包Joda?Time使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-07-07

最新評論