欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Spring注解驅動之關于@Bean注解指定初始化和銷毀的方法

 更新時間:2022年09月30日 10:13:16   作者:融極  
這篇文章主要介紹了Spring注解驅動之關于@Bean注解指定初始化和銷毀的方法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

bean的生命周期

通常意義上講的bean的生命周期,指的是bean從創(chuàng)建到初始化,經(jīng)過一系列的流程,最終銷毀的過程。

只不過,在Spring中,bean的生命周期是由Spring容器來管理的。

在Spring中,我們可以自己來指定bean的初始化和銷毀的方法。

我們指定了bean的初始化和銷毀方法之后,當容器在bean進行到當前生命周期的階段時,會自動調(diào)用我們自定義的初始化和銷毀方法。

如何定義初始化、銷毀方法

可以通過@Bean注解指定初始化、銷毀方法。

如果使用XML配置文件的方式配置bean的話,那么可以在標簽中指定bean的初始化和銷毀方法,如下所示:

<bean id="person" class="com.meimeixia.bean.Person" init-method="init" destroy-method="destroy">
    <property name="age" value="18"></property>
    <property name="name" value="liayun"></property>
</bean>

這里需要注意的是,我們自己寫的Person類中,需要存在init()方法和destroy()方法。而且Spring中還規(guī)定,這里的init()方法和destroy()方法必須是無參的,但可以拋出異常。

如果我們使用注解的方式,那么該如何實現(xiàn)指定bean的初始化和銷毀方法呢?

首先創(chuàng)建一個名稱為Car的類,這個類的實現(xiàn)比較簡單,如下所示:

package com.meimeixia.bean;

public class Car {

	public Car() {
		System.out.println("car constructor...");
	}
	
	public void init() {
		System.out.println("car ... init...");
	}
	
	public void destroy() {
		System.out.println("car ... destroy...");
	}	
}

然后將Car類對象通過注解的方式注冊到Spring容器中。

package com.meimeixia.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import com.meimeixia.bean.Car;

@Configuration
public class MainConfigOfLifeCycle {

	@Bean
	public Car car() {
		return new Car();
	}
}

接著來寫一個測試類

package com.meimeixia.test;

import org.junit.Test;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

import com.meimeixia.config.MainConfigOfLifeCycle;

public class IOCTest_LifeCycle {
	
	@Test
	public void test01() {
		// 1. 創(chuàng)建IOC容器
		AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfigOfLifeCycle.class);
		System.out.println("容器創(chuàng)建完成");
	}
}

對于單實例bean對象來說,在Spring容器創(chuàng)建完成后,就會對單實例bean進行實例化。

可以看到,在Spring容器創(chuàng)建完成時,會自動調(diào)用單實例bean的構造方法,對單實例bean進行了實例化操作。

總之,對應單實例bean來說,會在Spring容器啟動的時候創(chuàng)建對象;對于多實例bean來說,會在多次獲取bean的時候創(chuàng)建對象。

@Bean注解的initMethod和destroyMethod樹形來指定bean的初始化方法和銷毀方法。

所以我們在配置類的@Bean注解中指定initMethod屬性和destroyMethod屬性。

package com.meimeixia.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import com.meimeixia.bean.Car;

@Configuration
public class MainConfigOfLifeCycle {

	@Bean(initMethod="init", destroyMethod="destroy")
	public Car car() {
		return new Car();
	}
}

再次執(zhí)行測試方法。

在輸出結果中可以看出,在Spring容器中,先是調(diào)用了Car類的構造方法來創(chuàng)建Car對象,接下來便是調(diào)用了Car對象的init方法來進行初始化。

這里有個問題,在運行測試方法的時候沒有打印出bean的銷毀方法中的信息,那么什么時候執(zhí)行bean的銷毀方法呢?bean的銷毀方法時在容器關閉的時候被調(diào)用的。

所以,在測試方法中添加關閉容器的代碼(注意關閉的容器的方法ApplicationContext沒有)。

package com.meimeixia.test;

import org.junit.Test;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

import com.meimeixia.config.MainConfigOfLifeCycle;

public class IOCTest_LifeCycle {
	
	@Test
	public void test01() {
		// 1. 創(chuàng)建IOC容器
		AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfigOfLifeCycle.class);
		System.out.println("容器創(chuàng)建完成");
		// 關閉容器
		applicationContext.close();
	}
}

再次運行測試方法。

可以看出,此時輸出了對象的銷毀方法中的信息,說明執(zhí)行了對象的銷毀方法。

初始化、銷毀方法的使用場景

一個典型的場景就是對于數(shù)據(jù)源的管理。例如,在配置數(shù)據(jù)源時,在初始化的時候,會對很多的數(shù)據(jù)源的屬性進行賦值操作;在銷毀的時候,我們需要對數(shù)據(jù)源的連接等信息進行關閉和清理。這個時候,我們就可以在自定義的初始化和銷毀方法中自定義操作邏輯。

初始化、銷毀方法在Spring中的調(diào)用時機

你有沒有想過這樣一個問題,初始化方法和銷毀方法是在什么時候被調(diào)用的呢?

bean對象的初始化方法調(diào)用的時機

對象創(chuàng)建完成,如果對象中存在一些屬性,并且這些屬性也都已經(jīng)賦值了,那么就會調(diào)用bean的初始化方法。對于單實例bean來說,在Spring容器創(chuàng)建完成后,Spring容器會自動調(diào)用bean的初始化方法;對應多實例bean來說,在每次獲取bean對象的時候,調(diào)用bean的初始化方法。

