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

Spring?IOC中對(duì)象的創(chuàng)建、策略及銷毀時(shí)機(jī)和生命周期詳解

 更新時(shí)間:2023年08月09日 09:38:50   作者:會(huì)洗碗的CV工程師  
這篇文章主要介紹了Spring?IOC中對(duì)象的創(chuàng)建、策略及銷毀時(shí)機(jī)和生命周期詳解,Spring默認(rèn)使用類的空參構(gòu)造方法創(chuàng)建bean,假如類沒(méi)有空參構(gòu)造方法,將無(wú)法完成bean的創(chuàng)建,需要的朋友可以參考下

一、對(duì)象的創(chuàng)建方式

Spring會(huì)幫助我們創(chuàng)建bean,那么它底層是調(diào)用什么方法進(jìn)行創(chuàng)建的呢?有以下三種方法

  • 使用構(gòu)造方法
  • 使用工廠類方法
  • 使用工廠類的靜態(tài)方法

接下來(lái)詳細(xì)講解這三種方法。

1. 使用構(gòu)造方法

Spring默認(rèn)使用類的空參構(gòu)造方法創(chuàng)建bean,假如類沒(méi)有空參構(gòu)造方法,將無(wú)法完成bean的創(chuàng)建,接下來(lái)我們可以測(cè)試一下。

package com.example.dao;
import com.example.pojo.Student;
public class StudentDaoImpl1 implements StudentDao{
    /*public StudentDaoImpl1() {
    }*/
    public StudentDaoImpl1(int a){};
    @Override
    public Student findById(int id){
        return new Student(id,"程序員","北京");
    }
}

錯(cuò)誤原因:Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'studentDao' defined in class path resource [bean.xml]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'int' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}

翻譯:上下文初始化過(guò)程中遇到異常-取消刷新嘗試:org.springframework.beans.factory.UnsatisfiedDependencyException:創(chuàng)建類路徑資源[bean.xml]中定義的名稱為“studentDao”的bean時(shí)出錯(cuò):通過(guò)構(gòu)造函數(shù)參數(shù)0表示的不滿足依賴關(guān)系;嵌套異常為org.springframework.beans.factory.NoSuchBeanDefinitionException:沒(méi)有可用的類型為“int”的符合條件的bean:應(yīng)至少有1個(gè)符合自動(dòng)連線候選條件的bean。依賴項(xiàng)注釋:{}

其實(shí)就是沒(méi)有空的構(gòu)造函數(shù),加上一個(gè)就好了

2. 使用工廠類方法

Spring可以調(diào)用工廠類的方法創(chuàng)建bean:創(chuàng)建工廠類,工廠類提供創(chuàng)建對(duì)象的方法,在配置文件中配置創(chuàng)建bean的方式為工廠方式。

工廠類StudentDaoFactory:

package com.example.dao;
public class StudentDaoFactory {
    public StudentDao getStudentDao(){
        return new StudentDaoImpl1(1);
    }
}

bean.xml的配置:

    <!-- id: 工廠對(duì)象的id,class:工廠類 -->
    <bean id="studentDaoFactory" class="com.example.dao.StudentDaoFactory" />
    <!-- id:bean對(duì)象的id,factory-bean:工廠對(duì)象的id,factory-method:工廠方法 -->
    <bean id="studentDao" factory-bean="studentDaoFactory" factory-method="getStudentDao"></bean>

測(cè)試方法:

    @Test
    public void t2(){
        // 創(chuàng)建spring容器
        ApplicationContext ac = new FileSystemXmlApplicationContext("C:\\JavaProjects\\06SSM_Projects\\springdemo\\spring_ioc1\\src\\main\\resources\\bean.xml");
        // 從容器中獲取對(duì)象
        StudentDao userDao = ac.getBean("studentDao",StudentDao.class);
        System.out.println(userDao);
        System.out.println(userDao.findById(1));;
    }

測(cè)試結(jié)果:

OK,確實(shí)成功寫出來(lái)了

3. 使用工廠類的靜態(tài)方法

Spring可以調(diào)用工廠類的靜態(tài)方法創(chuàng)建bean,創(chuàng)建工廠類,工廠提供創(chuàng)建對(duì)象的靜態(tài)方法,在配置文件中配置創(chuàng)建bean的方式為工廠靜態(tài)方法。

工廠類StudentDaoFactory2

package com.example.dao;
public class StudentDaoFactory2 {
    public static StudentDao getStudentDao2() {
        return new StudentDaoImpl2();
    }
}

bean.xml的配置

    <!-- id:bean的id class:工廠全類名 factory-method:工廠靜態(tài)方法 -->
     <bean id="studentDao" class="com.example.dao.StudentDaoFactory2" factory-method="getStudentDao2"/>

都是可以成功運(yùn)行的。

二、對(duì)象的創(chuàng)建策略

scope屬性設(shè)置對(duì)象的創(chuàng)建策略。

Spring通過(guò)配置 <bean> 中的 scope 屬性設(shè)置對(duì)象的創(chuàng)建策略,共有兩種種創(chuàng)建策略。

