詳解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!

推薦閱讀: