91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

spring注解配置bean的初始化和銷毀方法是什么

發布時間:2023-05-04 17:56:10 來源:億速云 閱讀:282 作者:iii 欄目:開發技術

這篇文章主要講解了“spring注解配置bean的初始化和銷毀方法是什么”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“spring注解配置bean的初始化和銷毀方法是什么”吧!

當spring完成bean的屬性賦值之后,就會執行bean的初始化方法,而當spring要銷毀bean實例的時候,也會調用bean的銷毀方法。我們可以在初始化方法中做一些資源加載的操作,比如緩存數據到redis。而在銷毀方法中,可以做一些資源釋放的操作,比如刪除redis緩存數據、釋放數據庫連接等。由于我們現在很少寫spring的xml文件,所以這次就講解通過注解的方式來指定bean的初始化方法和銷毀方法。我們先定義如下的配置類、業務服務類和單元測試方法,供后面測試使用。

package com.xk.spring.init;

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

/** 測試初始化方法和銷毀方法
 *
 * @author xk
 * @since 2023.04.30 15:31
 */
@Configuration
public class InitConfig {

    @Bean
    public RedisService redisService(){
        return new RedisService();
    }
}
package com.xk.spring.init;


/**
 * 用于如何配置講解bean的初始化方法
 * @author xk
 * @since 2023.04.30 15:26
 */
public class RedisService{
    public RedisService(){
        System.out.println("這是RedisService構造方法");
    }
}

單元測試方法如下:

    @Test
    public void testInitAndDestroyConfig(){
        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(InitConfig.class);
        applicationContext.close();
    }

1、配置bean的初始化方法

1.1、使用@Bean注解的initMethod屬性

我們在配置類中使用@Bean注解生成bean實例的時候,可以使用@Bean注解的initMethod屬性指定初始化方法,initMethod的值是目標bean對應的類中的方法名,當spring完成bean的屬性賦值之后,就會執行initMethod對應的這個方法。

修改RedisService服務類內容如下,增加自定義的initMethod方法:

package com.xk.spring.init;

/**
 * 用于如何配置講解bean的初始化方法
 * @author xk
 * @since 2023.04.30 15:26
 */
public class RedisService {
    public RedisService(){
        System.out.println("這是RedisService構造方法");
    }

    public void initMethod(){
        System.out.println("(1)這是一個@Bean initMethod初始化方法");
    }
}

修改InitConfig配置類如下,指定@Bean注解的initMethod屬性值為RedisService類中的initMethod方法:

package com.xk.spring.init;

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

/** 測試初始化方法和銷毀方法
 *
 * @author xk
 * @since 2023.04.30 15:31
 */
@Configuration
public class InitConfig {

    @Bean(initMethod = "initMethod")
    public RedisService redisService(){
        return new RedisService();
    }
}

最后執行testInitAndDestroyConfig單元測試方法,得出如下結果:

這是RedisService構造方法
(1)這是一個@Bean initMethod初始化方法

1.2、使用@PostConstruct注解

@PostConstruct注解用于在bean完成依賴注入(屬性賦值)之后需要執行的方法上,它是被用在bean對應的類中定義的方法,而且一個類中只能有一個方法被標記@PostConstruct注解。只要方法所屬的類不是攔截器類而且方法本身無參且沒有返回值,那就可以在這個方法上面使用@PostConstruct注解。(如果方法所屬類的是攔截器類,在滿足一定的要求時也可以使用@PostConstruct注解,但這種情況很少使用,所以此處先不提。)我們保持InitConfig類不變,修改RedisService類內容如下:

package com.xk.spring.init;


import javax.annotation.PostConstruct;

/**
 * 用于如何配置講解bean的初始化方法
 * @author xk
 * @since 2023.04.30 15:26
 */
public class RedisService{

    public RedisService(){
        System.out.println("這是RedisService構造方法");
    }

    public void initMethod(){
        System.out.println("(1)這是一個@Bean initMethod初始化方法");
    }
    
    @PostConstruct
    private void initMethod2(){
        System.out.println("(2)這是一個@PostConstruct初始化方法");
    }
}

