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

Spring使用注解存儲(chǔ)和讀取對(duì)象詳解

 更新時(shí)間:2023年04月20日 09:55:01   作者:熬夜磕代碼丶  
這篇文章主要給大家介紹了關(guān)于Spring如何通過注解存儲(chǔ)和讀取對(duì)象的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),有一定的參考價(jià)值,需要的朋友可以參考下

一、存儲(chǔ)Bean對(duì)象

在這里插入圖片描述

之前我們存儲(chǔ)Bean時(shí),需要在spring-config.xml中添加bean注冊才行,這樣的方式并不簡單。我們要想更簡單的存儲(chǔ)和讀取對(duì)象的核心是使用注解

1.使用類注解(五大類注解):

@Controller:控制器,驗(yàn)證用戶請(qǐng)求的數(shù)據(jù)正確性(安保系統(tǒng))
@Service:服務(wù)層,編排和調(diào)度具體執(zhí)行方法的(客服中心)
@Repository:持久層,和數(shù)據(jù)庫進(jìn)行交互,等同于DAO(Data Access Object) 數(shù)據(jù)訪問層
@Component:組件(工具類)
@Configuration:配置項(xiàng)(配置項(xiàng)目中的一些配置)

2.方法注解:

@Bean路徑

配置掃描

要想將對(duì)象成功存儲(chǔ)到Spring中,物品們需要配置一下存儲(chǔ)對(duì)象的掃描包路徑,只有被配置的包下的所有類,添加了注解才能被正確的識(shí)別并保存到Spring中,需要在spring-config.xnl添加如下配置:

<?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:content="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 https://www.springframework.org/schema/context/spring-context.xsd">
    <content:component-scan base-package="com.zd.demo"></content:component-scan>
</beans>

在這里插入圖片描述

這步是十分重要的,要是不是在配置掃描包下的類對(duì)象,即使加了注解,也是不能存儲(chǔ)到Spring中的

添加注解存儲(chǔ)Bean對(duì)象

使用 @Controller 存儲(chǔ) bean 的代碼如下所示:

@Controller //將對(duì)象存儲(chǔ)到Spring中
public class StudentController {
    public void hello() {
        System.out.println("hello Im student");
    }
}

讀取StudentController對(duì)象

public static void main(String[] args) {
        //得到Spring上下文
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
        //得到bean
        StudentController studentController =
                context.getBean("studentController",StudentController.class);
        //調(diào)用bean方法
        studentController.hello();
    }

在這里插入圖片描述

使用 @Service 存儲(chǔ) bean 的代碼如下所示:

@Service
public class StudentService {
    public void hello() {
        System.out.println("hello Im studentService");
    }
}

獲取Bean對(duì)象:

public static void main(String[] args) {
        //得到Spring上下文
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
        //得到bean
        StudentService studentService =
                context.getBean("studentService",StudentService.class);
        //調(diào)用bean方法
        studentService.hello();
    }

在這里插入圖片描述

其他幾個(gè)類注解的使用方法都是一致的,在這里就不一一演示了

注解使用范圍

1.是否可以與component-scan一起使用?

在這里插入圖片描述

在這里插入圖片描述

我們可以發(fā)現(xiàn)是可以一起使用的

2.五大類注解可以不再component-scan包下嗎?
不可以

3.component-scan下的類,沒有加五大類注解,可以存儲(chǔ)到Spring嗎?
不可以

4.componemt-scan下的所有子包下的類只要加了五大類注解,可以存儲(chǔ)到Spring嗎?
子包下的類只要加了五大類注解,同樣可以存儲(chǔ)到Spring中

Bean的命名

在這里插入圖片描述

我們在獲取Bean對(duì)象時(shí),傳入名稱時(shí),一般分為兩種情況:
默認(rèn)情況下:使用原類名首字母小寫就能讀取到Bean對(duì)象
特殊情況:原類名如果首字母和第二個(gè)字母都是大寫的情況,那么使用原類名獲取

