詳解Spring?中?Bean?對(duì)象的存儲(chǔ)和取出
由于 Spring 擁有對(duì)象的管理權(quán),所以我們也需要擁有較為高效的對(duì)象存儲(chǔ)和取出的手段,下面我們來(lái)分別總結(jié)一下:
存對(duì)象
配置文件
在存儲(chǔ)對(duì)象之前,我們需要先配置一下 Spring 的掃描目錄,這樣 Spring 即可在正確的目錄中識(shí)別出我們想要給交給 Spring 進(jìn)行管理的對(duì)象
首先在項(xiàng)目中的 resources 目錄下添加一個(gè) xml 文件,名字可以自定義
隨后在這個(gè) xml 中添加如下代碼,這段代碼可以直接復(fù)制,但是要修改倒數(shù)第二行的 base-package 中的路徑改成自己的路徑
<?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"> <? 下面這行代碼是設(shè)置 spring 的掃描目錄,base-package 中的路徑 可以直接設(shè)置成我們代碼中的根目錄 ?> <content:component-scan base-package="dir"></content:component-scan> </beans>
類(lèi)注釋
在 Spring 中我們可以通過(guò)類(lèi)注釋或者方法注釋來(lái)進(jìn)行對(duì)象的存儲(chǔ),其中類(lèi)注釋是用的比較多的,類(lèi)注釋總共有 5 種:
- @Conntroller,業(yè)務(wù)邏輯層
- @Service,服務(wù)器存儲(chǔ)
- @Repository,倉(cāng)庫(kù)存儲(chǔ),可以用來(lái)操作數(shù)據(jù)庫(kù)
- @Component,項(xiàng)目組件層
- @Configuration,配置層
這五種類(lèi)注釋的作用都是可以直接將這個(gè)類(lèi)對(duì)象儲(chǔ)存到 Spring 中,但是卻有 5 種類(lèi)注釋?zhuān)@么做的原因是:能夠讓我們看到類(lèi)注釋就能得知這個(gè)類(lèi)的大致功用
命名規(guī)則
類(lèi)注釋中有兩套命名規(guī)則
- 如果當(dāng)前類(lèi)名中前兩個(gè)字母都是大寫(xiě),那么存入 Spring 中的對(duì)象名字默認(rèn)是類(lèi)名
- 否則名字為第一個(gè)字母轉(zhuǎn)為小寫(xiě)后的類(lèi)名
除了上面 5 種類(lèi)注釋之外,還有方法注釋
方法注釋
方法注釋就是將注釋@Bean
加到方法上方,并且必須搭配類(lèi)方法使用
作用:將這個(gè)方法返回的對(duì)象存入到 Spring 中
例如
@Controller public class Student { @Bean private Student getStudent() { return new Student(); } }
通過(guò) @Bean 注釋存入 Spring 中的對(duì)象名字默認(rèn)是方法名,我們也可以直接在 @Bean 后面直接加上參數(shù)指定這個(gè)對(duì)象的名字,例如
@Controller public class Student { @Bean(name="sb") // 設(shè)置對(duì)象的名字 private Student getStudent() { return new Student(); } }
取對(duì)象
在 Spring 中,獲取 Spring 中的對(duì)象也有另一種叫法:對(duì)象裝配
主要有三種對(duì)象裝配的方式
屬性注入
我們可以直接在成員變量中添加 @Autowired 注釋?zhuān)?@Autowired 會(huì)優(yōu)先匹配 Spring 中類(lèi)名相同的對(duì)象,例如下面代碼中的 user,Autowired 會(huì)優(yōu)先按照 user 的類(lèi)型在 spring 中進(jìn)行匹配
@Controller public class Student { @Autowired private User user; @Bean(name="sb") private Student getStudent() { return new Student(); } }
這種注入方式很簡(jiǎn)單也很快,但是缺點(diǎn)不少:
- 可移植性差,這個(gè)用法是建立在 IoC 容器上的,移植到其他框架上可能無(wú)法使用
- 無(wú)法注入不可變的對(duì)象,也就是 final 修飾的對(duì)象
- 因?yàn)?final 修飾的變量只有兩個(gè)初始化時(shí)機(jī),第一個(gè)是直接賦值,第二個(gè)是在類(lèi)的構(gòu)造方法中賦值,顯然這種對(duì)象注入的方式無(wú)法滿足其中一個(gè)條件
- 由于使用簡(jiǎn)單,容易濫用,所以比較容易被違背單一設(shè)計(jì)原則(即一個(gè)類(lèi)只干一件事)
setter 注入
首先創(chuàng)建一個(gè)要注入的對(duì)象,然后通過(guò)「右鍵 — generate — setter」生成一個(gè) setter 方法,最后在這個(gè) setter 方法頭頂上添加 @Autowired 注釋
@Controller public class Student { private User user; @Autowired // 通過(guò) setter 注入 public void setUser(User user) { this.user = user; } }
setter 注入的缺點(diǎn):
- 由于是 setter 方法,所以可能多次調(diào)用,這就意味著這個(gè)對(duì)象可以被多次修改
- 依舊無(wú)法注入 final 修飾的對(duì)象,原因同上
構(gòu)造方法注入
顧名思義,這是在構(gòu)造方法上添加 @Autowired 注釋來(lái)注入對(duì)象,如下
@Controller public class Student { private User user; @Autowired public Student(User user) { this.user = user; } }
構(gòu)造方法注入的優(yōu)點(diǎn):
- 由于是構(gòu)造方法,只會(huì)執(zhí)行一次,所以對(duì)象不會(huì)被重復(fù)更改
- 可以注入 final 修飾的對(duì)象(在構(gòu)造方法中賦值)
- JDK本身就支持構(gòu)造方法,所以有更低的門(mén)檻,說(shuō)人話:具有更強(qiáng)的可移植性
到此這篇關(guān)于詳解Spring 中 Bean 對(duì)象的存儲(chǔ)和取出的文章就介紹到這了,更多相關(guān)Spring Bean 對(duì)象的存儲(chǔ)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
通過(guò)java反射機(jī)制動(dòng)態(tài)調(diào)用某方法的總結(jié)(推薦)
下面小編就為大家?guī)?lái)一篇通過(guò)java反射機(jī)制動(dòng)態(tài)調(diào)用某方法的總結(jié)(推薦)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-07-07Java實(shí)現(xiàn)多線程大批量同步數(shù)據(jù)(分頁(yè))
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)多線程大批量同步數(shù)據(jù)(分頁(yè)),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-08-08Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(40)
下面小編就為大家?guī)?lái)一篇Java基礎(chǔ)的幾道練習(xí)題(分享)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧,希望可以幫到你2021-07-07分布式開(kāi)發(fā)醫(yī)療掛號(hào)系統(tǒng)數(shù)據(jù)字典模塊前后端實(shí)現(xiàn)
這篇文章主要為大家介紹了分布式開(kāi)發(fā)醫(yī)療掛號(hào)系統(tǒng)數(shù)據(jù)字典模塊前后端實(shí)現(xiàn),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-04-04Java lambda表達(dá)式實(shí)現(xiàn)Flink WordCount過(guò)程解析
這篇文章主要介紹了Java lambda表達(dá)式實(shí)現(xiàn)Flink WordCount過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-02-02SpringBoot整合liquibase的實(shí)現(xiàn)方法
這篇文章主要介紹了SpringBoot整合liquibase的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08springboot整合Quartz實(shí)現(xiàn)動(dòng)態(tài)配置定時(shí)任務(wù)的方法
本篇文章主要介紹了springboot整合Quartz實(shí)現(xiàn)動(dòng)態(tài)配置定時(shí)任務(wù)的方法,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2017-10-10