bean對象的銷毀方法調(diào)用的時機:對于單實例bean來說,在容器關閉的時候,會調(diào)用bean的銷毀方法;對于多實例bean來說,Spring容器只負責創(chuàng)建bean不會管理這些bean,也就不會自動調(diào)用這個bean的銷毀方法了。小伙伴只能手動調(diào)用多實例bean的銷毀方法了。

多實例bean初始化、銷毀

在配置類上通過@Scope注解將Car對象設置成多實例bean。

package com.meimeixia.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Scope;

import com.meimeixia.bean.Car;

@Configuration
public class MainConfigOfLifeCycle {

	@Scope("prototype")
	@Bean(initMethod="init", destroyMethod="destroy")
	public Car car() {
		return new Car();
	}
}

修改一下測試方法。

@Test
public void test01() {
	// 1. 創(chuàng)建IOC容器
	AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfigOfLifeCycle.class);
	System.out.println("容器創(chuàng)建完成");
}

運行測試方法。

可以看到,將Car對象設置成多實例bean,并且沒有獲取bean實例對象時,Spring容器并沒有執(zhí)行bean的構造方法、初始化方法和銷毀方法。

如果我們在測試方法獲取一下Car實例結果是什么樣呢?

可以看到,結果信息中輸出了構造方法和初始化方法中的信息。

當我們在獲取多實例bean對象的時候,會創(chuàng)建對象并進行初始化,但是銷毀方法時在什么時候被調(diào)用呢?是在容器關閉的時候么?我們現(xiàn)在來驗證一下。

@Test
public void test01() {
	// 1. 創(chuàng)建IOC容器
	AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfigOfLifeCycle.class);
	System.out.println("容器創(chuàng)建完成");
	applicationContext.getBean("car"); // 多實例bean在獲取的時候才創(chuàng)建對象	
	// 關閉容器
	applicationContext.close();
}

可以看到,多實例的bean在容器關閉的時候是不會進行銷毀的,也就是說你每次獲取時,IOC容器幫你創(chuàng)建出對象交還給你,至于要什么時候銷毀是你自己的事,Spring容器只負責創(chuàng)建多實例不再負責管理多實例bean了。

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • springcloud集成zookeeper的方法示例

    springcloud集成zookeeper的方法示例

    這篇文章主要介紹了springcloud集成zookeeper的方法示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-04-04
  • Java調(diào)用高德地圖API根據(jù)詳細地址獲取經(jīng)緯度詳細教程

    Java調(diào)用高德地圖API根據(jù)詳細地址獲取經(jīng)緯度詳細教程

    寫了一個經(jīng)緯度相關的工具,分享給有需求的小伙伴們,下面這篇文章主要給大家介紹了關于Java調(diào)用高德地圖API根據(jù)詳細地址獲取經(jīng)緯度,文中通過圖文以及代碼介紹的非常詳細,需要的朋友可以參考下
    2024-04-04
  • 一篇文章帶你了解Java SpringBoot Nacos

    一篇文章帶你了解Java SpringBoot Nacos

    這篇文章主要介紹了SpringBoot使用Nacos配置中心的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-09-09
  • 詳解springboot + profile(不同環(huán)境讀取不同配置)

    詳解springboot + profile(不同環(huán)境讀取不同配置)

    本篇文章主要介紹了springboot + profile(不同環(huán)境讀取不同配置),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • Spring+Junit4進行接口測試實例代碼

    Spring+Junit4進行接口測試實例代碼

    這篇文章主要介紹了Spring+Junit4進行接口測試實例代碼,涉及pom.xml、bean的配置,以及接口測試代碼等相關內(nèi)容,小編覺得還是挺不錯的,這里分享給大家,需要的朋友可以參考下
    2018-01-01
  • 手把手教你實現(xiàn)idea中配置國內(nèi)源

    手把手教你實現(xiàn)idea中配置國內(nèi)源

    idea的國內(nèi)源配置十分重要,能夠提升程序開發(fā)的效率而且也是減少bug的一種有效防范,本文就來介紹一下idea中配置國內(nèi)源,具有一定的參考價值,感興趣的可以了解一下
    2023-07-07
  • Java中Scanner類使用保姆級教程

    Java中Scanner類使用保姆級教程

    JavaSE在java.util類庫中提供了一個專門用于輸入操作的類Scanner類,可以使用該類創(chuàng)建一個對象,然后利用該對象的相關方法從鍵盤上讀取數(shù)據(jù),下面這篇文章主要給大家介紹了關于Java中Scanner類使用的相關資料,需要的朋友可以參考下
    2023-04-04
  • 新版POI獲取日期類型cell值過程圖解

    新版POI獲取日期類型cell值過程圖解

    這篇文章主要介紹了新版POI獲取日期類型cell值過程圖解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-10-10
  • java 創(chuàng)建線程的幾種方式

    java 創(chuàng)建線程的幾種方式

    本文主要介紹了java中創(chuàng)建線程的幾種方式。具有很好的參考價值,下面跟著小編一起來看下吧
    2017-02-02
  • 史上最通俗理解的Java死鎖代碼演示

    史上最通俗理解的Java死鎖代碼演示

    這篇文章主要給大家介紹了關于Java死鎖代碼演示的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-09-09

最新評論