1. 單例策略

singleton:?jiǎn)卫?,默認(rèn)策略。整個(gè)項(xiàng)目只會(huì)創(chuàng)建一個(gè)對(duì)象,通過(guò) <bean> 中的 lazy-init 屬性可以設(shè)置單例對(duì)象的創(chuàng)建時(shí)機(jī):lazy-init="false"(默認(rèn)):立即創(chuàng)建,在容器啟動(dòng)時(shí)會(huì)創(chuàng)建配置文件中的所有Bean對(duì)象。lazy-init="true":延遲創(chuàng)建,第一次使用Bean對(duì)象時(shí)才會(huì)創(chuàng)建。下面測(cè)試獲取對(duì)象后的哈希值是否一樣就可以知道是否配置單例策略了

bean.xml的配置

    <bean id="studentDao" class="com.example.dao.StudentDaoImpl2" scope="singleton" lazy-init="true" />

測(cè)試方法

    @Test
    public void t3(){
        // 創(chuàng)建Spring容器
        ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
        // 從容器獲取對(duì)象
        StudentDao studentDao1 = ac.getBean("studentDao",StudentDao.class);
        StudentDao studentDao2 = ac.getBean("studentDao",StudentDao.class);
        StudentDao studentDao3 = ac.getBean("studentDao",StudentDao.class);
        System.out.println(studentDao1.hashCode());
        System.out.println(studentDao2.hashCode());
        System.out.println(studentDao3.hashCode());
    }

運(yùn)行結(jié)果

OK,得到的對(duì)象都是同一個(gè)哈希值,說(shuō)明確實(shí)是同一個(gè)對(duì)象也就是說(shuō)成功配置了單例模式。

2. 多例策略

prototype:多例,每次從容器中獲取時(shí)都會(huì)創(chuàng)建對(duì)象。

bean.xml配置

<!-- 配置多例策略 -->
<bean id="studentDao" class="com.itbaizhan.dao.StudentDaoImpl2" scope="prototype"></bean>

測(cè)試結(jié)果

得到的哈希值不一樣,說(shuō)明得到的是不同的對(duì)象,確實(shí)是多例策略。

  • request:每次請(qǐng)求創(chuàng)建一個(gè)對(duì)象,只在web環(huán)境有效。
  • session:每次會(huì)話創(chuàng)建一個(gè)對(duì)象,只在web環(huán)境有效。
  • gloabal-session:一次集群環(huán)境的會(huì)話創(chuàng)建一個(gè)對(duì)象,只在web環(huán)境有效。

三、對(duì)象的銷毀時(shí)機(jī)

對(duì)象的創(chuàng)建策略不同,銷毀時(shí)機(jī)也不同:

  • singleton:對(duì)象隨著容器的銷毀而銷毀。
  • prototype:使用JAVA垃圾回收機(jī)制銷毀對(duì)象。
  • request:當(dāng)處理請(qǐng)求結(jié)束,bean實(shí)例將被銷毀。
  • session:當(dāng)HTTP Session最終被廢棄的時(shí)候,bean也會(huì)被銷毀掉。
  • gloabal-session:集群環(huán)境下的session銷毀,bean實(shí)例也將被銷毀。

四、生命周期方法

Bean對(duì)象的生命周期包含創(chuàng)建——使用——銷毀,Spring可以配置Bean對(duì)象在創(chuàng)建和銷毀時(shí)自動(dòng)執(zhí)行的方法:

1. 定義生命周期方法

在StudentDaoImpl2中新增生命周期方法

    // 創(chuàng)建時(shí)自動(dòng)執(zhí)行的方法
    public void init(){
        System.out.println("使用StudentDaoImpl2創(chuàng)建對(duì)象"+this.hashCode());
    }
    // 銷毀時(shí)自動(dòng)執(zhí)行的方法
    public void destroy(){
        System.out.println("銷毀StudentDaoImpl2創(chuàng)建的對(duì)象"+this.hashCode());
    }

2. 配置生命周期方法

    <!-- init-method:創(chuàng)建對(duì)象時(shí)執(zhí)行的方法 destroy-method:銷毀對(duì)象時(shí)執(zhí)行的方法 -->
    <bean id="studentDao" class="com.itbaizhan.dao.StudentDaoImpl2" scope="singleton" init-method="init" destroy-method="destory"></bean>

3. 測(cè)試

測(cè)試方法

@Test
public void t3(){
  // 創(chuàng)建Spring容器
  ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("bean1.xml");
  // 銷毀Spring容器,ClassPathXmlApplicationContext才有銷毀容器的方法
  ac.close();
}

測(cè)試結(jié)果

也確實(shí)可以

五、獲取Bean對(duì)象的方式

1. 通過(guò)id/name獲取

獲取對(duì)象的時(shí)候是這樣:

StudentDao studentDao = (StudentDao) ac.getBean("studentDao");

2. 通過(guò)類型獲取

獲取對(duì)象的時(shí)候是這樣:

