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