亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

SpringBoot對不同Bean注解的區別和使用場景是什么

發布時間:2023-03-07 10:15:01 來源:億速云 閱讀:150 作者:iii 欄目:開發技術

這篇文章主要講解了“SpringBoot對不同Bean注解的區別和使用場景是什么”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“SpringBoot對不同Bean注解的區別和使用場景是什么”吧!

對不同Bean注解的區別和使用場景

什么是Bean?

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

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

JavaBean、POJO、VO、DTO

這些叫法又是什么意思?使用的場景又是什么?

JavaBean

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

  • 有一個公共的缺省構造方法

  • 這個類的屬性使用getter和setter來訪問,并且命名遵從標準的規范

  • 這個類可以序列化

POJO(Plain Ordinary Object )

POJO是一個歷史遺留名稱,為什么這樣講?因為POJO是用來指明該對象不同于Entity Beans

EntityBeans是EJB中的概念,而EJB在Spring出現后,就漸漸淡出了歷史的舞臺。所以,POJO在Martin Fowler提出時,就是指那些沒有實現任何EJB接口的普通java類。而延用至今,嚴格講,所有的java類,都是POJO,因為現在沒有人在使用ejb這些老古董了。但是有時我們為了區分Spring Bean,可以將沒有被Spring管理的類稱為POJO。

VO (Value Object)

VO指一個對象例如 java.lang.Integer 它持有一些數據,或數據對象。這個概念是 Martin Fowler企業應用架構中提出的概念。

DTO (Data Transfer Object)

DTO也是EJB種提出的一個概念,目的就是在數據傳輸時,通過直接傳輸對象,在網絡中傳輸數據。

小結:

所以對我們而言,VO和DTO沒有區別(但是Martin Fowler可能用它們表示了不同的細分概念),而大多數時候,它們遵循JavaBean規范,所以它們也都是JavaBean。當然,它們都是POJO。

可以看出,它們本質上都是在指一個java對象,為了區分場景和功能,有了不同的叫法。開發中有時還會出現,Entity, Domain等。用來表示對實體的映射,或表的映射。一般可以這樣做來規范開發:

  • 對于Spring管理的對象,稱為Bean

  • 映射到數據表的對象實體類,稱為entity,放在entity目錄

  • 對于接口用于封裝數據,比如接受一個json入參,為了方便,定義一個對象封裝參數,可以叫dto (或pojo) 放在pojo包,以表明它不是某個表的映射類。

注解@Bean @Component …等都有什么區別?

用SpringBoot開發應用時,我們會用注解將對象交給Spring容器管理。這些注解包括:

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

這些注解本質上,都是Spring標識,用來進行Bean的自動檢測。標注這些注解的類會被Spring容器管理。

那為何要有這些分類,為何不使用一個注解就來搞定所有的工作?

首先這幾個注解根據語義,用在不同的層面

  • @Componet一般的組件

  • @Service是Service層組件

  • @Bean這個要和@Configuration一塊使用,后邊再說

  • @Controller是用在SpringMVC控制層

  • @Repository是數據訪問層

Spring這樣設計,是因為,這些注解不光是要做自動檢測。同時有不同的功能,比如@Repository注解,Spring會增加增強處理,進行相關的異常處理。

@Controller的bean會處理網絡請求相關邏輯。所以你給所有的Bean都標注同一個注解,確實都會注入Spring容器,但是功能可能就會失效。

而且隨著Spring版本升級,可能會增加更多差異化處理。所以我們應該按照規范來注解。

再說到@Bean,我們知道Spring早期,還是通過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>

現在,你可以理解@Configuration注解的類就是一個xml配置文件,中間@Bean注解就是xml中的bean節點

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

這兩種方式都是將@Bean注解返回值注入Spring容器。SpringBoot在啟動時,會掃描@Configuration注解,進行注入。

SpringBoot注入對象沖突如何解決?

好了,現在我們終于把想要的組件交給Spring容器管理。我們該如何使用?

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

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

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

@Autowire
private Employee employee;

有時我們在容器中需要注入一個類的多個實例,以滿足需求。

比如一個接口的實現類有兩個,如果直接通過@Component注入容器,則會報錯。

如何區分?

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

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

沒錯,通過在注解中標識一個名稱,來區分該對象的不同實例。

獲取時:最終會初始化一個Bean01

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

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

在注解時,標注了@Primary的Bean在沒有指定的情況下,會默認加載。

比如:

@Component
@Primary
public class Bean01 implement AA{
    
}

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

使用時: 默認初始化的就是Bean01

@Autowire
private AA a;

SpringBoot的各種注解

@Configuration

表示當前類可以用作配置文件使用

可以在這個類中使用@bean注解來創建對象(類似于單例模式的餓漢式)。

方法中需要有返回值+使用new這個關鍵字

spring會把這個返回值放入spring容器中;

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

  • @importResource:用來導入xml文件,xml文件里面也是聲明java對象,同樣也是導入到spring容器中

  • @propertySource:用來導入property文件

可以和@value一起使用,@value來用讀取property文件的內容;

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

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

默認情況下是掃描當前包和子包的位置

  • @SpringBootApplication

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

  • @SpringBootCOnfiguration:表示這個類可以作為配置類使用;

  • @EnableAutoConfiguration:啟動自動注入,把java文件配置好,直接注入到Spring容器中;

  • @ComponentScan:表示文件下的注解,用來創建對象

  • @ConfigurationProperties:使用在java類上,表示使用K-V自動注入到對應的java屬性上,

參數prefix:把properties文件中對應的前綴.后面的屬性對應到properties文件的屬性中(使用在類上,所以在屬性上可以自動賦值)

和@value是兩種用法

@controller、@service、@Repository、@component

這些注解使用在java類上,componentScan會掃描這些完成對象的創建

  • @controller使用在控制層,完成接收請求參數,調用service層完成用戶的請求,返回視圖層給用戶;

  • @Service:業務層的邏輯,調用dao層完成用戶對數據庫的操作,將處理結果返回給controller;

  • @Repository:使用對數據庫進行持久化操作(保證用戶的數據可以寫入到數據庫中),將處理結果返回給service層

##在SpringBoot中使用@mapper代替這個注解。用來告訴mybatis創建這個對象的動態代理對象

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

  • @component:用來創建對象,但是對象沒有前面三個有特殊的功能

  • @transaction:表示開啟事務(一般使用在service層)有五個參數

1、傳播行為 2、隔離級別 3、超時行為 4、回滾規則 5、是否只讀

@RestController   = @responseBody+@controller

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

感謝各位的閱讀,以上就是“SpringBoot對不同Bean注解的區別和使用場景是什么”的內容了,經過本文的學習后,相信大家對SpringBoot對不同Bean注解的區別和使用場景是什么這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

潼南县| 丹凤县| 滨海县| 阿巴嘎旗| 马关县| 离岛区| 乾安县| 宿松县| 房产| 九龙城区| 郧西县| 双辽市| 观塘区| 峨边| 黄大仙区| 曲阜市| 都昌县| 凤冈县| 营口市| 犍为县| 碌曲县| 临江市| 蒙城县| 虞城县| 潮州市| 双流县| 凭祥市| 周口市| 嘉兴市| 凤台县| 周宁县| 鹤峰县| 建始县| 江源县| 和田市| 聂拉木县| 昌平区| 桓仁| 冕宁县| 乌兰察布市| 辛集市|