StudentDao studentDao2 = ac.getBean(StudentDao.class);

不需要進(jìn)行類型強(qiáng)轉(zhuǎn)

3. 通過(guò)類型+id/name獲取

雖然使用類型獲取不需要強(qiáng)轉(zhuǎn),但如果在容器中有一個(gè)接口的多個(gè)實(shí)現(xiàn)類對(duì)象,則獲取時(shí)會(huì)報(bào)錯(cuò),此時(shí)需要使用類型+id/name獲取,獲取對(duì)象是這樣:

StudentDao studentDao2 = ac.getBean("studentDao",StudentDao.class);

到此這篇關(guān)于Spring IOC中對(duì)象的創(chuàng)建、策略及銷毀時(shí)機(jī)和生命周期詳解的文章就介紹到這了,更多相關(guān)Spring IOC對(duì)象策略及生命周期內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringCloud服務(wù)注冊(cè)和發(fā)現(xiàn)組件Eureka

    SpringCloud服務(wù)注冊(cè)和發(fā)現(xiàn)組件Eureka

    對(duì)于微服務(wù)的治理而言,其核心就是服務(wù)的注冊(cè)和發(fā)現(xiàn)。在SpringCloud 中提供了多種服務(wù)注冊(cè)與發(fā)現(xiàn)組件,官方推薦使用Eureka。本篇文章,我們來(lái)講解springcloud的服務(wù)注冊(cè)和發(fā)現(xiàn)組件,感興趣的可以了解一下
    2021-05-05
  • Java無(wú)法輸出中文問(wèn)題及解決

    Java無(wú)法輸出中文問(wèn)題及解決

    這篇文章主要介紹了Java無(wú)法輸出中文問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • JAVA解析XML字符串簡(jiǎn)單方法代碼案例

    JAVA解析XML字符串簡(jiǎn)單方法代碼案例

    這篇文章主要介紹了JAVA解析XML字符串簡(jiǎn)單方法代碼案例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-09-09
  • mybatis 運(yùn)行時(shí)加載自定義mapper文件方式

    mybatis 運(yùn)行時(shí)加載自定義mapper文件方式

    這篇文章主要介紹了mybatis 運(yùn)行時(shí)加載自定義mapper文件方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Spring中Controller應(yīng)用深入理解

    Spring中Controller應(yīng)用深入理解

    這篇文章主要介紹了Spring項(xiàng)目中的Controller,Spring Controller本身也是一個(gè)Spring Bean,只是它多提供了Web能力,只需要造類上提供@Controller注解即可
    2022-12-12
  • Mybatisplus自動(dòng)填充實(shí)現(xiàn)方式及代碼示例

    Mybatisplus自動(dòng)填充實(shí)現(xiàn)方式及代碼示例

    這篇文章主要介紹了Mybatisplus自動(dòng)填充實(shí)現(xiàn)方式及代碼示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-11-11
  • Java中字符序列的替換與分解的幾種實(shí)現(xiàn)方法

    Java中字符序列的替換與分解的幾種實(shí)現(xiàn)方法

    本文主要介紹了Java中字符序列的替換與分解的幾種實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • java日期格式化YYYY-MM-dd遇坑指南小結(jié)

    java日期格式化YYYY-MM-dd遇坑指南小結(jié)

    本文主要介紹了java日期格式化YYYY-MM-dd遇坑指南小結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • Java延時(shí)執(zhí)行的三種實(shí)現(xiàn)方式

    Java延時(shí)執(zhí)行的三種實(shí)現(xiàn)方式

    本文主要介紹了Java延時(shí)執(zhí)行的三種實(shí)現(xiàn)方式,主要包括了Thread.sleep()方法,.sleep()使用Timer類或使用ScheduledExecutorService接口,感興趣的可以了解一下
    2023-12-12
  • java?cpu飆升問(wèn)題的詳細(xì)分析和處理方法

    java?cpu飆升問(wèn)題的詳細(xì)分析和處理方法

    Java中CPU占用過(guò)高是一個(gè)常見(jiàn)的問(wèn)題,可能是由于線程過(guò)多、死循環(huán)、長(zhǎng)時(shí)間的阻塞、死鎖、GC頻繁等原因?qū)е碌?這篇文章主要介紹了java?cpu飆升問(wèn)題的詳細(xì)分析和處理方法,需要的朋友可以參考下
    2025-03-03

最新評(píng)論

抚州市| 班玛县| 奉贤区| 子长县| 芒康县| 东阳市| 萨嘎县| 井研县| 岳西县| 南漳县| 兴业县| 扎赉特旗| 华宁县| 五台县| 文山县| 桐梓县| 富锦市| 金寨县| 微博| 昔阳县| 绥芬河市| 汝南县| 乐安县| 南开区| 伊吾县| 凤翔县| 孝义市| 盖州市| 红河县| 金堂县| 成武县| 海兴县| 新绛县| 慈利县| 封丘县| 蓝田县| 台湾省| 定兴县| 天全县| 广安市| 阳泉市|