關(guān)于Spring Boot獲取bean的3種方式
在使用spring框架中我們都知道,某個(gè)類(lèi)如果使用了@Service、@Autowire 這種依賴(lài)注入的方式引用了其他對(duì)象,在另外一個(gè)類(lèi)中,只有通過(guò)spring的IOC容重中獲取這個(gè)類(lèi)的實(shí)例時(shí),那些被依賴(lài)的對(duì)象才能正確被初始化,否則那些被依賴(lài)的對(duì)象都是null。
所以就有一個(gè)問(wèn)題,在普通類(lèi)中如何獲取spring ioc容器中的bean(spring托管的bean)。
我們都知道,在spring中ApplicationContext這個(gè)上下文對(duì)象是獲取bean的基礎(chǔ)。
在spring boot中,我們可以通過(guò)下面的三種方式來(lái)獲取Bean。
方式一 注解@PostConstruct

PostConstruct 注釋用于在依賴(lài)關(guān)系注入完成之后需要執(zhí)行的方法上,以執(zhí)行任何初始化。此方法必須在將類(lèi)放入服務(wù)之前調(diào)用。
支持依賴(lài)關(guān)系注入的所有類(lèi)都必須支持此注釋。即使類(lèi)沒(méi)有請(qǐng)求注入任何資源,用 PostConstruct 注釋的方法也必須被調(diào)用。只有一個(gè)方法可以用此注釋進(jìn)行注釋。
應(yīng)用 PostConstruct 注釋的方法必須遵守以下所有標(biāo)準(zhǔn):
該方法不得有任何參數(shù),除非是在 EJB 攔截器 (interceptor) 的情況下,根據(jù) EJB 規(guī)范的定義,在這種情況下它將帶有一個(gè) InvocationContext 對(duì)象 ;
該方法的返回類(lèi)型必須為 void;
該方法不得拋出已檢查異常;
應(yīng)用 PostConstruct 的方法可以是 public、protected、package private 或 private;
除了應(yīng)用程序客戶端之外,該方法不能是 static;
該方法可以是 final;
如果該方法拋出未檢查異常,那么不得將類(lèi)放入服務(wù)中,除非是能夠處理異常并可從中恢復(fù)的 EJB。
方式二 啟動(dòng)類(lèi)ApplicationContext
實(shí)現(xiàn)方式:在springboot的啟動(dòng)類(lèi)中,定義static變量ApplicationContext,利用容器的getBean方法獲得依賴(lài)對(duì)象。推薦一個(gè) Spring Boot 基礎(chǔ)教程及實(shí)戰(zhàn)示例:https://github.com/javastacks/javastack
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
/**
* @author: clx
* @version: 1.1.0
*/
@SpringBootApplication
public class Application {
public static ConfigurableApplicationContext ac;
public static void main(String[] args) {
ac = SpringApplication.run(Application.class, args);
}
}調(diào)用方式
/**
* @author: clx
* @version: 1.1.0
*/
@RestController
public class TestController {
/**
* 方式二
*/
@GetMapping("test2")
public void method_2() {
AutoMethodDemoService methodDemoService = Application.ac.getBean(AutoMethodDemoService.class);
String test2 = methodDemoService.test2();
System.out.println(test2);
}
}方式三 手動(dòng)注入ApplicationContext
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
/**
* springboot靜態(tài)方法獲取 bean 的三種方式(三)
* @author: clx
* @version: 1.1.0
*/
@Component
public class StaticMethodGetBean_3<T> implements ApplicationContextAware {
private static ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
StaticMethodGetBean_3.applicationContext = applicationContext;
}
public static <T> T getBean(Class<T> clazz) {
return applicationContext != null?applicationContext.getBean(clazz):null;
}
}調(diào)用方式
/**
* 方式三
*/
@Test
public void method_3() {
AutoMethodDemoService autoMethodDemoService = StaticMethodGetBean_3.getBean(AutoMethodDemoService.class);
String test3 = autoMethodDemoService.test3();
System.out.println(test3);
}到此這篇關(guān)于關(guān)于Spring Boot獲取bean的3種方式的文章就介紹到這了,更多相關(guān)Spring Boot獲取bean內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java持久化框架Hibernate與Mybatis優(yōu)劣及選擇詳解
這篇文章主要介紹了Java持久化框架Hibernate與Mybatis優(yōu)劣及選擇詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05
C# 數(shù)據(jù)類(lèi)型轉(zhuǎn)換
這篇文章主要講解C語(yǔ)言中基本數(shù)據(jù)類(lèi)型、字符串與其它數(shù)據(jù)類(lèi)型以及常見(jiàn)的日期類(lèi)型的轉(zhuǎn)換,希望能給大家做一個(gè)參考。希望能夠給你帶來(lái)幫助2021-07-07
springboot+redis自定義注解實(shí)現(xiàn)發(fā)布訂閱的實(shí)現(xiàn)代碼
在Redis中客戶端可以通過(guò)訂閱特定的頻道來(lái)接收發(fā)送至該頻道的消息,本文主要介紹了springboot+redis自定義注解實(shí)現(xiàn)發(fā)布訂閱,具有一定的參考價(jià)值,感興趣的可以了解一下2023-08-08
Java?Controller實(shí)現(xiàn)參數(shù)驗(yàn)證與統(tǒng)一異常處理流程詳細(xì)講解
Controller是Spring接受并處理網(wǎng)頁(yè)請(qǐng)求的組件,是整個(gè)應(yīng)用的入口,因此學(xué)會(huì)Controller的常用注解對(duì)理解一個(gè)應(yīng)用是重中之重。SpringBoot的Controller中經(jīng)常會(huì)用到注解@Controller、@RestController、@RequestMapping、@RequestBody等2023-01-01
Java 實(shí)戰(zhàn)項(xiàng)目之在線點(diǎn)餐系統(tǒng)的實(shí)現(xiàn)流程
讀萬(wàn)卷書(shū)不如行萬(wàn)里路,只學(xué)書(shū)上的理論是遠(yuǎn)遠(yuǎn)不夠的,只有在實(shí)戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用java+SSM+jsp+mysql+maven實(shí)現(xiàn)在線點(diǎn)餐系統(tǒng),大家可以在過(guò)程中查缺補(bǔ)漏,提升水平2021-11-11
從dubbo zookeeper注冊(cè)地址提取出zookeeper地址的方法
今天小編就為大家分享一篇關(guān)于從dubbo zookeeper注冊(cè)地址提取出zookeeper地址的方法,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2018-12-12
使用EasyPoi輕松導(dǎo)入導(dǎo)出Excel文檔的方法示例
這篇文章主要介紹了使用EasyPoi輕松導(dǎo)入導(dǎo)出Excel文檔的方法示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12
Springboot如何使用OSHI獲取和操作系統(tǒng)和硬件信息
這篇文章主要介紹了Springboot如何使用OSHI獲取和操作系統(tǒng)和硬件信息問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-10-10

