詳解Spring 中 Bean 對象的存儲和取出
由於 Spring 擁有對象的管理權,所以我們也需要擁有較為高效的對象存儲和取出的手段,下面我們來分別總結一下:
存對象
配置文件
在存儲對象之前,我們需要先配置一下 Spring 的掃描目錄,這樣 Spring 即可在正確的目錄中識別出我們想要給交給 Spring 進行管理的對象
首先在項目中的 resources 目錄下添加一個 xml 文件,名字可以自定義
隨後在這個 xml 中添加如下代碼,這段代碼可以直接復制,但是要修改倒數第二行的 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"> <? 下面這行代碼是設置 spring 的掃描目錄,base-package 中的路徑 可以直接設置成我們代碼中的根目錄 ?> <content:component-scan base-package="dir"></content:component-scan> </beans>
類註釋
在 Spring 中我們可以通過類註釋或者方法註釋來進行對象的存儲,其中類註釋是用的比較多的,類註釋總共有 5 種:
- @Conntroller,業務邏輯層
- @Service,服務器存儲
- @Repository,倉庫存儲,可以用來操作數據庫
- @Component,項目組件層
- @Configuration,配置層
這五種類註釋的作用都是可以直接將這個類對象儲存到 Spring 中,但是卻有 5 種類註釋,這麼做的原因是:能夠讓我們看到類註釋就能得知這個類的大致功用
命名規則
類註釋中有兩套命名規則
- 如果當前類名中前兩個字母都是大寫,那麼存入 Spring 中的對象名字默認是類名
- 否則名字為第一個字母轉為小寫後的類名
除瞭上面 5 種類註釋之外,還有方法註釋
方法註釋
方法註釋就是將註釋@Bean
加到方法上方,並且必須搭配類方法使用
作用:將這個方法返回的對象存入到 Spring 中
例如
@Controller public class Student { @Bean private Student getStudent() { return new Student(); } }
通過 @Bean 註釋存入 Spring 中的對象名字默認是方法名,我們也可以直接在 @Bean 後面直接加上參數指定這個對象的名字,例如
@Controller public class Student { @Bean(name="sb") // 設置對象的名字 private Student getStudent() { return new Student(); } }
取對象
在 Spring 中,獲取 Spring 中的對象也有另一種叫法:對象裝配
主要有三種對象裝配的方式
屬性註入
我們可以直接在成員變量中添加 @Autowired 註釋, @Autowired 會優先匹配 Spring 中類名相同的對象,例如下面代碼中的 user,Autowired 會優先按照 user 的類型在 spring 中進行匹配
@Controller public class Student { @Autowired private User user; @Bean(name="sb") private Student getStudent() { return new Student(); } }
這種註入方式很簡單也很快,但是缺點不少:
- 可移植性差,這個用法是建立在 IoC 容器上的,移植到其他框架上可能無法使用
- 無法註入不可變的對象,也就是 final 修飾的對象
- 因為 final 修飾的變量隻有兩個初始化時機,第一個是直接賦值,第二個是在類的構造方法中賦值,顯然這種對象註入的方式無法滿足其中一個條件
- 由於使用簡單,容易濫用,所以比較容易被違背單一設計原則(即一個類隻幹一件事)
setter 註入
首先創建一個要註入的對象,然後通過「右鍵 — generate — setter」生成一個 setter 方法,最後在這個 setter 方法頭頂上添加 @Autowired 註釋
@Controller public class Student { private User user; @Autowired // 通過 setter 註入 public void setUser(User user) { this.user = user; } }
setter 註入的缺點:
- 由於是 setter 方法,所以可能多次調用,這就意味著這個對象可以被多次修改
- 依舊無法註入 final 修飾的對象,原因同上
構造方法註入
顧名思義,這是在構造方法上添加 @Autowired 註釋來註入對象,如下
@Controller public class Student { private User user; @Autowired public Student(User user) { this.user = user; } }
構造方法註入的優點:
- 由於是構造方法,隻會執行一次,所以對象不會被重復更改
- 可以註入 final 修飾的對象(在構造方法中賦值)
- JDK本身就支持構造方法,所以有更低的門檻,說人話:具有更強的可移植性
到此這篇關於詳解Spring 中 Bean 對象的存儲和取出的文章就介紹到這瞭,更多相關Spring Bean 對象的存儲內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Spring五大類註解讀取存儲Bean對象的方法
- Spring更簡單的存儲方式與獲取方式詳解
- 詳解spring如何使用註解開發
- Java Spring中Bean的作用域及生命周期
- Spring Bean自動裝配入門到精通