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

SpringBoot對(duì)不同Bean注解的區(qū)別和使用場(chǎng)景說(shuō)明

 更新時(shí)間:2023年03月06日 17:15:48   作者:freesOcean  
這篇文章主要介紹了SpringBoot對(duì)不同Bean注解的區(qū)別和使用場(chǎng)景說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

對(duì)不同Bean注解的區(qū)別和使用場(chǎng)景

什么是Bean?

談Bean的潛臺(tái)詞是在說(shuō)Spring中的Bean,我們都知道Spring中的BeanFactory,而Bean這個(gè)概念也是由此而來(lái)。在Spring中,只要一個(gè)類能被實(shí)例化,并被Spring容器管理,這個(gè)類就稱為一個(gè)Bean,或者SpringBean.

除此之外,我們還聽到一些其他的詞:

JavaBean、POJO、VO、DTO

這些叫法又是什么意思?使用的場(chǎng)景又是什么?

JavaBean

一個(gè)JavaBean是一個(gè)遵循Sun公司JavaBean規(guī)范的類。JavaBean可以理解為java中可以復(fù)用的組件,它滿足下面條件:

  • 有一個(gè)公共的缺省構(gòu)造方法
  • 這個(gè)類的屬性使用getter和setter來(lái)訪問,并且命名遵從標(biāo)準(zhǔn)的規(guī)范
  • 這個(gè)類可以序列化

POJO(Plain Ordinary Object )

POJO是一個(gè)歷史遺留名稱,為什么這樣講?因?yàn)镻OJO是用來(lái)指明該對(duì)象不同于Entity Beans

EntityBeans是EJB中的概念,而EJB在Spring出現(xiàn)后,就漸漸淡出了歷史的舞臺(tái)。所以,POJO在Martin Fowler提出時(shí),就是指那些沒有實(shí)現(xiàn)任何EJB接口的普通java類。而延用至今,嚴(yán)格講,所有的java類,都是POJO,因?yàn)楝F(xiàn)在沒有人在使用ejb這些老古董了。但是有時(shí)我們?yōu)榱藚^(qū)分Spring Bean,可以將沒有被Spring管理的類稱為POJO。

VO (Value Object)

VO指一個(gè)對(duì)象例如 java.lang.Integer 它持有一些數(shù)據(jù),或數(shù)據(jù)對(duì)象。這個(gè)概念是 Martin Fowler企業(yè)應(yīng)用架構(gòu)中提出的概念。

DTO (Data Transfer Object)

DTO也是EJB種提出的一個(gè)概念,目的就是在數(shù)據(jù)傳輸時(shí),通過(guò)直接傳輸對(duì)象,在網(wǎng)絡(luò)中傳輸數(shù)據(jù)。

小結(jié):

所以對(duì)我們而言,VO和DTO沒有區(qū)別(但是Martin Fowler可能用它們表示了不同的細(xì)分概念),而大多數(shù)時(shí)候,它們遵循JavaBean規(guī)范,所以它們也都是JavaBean。當(dāng)然,它們都是POJO。

可以看出,它們本質(zhì)上都是在指一個(gè)java對(duì)象,為了區(qū)分場(chǎng)景和功能,有了不同的叫法。開發(fā)中有時(shí)還會(huì)出現(xiàn),Entity, Domain等。用來(lái)表示對(duì)實(shí)體的映射,或表的映射。一般可以這樣做來(lái)規(guī)范開發(fā):

  • 對(duì)于Spring管理的對(duì)象,稱為Bean
  • 映射到數(shù)據(jù)表的對(duì)象實(shí)體類,稱為entity,放在entity目錄
  • 對(duì)于接口用于封裝數(shù)據(jù),比如接受一個(gè)json入?yún)ⅲ瑸榱朔奖?,定義一個(gè)對(duì)象封裝參數(shù),可以叫dto (或pojo) 放在pojo包,以表明它不是某個(gè)表的映射類。

注解@Bean @Component …等都有什么區(qū)別?