最后執行testInitAndDestroyConfig單元測試方法,得出如下結果:

這是RedisService構造方法
(2)這是一個@PostConstruct初始化方法
(1)這是一個@Bean initMethod初始化方法

可以看出,標記@PostConstruct注解的方法要比@Bean注解的InitMethod屬性指定的方法先執行。

1.3、實現InitializingBean接口

InitializingBean接口只有一個afterPropertiesSet方法,假如一個bean完成了屬性賦值,并且這個bean對應的類實現了該接口,spring就會調用afterPropertiesSet方法。我們繼續在前兩步的基礎上進行修改,保持InitConfig類不變,修改RedisService類如下:

package com.xk.spring.init;

import org.springframework.beans.factory.InitializingBean;

import javax.annotation.PostConstruct;

/**
 * 用于如何配置講解bean的初始化方法
 * @author xk
 * @since 2023.04.30 15:26
 */
public class RedisService implements InitializingBean {

    public RedisService(){
        System.out.println("這是RedisService構造方法");
    }

    public void initMethod(){
        System.out.println("(1)這是一個@Bean initMethod初始化方法");
    }

    @PostConstruct
    private void initMethod2(){
        System.out.println("(2)這是一個@PostConstruct初始化方法");
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("(3)這是一個InitializingBean初始化方法");
    }
}

最后執行單元測試,得出結果如下:

這是RedisService構造方法
(2)這是一個@PostConstruct初始化方法
(3)這是一個InitializingBean初始化方法
(1)這是一個@Bean initMethod初始化方法

1.4、總結

bean的初始化方法調用位于bean的屬性賦值之后,我們可以同時使用以上三種方式來指定bean的初始化方法,而且執行順序如下:

@PostConstruct指定的方法-->InitializingBean接口的afterPropertiesSet方法-->@Bean的initMethod屬性指定的方法

2、配置bean的銷毀方法

2.1、使用@Bean注解的destroyMethod屬性

我們在配置類中使用@Bean注解生成bean實例的時候,可以使用@Bean注解的destroyMethod屬性指定bean的銷毀方法,destroyMethod的值是目標bean對應的類中的方法名,當spring完成bean的屬性賦值之后,就會執行destroyMethod對應的這個方法。

我們修改RedisService服務類內容如下,增加自定義的destroyMethod方法:

package com.xk.spring.init;

import org.springframework.beans.factory.InitializingBean;

import javax.annotation.PostConstruct;

/**
 * 用于如何配置講解bean的初始化方法
 * @author xk
 * @since 2023.04.30 15:26
 */
public class RedisService implements InitializingBean {

    public RedisService(){
        System.out.println("這是RedisService構造方法");
    }

    public void initMethod(){
        System.out.println("(1)這是一個@Bean initMethod初始化方法");
    }

    @PostConstruct
    private void initMethod2(){
        System.out.println("(2)這是一個@PostConstruct初始化方法");
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("(3)這是一個InitializingBean初始化方法");
    }

    public void destroyMethod(){
        System.out.println("(1)這是一個@Bean destroyMethod銷毀方法");
    }

}

修改InitConfig配置類如下,指定@Bean注解的destroyMethod屬性值為RedisService類中的destroyMethod方法:

package com.xk.spring.init;

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

/** 測試初始化方法和銷毀方法
 *
 * @author xk
 * @since 2023.04.30 15:31
 */
@Configuration
public class InitConfig {

    @Bean(initMethod = "initMethod",destroyMethod = "destroyMethod")
    public RedisService redisService(){
        return new RedisService();
    }
}

最后執行testInitAndDestroyConfig單元測試方法,得出如下結果:

這是RedisService構造方法
(2)這是一個@PostConstruct初始化方法
(3)這是一個InitializingBean初始化方法
(1)這是一個@Bean initMethod初始化方法
(1)這是一個@Bean destroyMethod銷毀方法

2.2、使用@PreDestroy注解

@PreDestroy注解用于在bean被銷毀時需要執行的方法上,它是被用在bean對應的類中定義的方法,而且一個類中只能有一個方法被標記@PreDestroy注解。只要方法所屬的類不是攔截器類而且方法本身無參且沒有返回值,那就可以在這個方法上面使用@PreDestroy注解。(如果方法所屬類的是攔截器類,在滿足一定的要求時也可以使用@PreDestroyt注解,但這種情況很少使用,所以此處先不提。)我們保持InitConfig類不變,修改RedisService類內容如下:

package com.xk.spring.init;

import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

/**
 * 用于如何配置講解bean的初始化方法
 * @author xk
 * @since 2023.04.30 15:26
 */
public class RedisService implements InitializingBean, DisposableBean {

    public RedisService(){
        System.out.println("這是RedisService構造方法");
    }

    public void initMethod(){
        System.out.println("(1)這是一個@Bean initMethod初始化方法");
    }

    @PostConstruct
    private void initMethod2(){
        System.out.println("(2)這是一個@PostConstruct初始化方法");
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("(3)這是一個InitializingBean初始化方法");
    }

    public void destroyMethod(){
        System.out.println("(1)這是一個@Bean destroyMethod銷毀方法");
    }

    @PreDestroy
    public void destroyMethod2() {
        System.out.println("(2)這是一個@PreDestroy銷毀方法");
    }

}

最后執行testInitAndDestroyConfig單元測試方法,得出如下結果:

這是RedisService構造方法
(2)這是一個@PostConstruct初始化方法
(3)這是一個InitializingBean初始化方法
(1)這是一個@Bean initMethod初始化方法
(2)這是一個@PreDestroy銷毀方法
(1)這是一個@Bean destroyMethod銷毀方法

可以看出,標記@PreDestroy注解的方法要比@Bean注解的destroyMethod屬性指定的方法先執行。

2.3、實現DisposableBean接口

DisposableBean接口只有一個destroy方法,假如一個bean對應的類實現了該接口,spring在bean(或容器)銷毀時就會調用destroy方法。我們繼續在前面代碼的基礎上進行修改,保持InitConfig類不變,修改RedisService類如下:

package com.xk.spring.init;

import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

/**
 * 用于如何配置講解bean的初始化方法
 * @author xk
 * @since 2023.04.30 15:26
 */
public class RedisService implements InitializingBean, DisposableBean {

    public RedisService(){
        System.out.println("這是RedisService構造方法");
    }

    public void initMethod(){
        System.out.println("(1)這是一個@Bean initMethod初始化方法");
    }

    @PostConstruct
    private void initMethod2(){
        System.out.println("(2)這是一個@PostConstruct初始化方法");
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("(3)這是一個InitializingBean初始化方法");
    }

    public void destroyMethod(){
        System.out.println("(1)這是一個@Bean destroyMethod銷毀方法");
    }

    @PreDestroy
    public void destroyMethod2() {
        System.out.println("(2)這是一個@PreDestroy銷毀方法");
    }

    @Override
    public void destroy() throws Exception {
        System.out.println("(3)這是一個DisposableBean銷毀方法");
    }
}

最后執行單元測試,得出結果如下:

這是RedisService構造方法
(2)這是一個@PostConstruct初始化方法
(3)這是一個InitializingBean初始化方法
(1)這是一個@Bean initMethod初始化方法
(2)這是一個@PreDestroy銷毀方法
(3)這是一個DisposableBean銷毀方法
(1)這是一個@Bean destroyMethod銷毀方法

感謝各位的閱讀,以上就是“spring注解配置bean的初始化和銷毀方法是什么”的內容了,經過本文的學習后,相信大家對spring注解配置bean的初始化和銷毀方法是什么這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

沙洋县| 华蓥市| 志丹县| 黔西县| 卓尼县| 通化市| 婺源县| 牡丹江市| 奉化市| 阳西县| 东安县| 清水县| 芮城县| 镇坪县| 五常市| 普兰县| 瑞金市| 黔江区| 西青区| 宣恩县| 静宁县| 东港市| 海盐县| 安乡县| 衡南县| 酒泉市| 侯马市| 宁夏| 南宁市| 兴文县| 南皮县| 南和县| 富蕴县| 泸水县| 增城市| 乌审旗| 阿克苏市| 灵宝市| 丰台区| 普安县| 安新县|