在這里插入圖片描述

在這里插入圖片描述

在這里插入圖片描述

五大類注解的關(guān)系

在這里插入圖片描述

在這里插入圖片描述

在這里插入圖片描述

在這里插入圖片描述

可以認(rèn)為@Controller / @Service / @Repository /@Configuration都是@Component的"子類",都是針對(duì)于@Component的一個(gè)擴(kuò)展

為什么需要五大類注解?

我們可以發(fā)現(xiàn),只要我們在類上加了注解,都可以獲取到Bean對(duì)象,為什么需要這么多的類注解呢?
為了讓程序員看到注解之后一眼就知道當(dāng)前類的作用

JavaEE標(biāo)準(zhǔn)分層:
1.控制層(Controller)
2.服務(wù)層(Service)
3.數(shù)據(jù)持久層(Dao)

在這里插入圖片描述

二、方法注解@Bean

五大類注解是添加到某個(gè)類上的,而方法注解是放到方法上的

在這里插入圖片描述

我們首先準(zhǔn)備一個(gè)實(shí)體類,然后使用方法注解@Bean將對(duì)象存儲(chǔ)到Spring容器中

public class UserBeans {
    @Bean
    public static User getUser() {
        User user = new User();
        user.setUid(1);
        user.setUsername("張三");
        user.setPassword("123456");
        return user;
    }
}

然后從Spring容器中獲取對(duì)象

public static void main(String[] args) {
        ApplicationContext context =
                new ClassPathXmlApplicationContext("spring-config.xml");
        User user = context.getBean("user",User.class);
        System.out.println(user);
    }

在這里插入圖片描述

我們發(fā)現(xiàn)使用的時(shí)候報(bào)錯(cuò)了,沒有名為user的Bean對(duì)象,出現(xiàn)這種現(xiàn)象一共有兩大原因:

1.@Bean命名規(guī)則與五大類注解的命名規(guī)則不同,@Bean命名規(guī)則,默認(rèn)@Bean存儲(chǔ)的對(duì)象名稱 == 方法名

在這里插入圖片描述

2.@Bean注解必須要搭配五大類注解一起使用(Spring為了提升性能所做的規(guī)定)

在這里插入圖片描述

在這里插入圖片描述

現(xiàn)在就可以正常獲取到Bean對(duì)象了

Bean重命名

我們上述通過方法名獲取Bean對(duì)象太抽象了,我們可以通過設(shè)置name屬性給Bean對(duì)象進(jìn)行重命名操作,如下述操作:

在這里插入圖片描述

我們給Bean起一個(gè)user的名字

在這里插入圖片描述

我們可以發(fā)現(xiàn)就可以通過這個(gè)重名獲取了。
我們這里的重命名可以起多個(gè)名字,因?yàn)槲覀僑pring容器中允許將同一類型的對(duì)象,存儲(chǔ)到容器多份

在這里插入圖片描述

當(dāng)@Bean使用了重命名之后,使用方法名是否還能獲取到對(duì)象?
不能,當(dāng)@Bean對(duì)象重命名之后,默認(rèn)的使用方法名獲取的方式就不能使用了

在這里插入圖片描述

三、對(duì)象注入

獲取Bean對(duì)象也稱之為對(duì)象裝配,就是將對(duì)象取出來放到某個(gè)類中,有時(shí)候也稱之對(duì)象注入
對(duì)象注入的實(shí)現(xiàn)方法有以下三種:
1.屬性注入
2.Setter注入
3.構(gòu)造方法注入

屬性注入

屬性注入是使用@AutoWired注解實(shí)現(xiàn)的

@Component
public class Group {
    @Autowired
    private User user;

    public User getUser() {
        return user;
    }
    public void setUser(User user) {
        this.user = user;
    }
}

在這里插入圖片描述

這樣就可以實(shí)現(xiàn)屬性注入了,雖然屬性注入實(shí)現(xiàn)簡單、使用簡單,但它有以下缺點(diǎn):

在這里插入圖片描述

