偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

Spring Bean 的初始化和銷(xiāo)毀的幾種方式,你一般用的是哪種?

開(kāi)發(fā) 前端
今天了不起給大家介紹了一下 Spring 的三種初始化和三種銷(xiāo)毀對(duì)象的方式,并且通過(guò)示例案例給大家介紹了一下優(yōu)先級(jí),希望對(duì)大家有幫助。

作為一個(gè) Java? 程序員 Spring? 框架在我們?nèi)粘9ぷ骱兔嬖囍锌芍^必不可少,學(xué)習(xí)和掌握好 Spring 對(duì)我們來(lái)說(shuō)是很有必要的。

今天了不起就給大家介紹一下 Spring? 的 Bean 的初始化和銷(xiāo)毀的幾種方式,看看你平時(shí)用的都是哪種。

初始化

由于 Spring Bean? 的初始化都是 Spring 容器幫我們處理的,我們這里說(shuō)的初始化是指在容器幫我們初始化的過(guò)程,我們有哪些方式可以進(jìn)行手動(dòng)干預(yù),或者說(shuō)初始化的時(shí)候如何運(yùn)行我們自己的邏輯。

廢話(huà)不多說(shuō),我們依次來(lái)看下面的幾種方式

實(shí)現(xiàn) InitializingBean 接口

我們可以寫(xiě)一個(gè)類(lèi),然后實(shí)現(xiàn) InitializingBean? 接口,通過(guò)覆蓋其中的 afterPropertiesSet()? 方法來(lái)實(shí)現(xiàn)我們自己的邏輯,我們寫(xiě)一個(gè) case 來(lái)實(shí)現(xiàn)一下,如下所示

package com.example.demo.service;

import org.springframework.beans.factory.InitializingBean;

public class InitServiceImpl implements InitializingBean {
private String name;
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("afterPropertiesSet...");
this.name = "Java極客技術(shù) afterPropertiesSet";
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}
}

實(shí)現(xiàn)的方式很簡(jiǎn)單,直接實(shí)現(xiàn) org.springframework.beans.factory.InitializingBean? 這個(gè)接口然后覆蓋 afterPropertiesSet 這個(gè)方法即可,在這個(gè)方法里面,我們就可以執(zhí)行我們需要在初始化時(shí)候就執(zhí)行的代碼。

比如這里我們?cè)诔跏蓟椒ɡ锩嬷苯咏o一個(gè)屬性進(jìn)行賦值,后續(xù)就可以直接使用了,如下所示

package com.example.demo.controller;

@RestController
public class HelloController {

@Autowired
InitServiceImpl initService;

@GetMapping(value = "/hello")
public String hello(@RequestParam String name) {
return initService.getName();
}
}

圖片

可以看到是可以直接獲取到屬性值的,這個(gè)比較簡(jiǎn)單我們就不贅述了,繼續(xù)看下面兩個(gè)方式。

增加 @PostConstruct 注解

我們繼續(xù)在 InitServiceImpl? 類(lèi)中增加一個(gè)方法,并且在方法上面增加 @PostConstruct 注解,如下所示

@PostConstruct
public void postConstruct() {
System.out.println("postConstruct...");
this.name = "Java極客技術(shù) postConstruct";
}

這種寫(xiě)法比實(shí)現(xiàn)一個(gè)接口要簡(jiǎn)單一點(diǎn),畢竟只要增加一個(gè)注解就行了,而不需要覆蓋接口的方法,不過(guò)本質(zhì)上沒(méi)什么區(qū)別。

自定義 init 方法

這種方式也很簡(jiǎn)單,只不過(guò)我們做兩個(gè)動(dòng)作,第一個(gè)是在 InitServiceImpl 

public void initMethod() {
System.out.println("initMethod...");
this.name = "Java極客技術(shù) initMethod";
}

然后再寫(xiě)一個(gè)配置類(lèi),在配置類(lèi)中定義一個(gè)方法,在方法上面增加一個(gè) @Bean? 注解,并且賦值一個(gè) init-method 方法,同時(shí)這個(gè)方法需要?jiǎng)?chuàng)建對(duì)象并返回,如下所示

package com.example.demo.service;

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

@Configuration
public class Config {

@Bean(initMethod = "initMethod")
public InitServiceImpl initServiceImpl() {
return new InitServiceImpl();
}
}

怎么樣是不是也很簡(jiǎn)單。

小結(jié)

在這里問(wèn)大家一個(gè)問(wèn)題,如果我們?cè)谕粋€(gè)類(lèi)中同時(shí)存在這三種初始化方法,那會(huì)是什么情況呢?

我們來(lái)試一下就知道了,通過(guò)完整的代碼,我們將三種方式都寫(xiě)進(jìn)來(lái),然后啟動(dòng)服務(wù)。

