Spring手動獲取bean的四種方式
更新時間:2024年01月07日 08:51:09 作者:hvige
本文主要介紹了Spring手動獲取bean的四種方式,包括BeanFactoryPostProcessor接口,ApplicationContextAware接口,注解 @PostConstruct 初始化時獲取,啟動類ApplicationContext獲取這四種方法,感興趣的可以了解一下
一、實(shí)現(xiàn)BeanFactoryPostProcessor接口
@Component
public class SpringUtil implements BeanFactoryPostProcessor {
private static ConfigurableListableBeanFactory beanFactory;
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
this.beanFactory = beanFactory;
}
/**
* 通過name獲取 Bean對象
* @param name
* @return Object 一個以所給名字注冊的bean實(shí)例
*/
public static <T> T getBean(String name) {
return (T) beanFactory.getBean(name);
}
/**
* 通過class獲取Bean對象
* @param clazz
* @param <T>
* @return
*/
public static <T> T getBean(Class<T> clazz){
return beanFactory.getBean(clazz);
}
/**
* 如果BeanFactory包含一個與所給名稱匹配的bean對象,則返回true
* @param name
* @return
*/
public static boolean containsBean(String name){
return beanFactory.containsBean(name);
}
/**
* 判斷bean對象是一個singleton還是一個prototype
* @param name
* @return
* @throws NoSuchBeanDefinitionException
*/
public static boolean isSingleton(String name) throws NoSuchBeanDefinitionException{
return beanFactory.isSingleton(name);
}
/**
* 通過 name獲取 bean 的類型
* @param name
* @return
* @throws NoSuchBeanDefinitionException
*/
public static Class<?> getType(String name) throws NoSuchBeanDefinitionException{
return beanFactory.getType(name);
}
/**
* 通過 name 獲取 bean定義的別名
* @param name
* @return
*/
public static String[] getAliases(String name){
return beanFactory.getAliases(name);
}
}二、實(shí)現(xiàn)ApplicationContextAware接口
@Component
public class BeanUtil implements ApplicationContextAware {
private static ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
BeanUtil.applicationContext = applicationContext;
}
/**
* 獲取applicationContext
*
* @return
*/
public static ApplicationContext getApplicationContext() {
return applicationContext;
}
/**
* 通過name獲取 Bean對象
*
* @param name
* @return
*/
public static Object getBean(String name) {
return getApplicationContext().getBean(name);
}
/**
* 通過class獲取Bean對象
* @param clazz
* @param <T>
* @return
*/
public static <T> T getBean(Class<T> clazz) {
return getApplicationContext().getBean(clazz);
}
/**
* 通過name和Class返回指定的Bean對象
*
* @param name
* @param clazz
* @param <T>
* @return
*/
public static <T> T getBean(String name, Class<T> clazz) {
return getApplicationContext().getBean(name, clazz);
}
/**
* 獲取當(dāng)前的環(huán)境配置
* @return
*/
public static String[] getActiveProfiles(){
return getApplicationContext().getEnvironment().getActiveProfiles();
}
}三、注解 @PostConstruct 初始化時獲取
@Component
public class BeanStatic {
@Autowired
private TestService testService;
@Autowired
private static TestService staticTestService;
/**
* 用于在依賴關(guān)系注入完成之后需要執(zhí)行的方法上
* 執(zhí)行任何初始化操作
*/
@PostConstruct
public void init() {
// 初始化時把testService對象賦值給當(dāng)前類定義的靜態(tài)變量
staticTestService = testService;
}
// 在當(dāng)前類調(diào)用業(yè)務(wù)接口
public static String getTest() {
return staticTestService.test();
}
}四、通過啟動類ApplicationContext獲取
@SpringBootApplication
public class WebApplication {
public static ConfigurableApplicationContext applicationContext;
public static void main(String[] args) {
System.out.println("正在啟動。。。");
applicationContext = SpringApplication.run(WebApplication.class, args);
System.out.println("啟動成功");
}
}
調(diào)用方式
@RestController
@RequestMapping("/bean")
@Api(tags = "手動獲取Bean對象測試")
public class BeanController {
@GetMapping("test1")
@ApiOperation("方式一")
@ApiOperationSupport(order = 1)
public IResult test1()
{
TestService testService = SpringUtil.getBean(TestService.class);
String result = testService.test();
return IResult.success(result);
}
@GetMapping("test2")
@ApiOperation("方式二")
@ApiOperationSupport(order = 2)
public IResult test2()
{
TestService testService = BeanUtil.getBean(TestService.class);
String result = testService.test();
return IResult.success(result);
}
@GetMapping("test3")
@ApiOperation("方式三")
@ApiOperationSupport(order = 3)
public IResult test3()
{
String result = BeanStatic.getTest();
return IResult.success(result);
}
@GetMapping("test4")
@ApiOperation("方式四")
@ApiOperationSupport(order = 4)
public IResult test4()
{
TestService testService = WebApplication.applicationContext.getBean(TestService.class);
String result = testService.test();
return IResult.success(result);
}
}到此這篇關(guān)于Spring手動獲取bean的四種方式的文章就介紹到這了,更多相關(guān)Spring手動獲取bean 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java之BigDecimal實(shí)現(xiàn)詳解
這篇文章主要介紹了Java之BigDecimal實(shí)現(xiàn)詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01
java多線程編程之慎重使用volatile關(guān)鍵字
volatile關(guān)鍵字相信了解Java多線程的讀者都很清楚它的作用。volatile關(guān)鍵字用于聲明簡單類型變量,下面看一下為什么要慎重使用volatile關(guān)鍵字2014-01-01
Java內(nèi)存模型與JVM運(yùn)行時數(shù)據(jù)區(qū)的區(qū)別詳解
這篇文章主要介紹了Java內(nèi)存模型與JVM運(yùn)行時數(shù)據(jù)區(qū)的區(qū)別詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-10-10
使用idea生成springboot程序的docker鏡像的操作指南
這篇文章給大家詳細(xì)的介紹了使用idea生成springboot程序的docker鏡像的操作指南,文中通過圖文結(jié)合給大家講解的非常詳細(xì),具有一定的參考價值,需要的朋友可以參考下2023-12-12
深入理解Spring事務(wù)及傳播機(jī)制之原理解析與實(shí)際應(yīng)用
Spring事務(wù)管理機(jī)制提供了多種傳播行為,可以控制事務(wù)的范圍和隔離級別,保證數(shù)據(jù)一致性和完整性。在實(shí)際應(yīng)用中,需要根據(jù)具體業(yè)務(wù)場景選擇合適的傳播行為實(shí)現(xiàn)事務(wù)控制2023-04-04
java實(shí)現(xiàn)emqx設(shè)備上下線監(jiān)聽詳解
這篇文章主要為大家介紹了java實(shí)現(xiàn)emqx設(shè)備上下線監(jiān)聽詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07