我么將鼠標(biāo)放在注解上,會(huì)提示我們屬性注入不推薦使用

1.無法注入一個(gè)不可變對(duì)象(final 修飾的對(duì)象)

在這里插入圖片描述

final修飾的對(duì)象要么直接復(fù)制,要么在構(gòu)造方法中賦值。放我們屬性注入時(shí),上述兩種都不滿足,所以就注入失敗了

2.通用性,屬性注入只能在IoC容器中使用,其他容器中不支持

3.違背單一設(shè)計(jì)原則。簡單理解就是注入方式越簡單,濫用的概率越大,出現(xiàn)違背單一職責(zé)的概率也越大

Setter注入

setter注入也是使用@Autowired注解實(shí)現(xiàn)

@Component
public class Group {
    
    private  User user;
    @Autowired
    public void setUser(User user) {
        this.user = user;
    }
    public User getUser() {
        return user;
    }
    
}

在這里插入圖片描述

我們使用Setter注入也可以成功存儲(chǔ)取出,Setter注入符合單一職責(zé)的設(shè)計(jì)原理,但也有以下缺點(diǎn):
1.不能注入不可變對(duì)象

在這里插入圖片描述

2.注入的對(duì)象可能被修改,因?yàn)槲覀冊谌魏问录伎梢哉{(diào)用setXXX方法來改變注入的對(duì)象

構(gòu)造方法注入

構(gòu)造方法注入也是Spring官方推薦的注入方式:

public class Group {

    private User user;

    @Autowired
    public Group(User user) {
        this.user = user;
    }
}    

在這里插入圖片描述

如果當(dāng)前類只有一個(gè)構(gòu)造方法的話,@Autowired注解可以省略

在這里插入圖片描述

在這里插入圖片描述

構(gòu)造方法注入。有以下優(yōu)點(diǎn):
1.可注入不可變對(duì)象

在這里插入圖片描述

2.注入對(duì)象不會(huì)被修改
構(gòu)造方法在對(duì)象創(chuàng)建時(shí)只會(huì)執(zhí)行一次,因?yàn)椴淮嬖谧⑷雽?duì)象被隨時(shí)修改的情況

3.完全初始化
構(gòu)造方法是在對(duì)象創(chuàng)建之前之前的,當(dāng)我們使用被注入的對(duì)象時(shí),會(huì)被完全初始化

4.通用性強(qiáng)
支持各種框架

@Autowired 和 @Resource 的區(qū)別

在進(jìn)行類注入時(shí),除了可以使用@Autowired關(guān)鍵字,我們還可以使用@Resource進(jìn)行注入

在這里插入圖片描述

在這里插入圖片描述

@Autowired 和 @Resource 的區(qū)別:

1.出身不同:@Autowired是Spring的注解,@Resource是JDK的注解
2.查找順序不同:@Autowired 先根據(jù)類型再根據(jù)名稱查詢,而 @Resource 先根據(jù)名稱再根據(jù)類型查詢
3.支持參數(shù)不同,@Autowired支持一個(gè),@Resource支持7個(gè)

在這里插入圖片描述

在這里插入圖片描述

4.依賴注入支持不同:@Autowired支持三種注入,而@Resource只支持屬性注入和Setter注入

當(dāng)同一類型多個(gè)Bean時(shí)會(huì)報(bào)錯(cuò)

在這里插入圖片描述

在這里插入圖片描述

再去獲取對(duì)象就會(huì)出錯(cuò),非唯一的Bean的對(duì)象,因?yàn)槲覀僑pring中有user1和user2,不知道注入那個(gè),解決方案有兩個(gè):

1.使用@Resource(name = “XXX”)

在這里插入圖片描述

在這里插入圖片描述

2.使用@Qualifier注解定義名稱,搭配@Autowired注解使用

在這里插入圖片描述

在這里插入圖片描述