用SpringBoot開發(fā)應(yīng)用時(shí),我們會(huì)用注解將對(duì)象交給Spring容器管理。這些注解包括:

@Component ,@Service, @Bean, @Controller ,@Repository

這些注解本質(zhì)上,都是Spring標(biāo)識(shí),用來(lái)進(jìn)行Bean的自動(dòng)檢測(cè)。標(biāo)注這些注解的類會(huì)被Spring容器管理。

那為何要有這些分類,為何不使用一個(gè)注解就來(lái)搞定所有的工作?

首先這幾個(gè)注解根據(jù)語(yǔ)義,用在不同的層面

  • @Componet一般的組件
  • @Service是Service層組件
  • @Bean這個(gè)要和@Configuration一塊使用,后邊再說(shuō)
  • @Controller是用在SpringMVC控制層
  • @Repository是數(shù)據(jù)訪問層

Spring這樣設(shè)計(jì),是因?yàn)?,這些注解不光是要做自動(dòng)檢測(cè)。同時(shí)有不同的功能,比如@Repository注解,Spring會(huì)增加增強(qiáng)處理,進(jìn)行相關(guān)的異常處理。

@Controller的bean會(huì)處理網(wǎng)絡(luò)請(qǐng)求相關(guān)邏輯。所以你給所有的Bean都標(biāo)注同一個(gè)注解,確實(shí)都會(huì)注入Spring容器,但是功能可能就會(huì)失效。

而且隨著Spring版本升級(jí),可能會(huì)增加更多差異化處理。所以我們應(yīng)該按照規(guī)范來(lái)注解。

再說(shuō)到@Bean,我們知道Spring早期,還是通過(guò)xml配置Bean例如:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="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.xsd?
? ? http://www.springframework.org/schema/context?
? ? http://www.springframework.org/schema/context/spring-context.xsd">
? ? ?
? ? <bean id="operations" ? ?class="com.howtodoinjava.spring.beans.Operations"></bean>
? ? <bean id="employee" ?class="com.howtodoinjava.spring.beans.Employee"></bean>
? ? ?
</beans>?

現(xiàn)在,你可以理解@Configuration注解的類就是一個(gè)xml配置文件,中間@Bean注解就是xml中的bean節(jié)點(diǎn)

@Configuration
public class BeanConfiguration {
? ? ?@Bean
? ? ?public Operations operation(){
? ? ? ? ?return new Operations();
? ? ?}
? ? ?@Bean
? ? ?public Employee employee(){
? ? ? ? ?return new Employee();
? ? ?}
? ??
}

這兩種方式都是將@Bean注解返回值注入Spring容器。SpringBoot在啟動(dòng)時(shí),會(huì)掃描@Configuration注解,進(jìn)行注入。

SpringBoot注入對(duì)象沖突如何解決?

好了,現(xiàn)在我們終于把想要的組件交給Spring容器管理。我們?cè)撊绾问褂茫?/p>

我們可以用Spring上下文,獲取需要的對(duì)象

public static void main(String[] args) {
?? ??? ?ApplicationContext application = SpringApplication.run(ConsumerApplication.class, args);
?? ??? ?application.getBean(Employee.class);
}

一般我們用@Autowire 注解,獲取容器中的bean

@Autowire
private Employee employee;

有時(shí)我們?cè)谌萜髦行枰⑷胍粋€(gè)類的多個(gè)實(shí)例,以滿足需求。

比如一個(gè)接口的實(shí)現(xiàn)類有兩個(gè),如果直接通過(guò)@Component注入容器,則會(huì)報(bào)錯(cuò)。

如何區(qū)分?

@Component("bean01")
public class Bean01 implement AA{
? ??
}

@Component("bean02")
public class Bean02 implement AA{
? ??
}

沒錯(cuò),通過(guò)在注解中標(biāo)識(shí)一個(gè)名稱,來(lái)區(qū)分該對(duì)象的不同實(shí)例。

