最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解Spring?Bean的配置方式與實例化

 更新時間:2022年06月10日 17:00:09   作者:倔強的牛角  
本文主要帶大家一起學(xué)習(xí)一下Spring?Bean的配置方式與實例化,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)Spring有一定的幫助,需要的可以參考一下

一、 Spring Bean 配置方式

由 Spring IoC 容器管理的對象稱為 Bean,Bean 配置方式有兩種:配置文件開發(fā)注解開發(fā)

配置文件開發(fā)

Spring 配置文件支持兩種格式:xml和properties,此教程以xml配置文件講解。

XML 配置文件的根元素是 <beans>,該元素包含了多個子元素 <bean>。每一個 <bean> 元素都定義了一個 Bean

XML 配置文件常用元素表

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

注解開發(fā)

先插個眼在這,過幾天會發(fā)一篇文章詳細(xì)介紹

二、Spring Bean實例化

通過控制反轉(zhuǎn),對象的創(chuàng)建權(quán)就交給了IoC容器,但是容器是如何來創(chuàng)建對象的呢?

bean本質(zhì)上就是對象,對象在new的時候會使用構(gòu)造方法,創(chuàng)建bean其實也是使用構(gòu)造方法完成的。

實例化bean的三種方式:構(gòu)造方法,靜態(tài)工廠和實例工廠

環(huán)境準(zhǔn)備

1.準(zhǔn)備一個UserDao接口和一個UserDaoImpl實現(xiàn)類

//UserDao接口
public interface UserDao {
    public void say();
}
//UserDaoImpl實現(xiàn)類
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();
    }
}

構(gòu)造方法實例化Bean

第一種實例化bean的方法:構(gòu)造方法實例化,這也是最常用的方法,因為類都會提供默認(rèn)的構(gòu)造方法。下面來測試下

1.在UserDaoImpl類中添加一個無參構(gòu)造方法,并打印一句話,方便觀察結(jié)果。

public class UserDaoImpl implements UserDao {
    //添加一個無參構(gòu)造方法
    public UserDaoImpl() {
        System.out.println("這是UserDaoImpl的無參構(gòu)造方法");
    }

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

可以在控制臺看到輸出結(jié)果,說明Spring IoC 容器創(chuàng)建對象時用的也是構(gòu)造方法

2.將構(gòu)造方法改成private測試

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

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

發(fā)現(xiàn)還可以運行成功,這說明Spring底層用的是反射,訪問到類中的私有構(gòu)造方法。

3.將無參構(gòu)造方法換成有參構(gòu)造方法

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

程序會報java.lang.NoSuchMethodException錯,說明Spring底層使用的是類的無參構(gòu)造方法。

4.畫個圖總結(jié)下:Spring 配置文件中 bean 標(biāo)簽的 id 和類的全限定名一一對應(yīng),所以 Spring IoC容器的 getBean 方法其實就是先根據(jù) bean 的 id 獲取該類的全限定名,然后再利用反射根據(jù)類的全限定名創(chuàng)建對象并返回。

靜態(tài)工廠實例化Bean

第二種實例化Bean的方法:靜態(tài)工廠實例化

了解即可,一般是用來兼容早期的一些老系統(tǒng)。

1.創(chuàng)建一個UserDaoFactory工廠類并提供一個靜態(tài)方法

//UserDao接口
public interface UserDao {
    public void say();
}
//UserDaoImpl實現(xiàn)類
public class UserDaoImpl implements UserDao {
    public UserDaoImpl() {
        System.out.println("這是UserDaoImpl的無參構(gòu)造方法");
    }
    @Override
    public void say() {
        System.out.println("Hello,I am BigHorn!");
    }
}
//UserDaoFactory工廠類
public class UserDaoFactory {
    //靜態(tài)工廠創(chuàng)建對象
    public static UserDao getUserDao(){
        System.out.println("這是靜態(tài)工廠實例化Bean");
        return new UserDaoImpl();
    }
}

2.編寫spring配置文件

<!--
        class:工廠類全類名
        factory-method:工廠創(chuàng)建對象的方法名
     -->
<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();
    }
}

看見運行結(jié)果,輸出以下語句

實例工廠實例化Bean

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

了解即可,其實和靜態(tài)工廠差不多。只不過靜態(tài)工廠可以直接通過靜態(tài)方法創(chuàng)建bean,實例工廠要先new一個實例工廠對象,然后再通過這個實例工廠對象創(chuàng)建bean

1.創(chuàng)建一個UserDaoFactory工廠類,和靜態(tài)工廠不一樣的是,實力工廠提供的是一個普通方法

//UserDaoFactory工廠類
public class UserDaoFactory {
    //實例工廠創(chuàng)建對象
    public  UserDao getUserDao(){
        System.out.println("這是實例工廠實例化Bean");
        return new UserDaoImpl();
    }
}

2.編寫spring配置文件

<!--
         userFactory:工廠的實例對象
         factory-bean:指向工廠的實例對象
         factory-method:工廠對象中創(chuàng)建對象的方法名
    -->
<bean id="userFactory" class="com.bighorn.factory.UserDaoFactory"/>
<bean id="userDao" factory-bean="userFactory" factory-method="getUserDao"/>

3.運行程序和靜態(tài)工廠一樣,查看運行結(jié)果

