天天看點

Spring 架構學習 (一) Spring Bean 的初識初識 Spring Bean

文章目錄

  • 初識 Spring Bean
    • 簡介
      • 1. POJO & Java Bean
        • i) 什麼是 POJO
        • ii) POJO 與 Java Bean 的差別
      • 2. Spring Bean
        • i) 控制反轉 IoC
        • ii) 依賴注入 DI
    • Spring Bean 的簡單引入

初識 Spring Bean

簡介

1. POJO & Java Bean

i) 什麼是 POJO

POJO(Plain Ordinary Java Object)簡單的Java對象,實際就是普通JavaBeans,是為了避免和EJB混淆所創造的簡稱。

ii) POJO 與 Java Bean 的差別

POJO 和JavaBean是我們常見的兩個關鍵字,一般容易混淆,POJO全稱是Plain Ordinary Java Object / Pure Old Java Object,中文可以翻譯成:普通Java類,具有一部分getter/setter方法的那種類就可以稱作POJO,但是JavaBean則比 POJO複雜很多, Java Bean 是可複用的元件,對 Java Bean 并沒有嚴格的規範,理論上講,任何一個 Java 類都可以是一個 Bean 。但通常情況下,由于 Java Bean 是被容器所建立(如 Tomcat) 的,是以 Java Bean 應具有一個無參的構造器,另外,通常 Java Bean 還要實作 Serializable 接口用于實作 Bean 的持久性。 Java Bean 是不能被跨程序通路的。JavaBean是一種元件技術,就好像你做了一個扳子,而這個扳子會在很多地方被拿去用,這個扳子也提供多種功能(你可以拿這個扳子扳、錘、撬等等),而這個扳子就是一個元件。一般在web應用程式中建立一個資料庫的映射對象時,我們隻能稱它為POJO。POJO(Plain Old Java Object)這個名字用來強調它是一個普通java對象,而不是一個特殊的對象,其主要用來指代那些沒有遵從特定的Java對象模型、約定或架構(如EJB)的Java對象。理想地講,一個POJO是一個不受任何限制的Java對象(除了Java語言規範)。

2. Spring Bean

i) 控制反轉 IoC

控制反轉(Inversion of Control,縮寫為IoC),是面向對象程式設計中的一種設計原則,可以用來減低計算機代碼之間的耦合度。其中最常見的方式叫做依賴注入(Dependency Injection,簡稱DI),還有一種方式叫“依賴查找”(Dependency Lookup)。通過控制反轉,對象在被建立的時候,由一個調控系統内所有對象的外界實體,将其所依賴的對象的引用傳遞(注入)給它。

技術表現

Class A中用到了Class B的對象b,一般情況下,需要在A的代碼中顯式的new一個B的對象。采用依賴注入技術之後,A的代碼隻需要定義一個私有的B對象,不需要直接new來獲得這個對象,而是通過相關的容器控制程式來将B對象在外部new出來并注入到A類裡的引用中。而具體擷取的方法、對象被擷取時的狀态由配置檔案(如XML)來指定。

ii) 依賴注入 DI

依賴注入有如下實作方式:

  • 基于接口。實作特定接口以供外部容器注入所依賴類型的對象。
  • 基于 set 方法。實作特定屬性的public set方法,來讓外部容器調用傳入所依賴類型的對象。
  • 基于構造函數。實作特定參數的構造函數,在建立對象時傳入所依賴類型的對象。
  • 基于注解。基于Java的注解功能,在私有變量前加“@Autowired”等注解,不需要顯式的定義以上三種代碼,便可以讓外部容器傳入對應的對象。該方案相當于定義了public的set方法,但是因為沒有真正的set方法,進而不會為了實作依賴注入導緻暴露了不該暴露的接口(因為set方法隻想讓容器通路來注入而并不希望其他依賴此類的對象通路)。

Spring Bean 的簡單引入

Bean 的建立方式有很多種,首先我們先從 xml 配置檔案引入的方式入手

首先,建立一個 Java 類,這個類可以了解為建立 Bean 的一個模闆。在正式生成 Bean 時,可以往裡面注入不同的值。

在此,我先建立一個 Student 類,該類包含了 id,name, age,sex 等屬性。

Sutdent 類
package cn.deu.just.demo1;

public class Student {    

     private int id;
     private String name;
     private int age;
     private boolean sex;


     public Student(int id, String name, int age, boolean sex) {
           super();
           this.id = id;
           this.name = name;
           this.age = age;
           this.sex = sex;
     }


     @Override
     public String toString() {
           return "Student [id=" + id + ", name=" + name + ", 
age=" + age + ", sex=" + sex + "]";
     }

}
           

在上述代碼中,為其建立了一個帶參的構造函數以便通過 XML 代碼構造一個 Bean,和一個 toString 函數用以傳回 Bean 中的值。

接下來我們需要通過 XML 來對 Bean 進行配置。

XML
<!-- 配置一個 Bean -->
     <bean id="student" class="cn.deu.just.demo1.Student">
           <constructor-arg name="id" value="19092701"></constructor-arg>
           <constructor-arg name="name" value="張三"></constructor-arg>
           <constructor-arg name="age" value="22"></constructor-arg>
           <constructor-arg name="sex" value="true"></constructor-arg>
     </bean>
           

在上述代碼中:

  • id 是 Bean 的 id
  • class 是 Bean 使用的類
  • constructor-arg 對應帶參構造參數的的參數清單
  • constructor-arg 的 name 代表的是參數名
  • constructor-arg 的 value 代表的是參數的值

然後我們就需要對 Bean進行測試

為此我們可以建立一個測試類

然後假如測試方法。

@Test
	public void Test1() {
		ApplicationContext ctx = new ClassPathXmlApplicationContext("BeanDemo1Context.xml");
		Student stu = (Student)ctx.getBean("student");
		System.out.println(stu);
	}
           

XML 中有着 Bean 的配置資訊,這些資訊連接配接着 Bean 的類,和 Bean 調用。這些包含着的資訊,就可以稱之為上下文。是以要使用 Bean,我們就先要知道 Bean 的上下文資訊包含在哪一個檔案中,然後從改檔案中擷取 Bean 的上下文資訊。再然後就是從上下文中擷取我們需要的 Bean。擷取的 Bean 實際上也是一個類的對象,可直接調用函數。

運作結果
Student [id=19092701, name=張三, age=22, sex=true]