獲取時(shí):最終會(huì)初始化一個(gè)Bean01

@Autowire
@Qualifier("bean01")
private AA a;

這樣有個(gè)問題,就是每次使用都需要顯示聲明@Qualifier來(lái)指定。有的場(chǎng)景下,我們可能想默認(rèn)使用一個(gè),其他情況再顯式指定。這就涉及到@Primary

在注解時(shí),標(biāo)注了@Primary的Bean在沒有指定的情況下,會(huì)默認(rèn)加載。

比如:

@Component
@Primary
public class Bean01 implement AA{
? ??
}

@Component("bean02")
public class Bean02 implement AA{
? ??
}

使用時(shí): 默認(rèn)初始化的就是Bean01

@Autowire
private AA a;

SpringBoot的各種注解

@Configuration

表示當(dāng)前類可以用作配置文件使用

可以在這個(gè)類中使用@bean注解來(lái)創(chuàng)建對(duì)象(類似于單例模式的餓漢式)。

方法中需要有返回值+使用new這個(gè)關(guān)鍵字

spring會(huì)把這個(gè)返回值放入spring容器中;

在后面的方法中如果要調(diào)用這個(gè)方法(@bean中有個(gè)屬性name,命名name的值,在后面的@resource中使用使用按照名稱注入)沒有使用name這個(gè)屬性的話,默認(rèn)情況下@bean方法的方法名;

  • @importResource:用來(lái)導(dǎo)入xml文件,xml文件里面也是聲明java對(duì)象,同樣也是導(dǎo)入到spring容器中
  • @propertySource:用來(lái)導(dǎo)入property文件

可以和@value一起使用,@value來(lái)用讀取property文件的內(nèi)容;

  • @componentScan:用來(lái)指定掃描注解的位置,掃描把掃描到的注解生成對(duì)象放入spring容器中,

屬性:basePackage:指定掃描到包的位置

默認(rèn)情況下是掃描當(dāng)前包和子包的位置

  • @SpringBootApplication

由三個(gè)主要注解組合而成:@SpringBootConfiguration+@EnableAutoConfiguration+@ComponentScan

  • @SpringBootCOnfiguration:表示這個(gè)類可以作為配置類使用;
  • @EnableAutoConfiguration:?jiǎn)?dòng)自動(dòng)注入,把java文件配置好,直接注入到Spring容器中;
  • @ComponentScan:表示文件下的注解,用來(lái)創(chuàng)建對(duì)象
  • @ConfigurationProperties:使用在java類上,表示使用K-V自動(dòng)注入到對(duì)應(yīng)的java屬性上,

參數(shù)prefix:把properties文件中對(duì)應(yīng)的前綴.后面的屬性對(duì)應(yīng)到properties文件的屬性中(使用在類上,所以在屬性上可以自動(dòng)賦值)

和@value是兩種用法

@controller、@service、@Repository、@component

這些注解使用在java類上,componentScan會(huì)掃描這些完成對(duì)象的創(chuàng)建

  • @controller使用在控制層,完成接收請(qǐng)求參數(shù),調(diào)用service層完成用戶的請(qǐng)求,返回視圖層給用戶;
  • @Service:業(yè)務(wù)層的邏輯,調(diào)用dao層完成用戶對(duì)數(shù)據(jù)庫(kù)的操作,將處理結(jié)果返回給controller;
  • @Repository:使用對(duì)數(shù)據(jù)庫(kù)進(jìn)行持久化操作(保證用戶的數(shù)據(jù)可以寫入到數(shù)據(jù)庫(kù)中),將處理結(jié)果返回給service層

##在SpringBoot中使用@mapper代替這個(gè)注解。用來(lái)告訴mybatis創(chuàng)建這個(gè)對(duì)象的動(dòng)態(tài)代理對(duì)象

##@mapperScan(basePackage:指定的mapper文件的路徑),使用在主啟動(dòng)類上,省的一個(gè)一個(gè)dao層都要使用到@mapper

  • @component:用來(lái)創(chuàng)建對(duì)象,但是對(duì)象沒有前面三個(gè)有特殊的功能
  • @transaction:表示開啟事務(wù)(一般使用在service層)有五個(gè)參數(shù)

1、傳播行為 2、隔離級(jí)別 3、超時(shí)行為 4、回滾規(guī)則 5、是否只讀

@RestController ? = @responseBody+@controller

使用在類上:表示這個(gè)類是控制層,而且類中的所有方法加上@responseBody這個(gè)注解

總結(jié)

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

相關(guān)文章

  • spring @Scheduled注解的使用誤區(qū)及解決

    spring @Scheduled注解的使用誤區(qū)及解決

    這篇文章主要介紹了spring @Scheduled注解的使用誤區(qū)及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • Maven發(fā)布封裝到中央倉(cāng)庫(kù)時(shí)候報(bào)錯(cuò):no default secret key

    Maven發(fā)布封裝到中央倉(cāng)庫(kù)時(shí)候報(bào)錯(cuò):no default secret key

    這篇文章主要介紹了Maven發(fā)布封裝到中央倉(cāng)庫(kù)時(shí)候報(bào)錯(cuò):no default secret key,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • SpringCloud?Bus組件的使用配置詳解

    SpringCloud?Bus組件的使用配置詳解

    bus稱之為springcloud中消息總線,主要用來(lái)在微服務(wù)系統(tǒng)中實(shí)現(xiàn)遠(yuǎn)端配置更新時(shí)通過(guò)廣播形式通知所有客戶端刷新配置信息,避免手動(dòng)重啟服務(wù)的工作,這篇文章主要介紹了SpringCloud?Bus組件的使用,需要的朋友可以參考下
    2022-03-03
  • spring boot+jwt實(shí)現(xiàn)api的token認(rèn)證詳解

    spring boot+jwt實(shí)現(xiàn)api的token認(rèn)證詳解

    這篇文章主要給大家介紹了關(guān)于spring boot+jwt實(shí)現(xiàn)api的token認(rèn)證的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一學(xué)習(xí)學(xué)習(xí)吧
    2018-12-12
  • spring boot + jpa + kotlin入門實(shí)例詳解

    spring boot + jpa + kotlin入門實(shí)例詳解

    這篇文章主要介紹了spring boot + jpa + kotlin入門實(shí)例詳解 ,需要的朋友可以參考下
    2017-07-07
  • scala+redis實(shí)現(xiàn)分布式鎖的示例代碼

    scala+redis實(shí)現(xiàn)分布式鎖的示例代碼

    這篇文章主要介紹了scala+redis實(shí)現(xiàn)分布式鎖的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06
  • spring boot中nativeQuery的用法

    spring boot中nativeQuery的用法

    這篇文章主要介紹了spring boot中nativeQuery的作用,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-07-07
  • JAVA實(shí)現(xiàn)連接本地打印機(jī)并打印文件的實(shí)現(xiàn)代碼

    JAVA實(shí)現(xiàn)連接本地打印機(jī)并打印文件的實(shí)現(xiàn)代碼

    這篇文章主要介紹了JAVA實(shí)現(xiàn)連接本地打印機(jī)并打印文件的實(shí)現(xiàn)代碼,需要的朋友可以參考下
    2019-10-10
  • java.sql.SQLException:?connection?holder?is?null錯(cuò)誤解決辦法

    java.sql.SQLException:?connection?holder?is?null錯(cuò)誤解決辦法

    這篇文章主要給大家介紹了關(guān)于java.sql.SQLException:?connection?holder?is?null錯(cuò)誤的解決辦法,這個(gè)錯(cuò)誤通常是由于連接對(duì)象為空或未正確初始化導(dǎo)致的,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-02-02
  • 使用HTTPclient保持長(zhǎng)連接

    使用HTTPclient保持長(zhǎng)連接

    這篇文章主要介紹了使用HTTPclient保持長(zhǎng)連接,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10

最新評(píng)論