首頁 > 軟體

詳解Spring Bean的設定方式與範例化

2022-06-10 22:02:05

一、 Spring Bean 設定方式

由 Spring IoC 容器管理的物件稱為 Bean,Bean 設定方式有兩種:組態檔開發註解開發

組態檔開發

Spring 組態檔支援兩種格式:xml和properties,此教學以xml組態檔講解。

XML 組態檔的根元素是 <beans>,該元素包含了多個子元素 <bean>。每一個 <bean> 元素都定義了一個 Bean

XML 組態檔常用元素表

屬性名稱描述
idBean 的唯一識別符號,Spring IoC 容器對 Bean 的設定和管理都通過該屬性完成。
nameBean 的別名,可以通過 name 屬性為同一個 Bean 同時指定多個名稱,每個名稱之間用逗號或分號隔開。
class指定了Bean 的具體實現類,它必須是一個類的全限定名。
scopeBean 的作用域,屬性值可以為 singleton(單例)、prototype(原型)、request、session 和 global Session。預設值是 singleton。

註解開發

先插個眼在這,過幾天會發一篇文章詳細介紹

二、Spring Bean範例化

通過控制反轉,物件的建立權就交給了IoC容器,但是容器是如何來建立物件的呢?

bean本質上就是物件,物件在new的時候會使用構造方法,建立bean其實也是使用構造方法完成的。

範例化bean的三種方式:構造方法,靜態工廠和範例工廠

環境準備

1.準備一個UserDao介面和一個UserDaoImpl實現類

//UserDao介面
public interface UserDao {
    public void say();
}
//UserDaoImpl實現類
public class UserDaoImpl implements UserDao {
    @Override
    public void say() {
        System.out.println("Hello,I am BigHorn!");
    }
}

2.編寫spring組態檔

<bean id="userDao" class="com.bighorn.dao.impl.UserDaoImpl"/>

3.編寫執行程式

public class App {
    public static void main(String[] args) {
        //獲取IoC容器
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        //從容器中獲取物件
        UserDaoImpl userDao = context.getBean("userDao", UserDaoImpl.class);
        userDao.say();
    }
}

構造方法範例化Bean

第一種範例化bean的方法:構造方法範例化,這也是最常用的方法,因為類都會提供預設的構造方法。下面來測試下

1.在UserDaoImpl類中新增一個無參構造方法,並列印一句話,方便觀察結果。

public class UserDaoImpl implements UserDao {
    //新增一個無參構造方法
    public UserDaoImpl() {
        System.out.println("這是UserDaoImpl的無參構造方法");
    }

    @Override
    public void say() {
        System.out.println("Hello,I am BigHorn!");
    }
}

可以在控制檯看到輸出結果,說明Spring IoC 容器建立物件時用的也是構造方法

2.將構造方法改成private測試

public class UserDaoImpl implements UserDao {
    //將構造方法改成private
    private UserDaoImpl() {
        System.out.println("這是UserDaoImpl的無參構造方法");
    }

    @Override
    public void say() {
        System.out.println("Hello,I am BigHorn!");
    }
}

發現還可以執行成功,這說明Spring底層用的是反射,存取到類中的私有構造方法。

3.將無參構造方法換成有參構造方法

public class UserDaoImpl implements UserDao {
    //將無參構造方法換成有參構造方法
    private UserDaoImpl(int i) {
        System.out.println("這是UserDaoImpl的無參構造方法");
    }
    @Override
    public void say() {
        System.out.println("Hello,I am BigHorn!");
    }
}

程式會報java.lang.NoSuchMethodException錯,說明Spring底層使用的是類的無參構造方法

4.畫個圖總結下:Spring 組態檔中 bean 標籤的 id 和類的全限定名一一對應,所以 Spring IoC容器的 getBean 方法其實就是先根據 bean 的 id 獲取該類的全限定名,然後再利用反射根據類的全限定名建立物件並返回。

靜態工廠範例化Bean