FactoryBean

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

我們只需要實現(xiàn)FactoryBean接口即可簡化開發(fā),下面來介紹下它的具體使用方法

1.創(chuàng)建UserDaoFactoryBean類,實現(xiàn)FactoryBean接口中的三個方法:

  • boolean isSingleton():設(shè)置bean作用域,默認(rèn)true表示單例,false表示非單例
  • T getObject() throws Exception:返回的是bean實例對象
  • Class<?> getObjectType():返回的是被創(chuàng)建類的Class對象
public class UserDaoFactoryBean implements FactoryBean<UserDao> {
    //bean作用域:默認(rèn)true表示單例
    public boolean isSingleton() {
        return true;
    }
    //代替實例工廠中創(chuàng)建對象的方法
    public UserDao getObject() throws Exception {
        System.out.println("這是FactoryBean實例化bean");
        return new UserDaoImpl();
    }
    //返回所創(chuàng)建類的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的配置方式與實例化的詳細(xì)內(nèi)容,更多關(guān)于Spring Bean配置方式 實例化的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java 把json對象轉(zhuǎn)成map鍵值對的方法

    Java 把json對象轉(zhuǎn)成map鍵值對的方法

    這篇文章主要介紹了java 把json對象中轉(zhuǎn)成map鍵值對的方法,本文的目的是把json串轉(zhuǎn)成map鍵值對存儲,而且只存儲葉節(jié)點的數(shù)據(jù) 。需要的朋友可以參考下
    2018-04-04
  • springboot自動裝配的源碼與流程圖

    springboot自動裝配的源碼與流程圖

    在日常的開發(fā)過程中Spring Boot自動裝配的特性給我們開發(fā)減少了很多重復(fù)性的工作,這篇文章主要給大家介紹了關(guān)于springboot自動裝配的相關(guān)資料,需要的朋友可以參考下
    2021-08-08
  • SpringSecurity攔截器鏈的使用詳解

    SpringSecurity攔截器鏈的使用詳解

    這篇文章主要介紹了SpringSecurity攔截器鏈的使用詳解,webSecurity的build方法最終調(diào)用的是doBuild方法,doBuild方法調(diào)用的是webSecurity的performBuild方法,webSecurity完成所有過濾器的插件,最終返回的是過濾器鏈代理類filterChainProxy,需要的朋友可以參考下
    2023-11-11
  • Feign遠(yuǎn)程調(diào)用Multipartfile參數(shù)處理

    Feign遠(yuǎn)程調(diào)用Multipartfile參數(shù)處理

    這篇文章主要介紹了Feign遠(yuǎn)程調(diào)用Multipartfile參數(shù)處理,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • Java中綴表達(dá)式轉(zhuǎn)后綴表達(dá)式實現(xiàn)方法詳解

    Java中綴表達(dá)式轉(zhuǎn)后綴表達(dá)式實現(xiàn)方法詳解

    這篇文章主要介紹了Java中綴表達(dá)式轉(zhuǎn)后綴表達(dá)式實現(xiàn)方法,結(jié)合實例形式分析了Java中綴表達(dá)式轉(zhuǎn)換成后綴表達(dá)式的相關(guān)算法原理與具體實現(xiàn)技巧,需要的朋友可以參考下
    2019-03-03
  • Java中的動態(tài)綁定機制

    Java中的動態(tài)綁定機制

    這篇文章主要介紹了Java中的動態(tài)綁定機制,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • SpringCloud動態(tài)配置注解@RefreshScope與@Component的深度解析

    SpringCloud動態(tài)配置注解@RefreshScope與@Component的深度解析

    在現(xiàn)代微服務(wù)架構(gòu)中,動態(tài)配置管理是一個關(guān)鍵需求,本文將為大家介紹Spring Cloud中相關(guān)的注解@RefreshScope與@Component的使用,需要的小伙伴可以參考下
    2025-04-04
  • Java實現(xiàn)多線程同步五種方法詳解

    Java實現(xiàn)多線程同步五種方法詳解

    這篇文章主要介紹了Java實現(xiàn)多線程同步五種方法詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-03-03
  • 使用BigDecimal除法后保留兩位小數(shù)

    使用BigDecimal除法后保留兩位小數(shù)

    這篇文章主要介紹了使用BigDecimal除法后保留兩位小數(shù)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • java 文件上傳(單文件與多文件)

    java 文件上傳(單文件與多文件)

    這篇文章主要介紹了java 文件上傳(單文件與多文件)的相關(guān)資料,希望通過本文能幫助到大家,需要的朋友可以參考下
    2017-10-10

最新評論

揭阳市| 宣汉县| 瓮安县| 崇礼县| 滁州市| 化德县| 出国| 邛崃市| 松桃| 苍南县| 格尔木市| 吉木乃县| 大姚县| 阿尔山市| 凤山县| 景德镇市| 隆昌县| 澎湖县| 交口县| 永康市| 鄄城县| 汝州市| 南川市| 娄烦县| 宜兰县| 霍城县| 曲松县| 油尖旺区| 辉南县| 绥滨县| 葫芦岛市| 祁门县| 简阳市| 永清县| 工布江达县| 乌鲁木齐市| 泾源县| 凤凰县| 化德县| 会理县| 兴隆县|