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