第二種範例化Bean的方法:靜態工廠範例化

瞭解即可,一般是用來相容早期的一些老系統。

1.建立一個UserDaoFactory工廠類並提供一個靜態方法

//UserDao介面
public interface UserDao {
    public void say();
}
//UserDaoImpl實現類
public class UserDaoImpl implements UserDao {
    public UserDaoImpl() {
        System.out.println("這是UserDaoImpl的無參構造方法");
    }
    @Override
    public void say() {
        System.out.println("Hello,I am BigHorn!");
    }
}
//UserDaoFactory工廠類
public class UserDaoFactory {
    //靜態工廠建立物件
    public static UserDao getUserDao(){
        System.out.println("這是靜態工廠範例化Bean");
        return new UserDaoImpl();
    }
}

2.編寫spring組態檔

<!--
        class:工廠類全類名
        factory-method:工廠建立物件的方法名
     -->
<bean id="userDao" class="com.bighorn.factory.UserDaoFactory" factory-method="getUserDao"/>

3.編寫執行程式

public class App {
    public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
        //獲取IoC容器
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        //從容器中獲取物件
        UserDaoImpl userDao = context.getBean("userDao", UserDaoImpl.class);
        userDao.say();
    }
}

看見執行結果,輸出以下語句

範例工廠範例化Bean

第二種範例化Bean的方法:範例工廠範例化

瞭解即可,其實和靜態工廠差不多。只不過靜態工廠可以直接通過靜態方法建立bean,範例工廠要先new一個範例工廠物件,然後再通過這個範例工廠物件建立bean

1.建立一個UserDaoFactory工廠類,和靜態工廠不一樣的是,實力工廠提供的是一個普通方法

//UserDaoFactory工廠類
public class UserDaoFactory {
    //範例工廠建立物件
    public  UserDao getUserDao(){
        System.out.println("這是範例工廠範例化Bean");
        return new UserDaoImpl();
    }
}

2.編寫spring組態檔

<!--
         userFactory:工廠的範例物件
         factory-bean:指向工廠的範例物件
         factory-method:工廠物件中建立物件的方法名
    -->
<bean id="userFactory" class="com.bighorn.factory.UserDaoFactory"/>
<bean id="userDao" factory-bean="userFactory" factory-method="getUserDao"/>

3.執行程式和靜態工廠一樣,檢視執行結果

FactoryBean

範例工廠的方法聽麻煩的,其實spring框架為我們一種範例工廠的方式:FactoryBean,比較實用,用來整合其他框架

我們只需要實現FactoryBean介面即可簡化開發,下面來介紹下它的具體使用方法

1.建立UserDaoFactoryBean類,實現FactoryBean介面中的三個方法:

  • boolean isSingleton():設定bean作用域,預設true表示單例,false表示非單例
  • T getObject() throws Exception:返回的是bean範例物件
  • Class<?> getObjectType():返回的是被建立類的Class物件
public class UserDaoFactoryBean implements FactoryBean<UserDao> {
    //bean作用域:預設true表示單例
    public boolean isSingleton() {
        return true;
    }
    //代替範例工廠中建立物件的方法
    public UserDao getObject() throws Exception {
        System.out.println("這是FactoryBean範例化bean");
        return new UserDaoImpl();
    }
    //返回所建立類的Class物件
    public Class<?> getObjectType() {
        return UserDao.class;
    }
}

2.編寫spring組態檔

<bean id="userDao" class="com.bighorn.factory.UserDaoFactoryBean"/>

3.編寫執行程式

public class App {
    public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
        //獲取IoC容器
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        //從容器中獲取物件
        UserDaoImpl userDao1 = context.getBean("userDao", UserDaoImpl.class);
        UserDaoImpl userDao2 = context.getBean("userDao", UserDaoImpl.class);
        System.out.println(userDao1);
        System.out.println(userDao2);
    }
}

以上就是詳解Spring Bean的設定方式與範例化的詳細內容,更多關於Spring Bean設定方式 範例化的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com