以上就是Spring使用注解存儲(chǔ)和讀取對(duì)象詳解的詳細(xì)內(nèi)容,更多關(guān)于Spring注解存儲(chǔ)和讀取對(duì)象的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • IDEA配置maven環(huán)境的詳細(xì)教程(Unable to import maven project報(bào)錯(cuò)問題的解決)

    IDEA配置maven環(huán)境的詳細(xì)教程(Unable to import maven project報(bào)錯(cuò)問題的解決)

    這篇文章主要介紹了IDEA配置maven環(huán)境的詳細(xì)教程(Unable to import maven project問題的解決),本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-06-06
  • Java maven詳細(xì)介紹

    Java maven詳細(xì)介紹

    今天給大家復(fù)習(xí)一下Java基礎(chǔ)知識(shí),簡單介紹Maven,文中有非常詳細(xì)的解釋,對(duì)Java初學(xué)者很有幫助喲,需要的朋友可以參考下,希望能夠給你帶來幫助
    2021-09-09
  • 使用java實(shí)現(xiàn)“釘釘微應(yīng)用免登進(jìn)入某H5系統(tǒng)首頁“功能”

    使用java實(shí)現(xiàn)“釘釘微應(yīng)用免登進(jìn)入某H5系統(tǒng)首頁“功能”

    這篇文章主要介紹了用java實(shí)現(xiàn)“釘釘微應(yīng)用,免登進(jìn)入某H5系統(tǒng)首頁“功能”,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-10-10
  • Mybatis-plus配置分頁插件返回統(tǒng)一結(jié)果集

    Mybatis-plus配置分頁插件返回統(tǒng)一結(jié)果集

    本文主要介紹了Mybatis-plus配置分頁插件返回統(tǒng)一結(jié)果集,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • 解決maven加載依賴時(shí)遇到的問題

    解決maven加載依賴時(shí)遇到的問題

    這篇文章主要介紹了解決maven加載依賴時(shí)遇到的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • 詳細(xì)介紹Java中的各種鎖

    詳細(xì)介紹Java中的各種鎖

    不少同學(xué)開始慢慢接觸多線時(shí)候,對(duì)線程之間為了保障數(shù)據(jù)安全性,一致性有所了解,本文詳細(xì)解介紹java中的21種鎖 ,需要的朋友可以參考下
    2021-06-06
  • Java?超詳細(xì)講解設(shè)計(jì)模式之中的建造者模式

    Java?超詳細(xì)講解設(shè)計(jì)模式之中的建造者模式

    建造者模式,是一種對(duì)象構(gòu)建模式 它可以將復(fù)雜對(duì)象的建造過程抽象出來,使這個(gè)抽象過程的不同實(shí)現(xiàn)方法可以構(gòu)造出不同表現(xiàn)的對(duì)象。本文將通過示例講解建造者模式,需要的可以參考一下
    2022-03-03
  • Java使用easypoi快速導(dǎo)入導(dǎo)出的實(shí)現(xiàn)

    Java使用easypoi快速導(dǎo)入導(dǎo)出的實(shí)現(xiàn)

    這篇文章主要介紹了實(shí)現(xiàn)Java使用easypoi快速導(dǎo)入導(dǎo)出的實(shí)現(xiàn),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2019-03-03
  • Java與Http協(xié)議的詳細(xì)介紹

    Java與Http協(xié)議的詳細(xì)介紹

    這篇文章主要介紹了Java與Http協(xié)議的詳細(xì)介紹的相關(guān)資料,這里提供實(shí)例來幫助大家學(xué)習(xí)理解這部分內(nèi)容,需要的朋友可以參考下
    2017-09-09
  • Java虛擬機(jī)裝載和初始化一個(gè)class類代碼解析

    Java虛擬機(jī)裝載和初始化一個(gè)class類代碼解析

    這篇文章的主要內(nèi)容是Java虛擬機(jī)裝載和初始化一個(gè)class類的代碼解析,包括介紹了裝載和初始化的時(shí)機(jī)與方式,需要的朋友可以參考下。
    2017-09-09

最新評(píng)論