package com.example.demo.service;

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

import javax.annotation.PostConstruct;

public class InitServiceImpl implements InitializingBean {
private String name;

@Override
public void afterPropertiesSet() throws Exception {
System.out.println("afterPropertiesSet...");
this.name = "Java極客技術(shù) afterPropertiesSet";
}

@PostConstruct
public void postConstruct() {
System.out.println("postConstruct...");
this.name = "Java極客技術(shù) postConstruct";
}

public void initMethod() {
System.out.println("initMethod...");
this.name = "Java極客技術(shù) initMethod";
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}
}

可以看到,我們的服務(wù)是正常的啟動(dòng)和運(yùn)行,并且三個(gè)方法都正常的執(zhí)行了,執(zhí)行的順序依次是 postConstruct,afterPropertiesSet,initMethod?,那么這里問(wèn)一下小伙伴們,此時(shí)我們的 name 值是什么呢?

圖片

銷(xiāo)毀

既然我們初始化有三種形式,可以很自然的想到銷(xiāo)毀是不是也有三種形式呢?沒(méi)錯(cuò),銷(xiāo)毀的三種方法,也是跟上面類(lèi)似,分別是

  1. 實(shí)現(xiàn) org.springframework.beans.factory.DisposableBean? 接口,覆蓋 destroy() 方法;
  2. 自定義一個(gè)方法,在方法上面增加 @PreDestroy 注解;
  3. 在 InitServiceImpl?  中增加一個(gè)自定義銷(xiāo)毀方法,然后在配置類(lèi)中增加 Bean? 的 destoryMethod;

相關(guān)的內(nèi)容也比較簡(jiǎn)單,在上面的 InitServiceImpl? 和 Config 基礎(chǔ)上只要增加一點(diǎn)點(diǎn)內(nèi)容就好了

public class InitServiceImpl implements InitializingBean, DisposableBean {

public void destroyMethod() throws Exception {
System.out.println("destroyMethod...");
}

@Override
public void destroy() throws Exception {
System.out.println("destroy...");
}

@PreDestroy
public void preDestroy() throws Exception {
System.out.println("preDestroy...");
}
}

@Bean(initMethod = "initMethod", destroyMethod = "destroyMethod")
public InitServiceImpl initServiceImpl() {
return new InitServiceImpl();

}

銷(xiāo)毀的三個(gè)方法在執(zhí)行的時(shí)候也是有優(yōu)先級(jí)的,依次是 preDestroy,destroy,destroyMethod。

至此完整的一個(gè)包含三個(gè)初始化和三個(gè)銷(xiāo)毀方法的代碼就完成了,我們來(lái)運(yùn)行一下看看整體的流程。

圖片

總結(jié)

雖然說(shuō) Spring 給我們提供了三種初始化和三種銷(xiāo)毀的方法,不過(guò)我們?cè)谌粘5膶?xiě)代碼中很少會(huì)把三種都寫(xiě)上,但是對(duì)于這幾種的優(yōu)先級(jí)還是有必要了解的,萬(wàn)一別人給你挖坑了怎么辦呢?

好了,今天了不起給大家介紹了一下 Spring 的三種初始化和三種銷(xiāo)毀對(duì)象的方式,并且通過(guò)示例案例給大家介紹了一下優(yōu)先級(jí),希望對(duì)大家有幫助。

責(zé)任編輯:武曉燕 來(lái)源: Java極客技術(shù)
相關(guān)推薦

2022-11-14 07:33:57

Java場(chǎng)景value

2025-04-25 11:25:00

SpringBean初始化

2023-12-01 10:20:00

SpringBean參數(shù)機(jī)制

2024-10-29 11:27:27

2024-07-31 11:26:05

反射BeanXML

2021-06-26 16:14:11

虛擬機(jī)注冊(cè)鉤子

2022-03-16 11:11:37

SpringBean項(xiàng)目

2023-11-12 23:08:17

C++初始化

2025-02-13 11:11:53

Redis哨兵代碼

2013-01-20 21:55:24

移動(dòng)策略

2009-07-20 15:08:41

Spring實(shí)例化Be

2013-03-04 11:10:03

JavaJVM

2012-02-28 10:04:09

Java

2015-11-11 16:36:23

CA Technolo

2021-01-26 09:14:19

Linux內(nèi)核模塊

2021-05-07 16:19:36

異步編程Java線(xiàn)程

2023-09-08 07:23:52

2022-10-27 07:33:36

序列化協(xié)議Protobuf

2020-06-09 08:09:07

機(jī)器學(xué)習(xí)統(tǒng)計(jì)學(xué)習(xí)無(wú)監(jiān)督學(xué)習(xí)

2020-04-08 15:59:23

顯卡Linux命令
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)