Spring手動獲取bean的四種方式
更新時間:2024年01月07日 08:51:09 作者:hvige
本文主要介紹了Spring手動獲取bean的四種方式,包括BeanFactoryPostProcessor接口,ApplicationContextAware接口,注解 @PostConstruct 初始化時獲取,啟動類ApplicationContext獲取這四種方法,感興趣的可以了解一下
一、實現(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實例 */ 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); } }
二、實現(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); } /** * 獲取當前的環(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對象賦值給當前類定義的靜態(tài)變量 staticTestService = testService; } // 在當前類調(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多線程編程之慎重使用volatile關(guān)鍵字
volatile關(guān)鍵字相信了解Java多線程的讀者都很清楚它的作用。volatile關(guān)鍵字用于聲明簡單類型變量,下面看一下為什么要慎重使用volatile關(guān)鍵字2014-01-01Java內(nèi)存模型與JVM運行時數(shù)據(jù)區(qū)的區(qū)別詳解
這篇文章主要介紹了Java內(nèi)存模型與JVM運行時數(shù)據(jù)區(qū)的區(qū)別詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2019-10-10使用idea生成springboot程序的docker鏡像的操作指南
這篇文章給大家詳細的介紹了使用idea生成springboot程序的docker鏡像的操作指南,文中通過圖文結(jié)合給大家講解的非常詳細,具有一定的參考價值,需要的朋友可以參考下2023-12-12深入理解Spring事務(wù)及傳播機制之原理解析與實際應(yīng)用
Spring事務(wù)管理機制提供了多種傳播行為,可以控制事務(wù)的范圍和隔離級別,保證數(shù)據(jù)一致性和完整性。在實際應(yīng)用中,需要根據(jù)具體業(yè)務(wù)場景選擇合適的傳播行為實現(xiàn)事務(wù)控制2023-04-04java實現(xiàn)emqx設(shè)備上下線監(jiān)聽詳解
這篇文章主要為大家介紹了java實現(xiàn)emqx設(shè)備上下線監(jiān)聽詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-07-07