从Spring 应用上下文获取 Bean

news/2024/11/28 23:43:11/

ApplicationContext 提供了获取所有已经成功注入 Spring IoC 容器的 Bean 名称的方法 getBeanDefinitionNames() 。然后我们可以借助于其 getBean(String name) 方法使用 Bean 名称获取特定的 Bean。 我们使用 CommandLineRunner 接口来打印一下结果。

1.1 获取所有的 Bean

 import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.CommandLineRunner;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.context.ApplicationContext;import java.util.stream.Stream;/*** @author Felordcn*/@SpringBootApplicationpublic class WarSpringBootApplication implements CommandLineRunner {@Autowiredprivate ApplicationContext applicationContext;public static void main(String[] args) {SpringApplication.run(WarSpringBootApplication.class, args);}@Overridepublic void run(String... args) throws Exception {String[] beanDefinitionNames = applicationContext.getBeanDefinitionNames();Stream.of(beanDefinitionNames).forEach(beanName->{System.out.println("beanName : " + beanName);Object bean = applicationContext.getBean(beanName);System.out.println("Spring bean : " + bean);});}}

1.2 通过名称获取特定的 Bean

  • 有的 beanName 是类全限定名。
  • @Component@Repository@Service@Controller等注解创建 Bean 时,如果不指定bean名称,名称的默认规则是类名的首字母小写,如 cn.felord.war.controller.FooController 为 fooController。如果类名前两个或以上个字母都是大写,那么名称与类名一样,如 cn.felord.war.controller.IServiceImpl 为 IServiceImpl
  • @Bean 标识的 Bean 默认 为方法名称。
  • 配置类相关注解 @Configuration 一般使用类全限定名。

但是请注意:如果你在声明 Bean 的时候指定了名称就只是你指定的名称 。如果我们熟悉这些规则,使用上面提到的getBean(String name) 方法不失为一种好办法。

1.3 通过类型来获取 Bean

        如果我们不清楚我们想要的特定类型 Bean 的名称,我们可以根据类型来获取 Bean 。ApplicationContext 提供了可以加载特定类型的 Bean 的所有 Bean 的方法getBeansOfType()。它将返回 Map <String,Object> 其中键是 Bean 名称,而值是 Bean 的实际对象。

     @Overridepublic void run(String... args) throws Exception {Map<String, FooController> beansOfType = applicationContext.getBeansOfType(FooController.class);beansOfType.forEach((beanName,bean)->{System.out.println("beanName : " + beanName);System.out.println("bean : " + bean);});}

1.4 获取特定 Bean 声明注解标记的 Bean

ApplicationContext 的 getBeansWithAnnotation() 方法可以让我们获取 @Service@Controller或任何其它可以用来创建 Bean 的注解创建的 Bean 。

     @Overridepublic void run(String... args) throws Exception {Map<String, Object> beansWithAnnotation = applicationContext.getBeansWithAnnotation(Controller.class);beansWithAnnotation.forEach((beanName,bean)->{System.out.println("beanName : " + beanName);System.out.println("bean : " + bean);});}


http://www.ppmy.cn/news/966945.html

相关文章

wordpress 检索分类 get_terms

用法 get_terms($taxonomies, $args )传递变量按 wp_parse_args()等函数所用的格式。 $myterms get_terms("orderbycount&amp;hide_emptyfalse"); $args array( orderby > name, order > ASC, hide_empty > true, exclude > array(), exclude_…

chatgpt赋能python:Python图片分辨率:一篇关于图像处理的SEO文章

Python 图片分辨率&#xff1a;一篇关于图像处理的SEO文章 Python 是一个备受赞誉的编程语言&#xff0c;它被广泛用于数据分析、机器学习、Web 开发&#xff0c;以及许多其他领域。另外&#xff0c;Python 还被广泛用于图片处理和图像分辨率。 在这篇SEO文章中&#xff0c;我…

chatgpt赋能python:Python绘图教程:如何画出两幅漂亮的图表

Python绘图教程&#xff1a;如何画出两幅漂亮的图表 Python是一种非常强大、灵活的编程语言&#xff0c;不仅在数据分析、科学计算等领域有着广泛的应用&#xff0c;也经常被用于数据可视化和图形绘制。本篇文章将介绍如何使用Python绘制两幅漂亮的图表&#xff0c;并详细说明…

建筑历史与理论 专业 可以使用 ChatGPT 完成哪些工作以及如何完成

作为一个AI语言模型&#xff0c;ChatGPT 凭借其优秀的自然语言处理能力和知识匹配技术&#xff0c;可以帮助建筑历史与理论专业的学生或者研究者完成下列一些工作&#xff1a; 1. 提供建筑历史与理论相关概念、史实或者实践的解释或者定义&#xff1b; 2. 参与讨论或者辩论关…

utools配置内网穿透

安装utools工具&#xff0c;搜索“内网穿透”&#xff1a; 配置&#xff1a; 连接方式&#xff1a; http服务 即常规把内网IP转化为外网IP&#xff0c;可供外网来访问本机资源&#xff0c;需要本地部署web服务器&#xff0c;将要访问的资源放在本地服务器。本地目录 即指定一…

强烈安利 uTools 我的生产力工具

前言 uTools 我真的太爱了&#xff01;作为一名软件测试工程师&#xff0c;我用 uTools 的频率真的太高了…如果 uTools 有唤醒次数记录&#xff0c;我感觉每天起码破 200 了 。真的纯属肌肉记忆&#xff0c;每天上班不自觉的就按起了&#xff1a;Alt 空格键 uTools 是什么 …

Linux Mint(Ubuntu)上 安装 效率神器 utools

我的 Windows 系统的笔记本只有 256G 固态&#xff0c;磁盘已经快用满了&#xff0c;最近想装个 Linux 玩玩&#xff0c;选择了 Linux Mint&#xff0c;然后就在闲置的移动硬盘上安装了 Linux Mint 21 cinnamon。 刚切换到 Linux 还是很不习惯的&#xff0c;还好想起了一直使用…

uTools的插件使用

快捷键ALTSpace(空格键)&#xff0c;打开uTools 桌面会弹出如上的界面&#xff0c;点击红色箭头指向的图标 进入如下界面 点击我的插件&#xff0c;进入如下界面 这里已网页快开插件为例&#xff0c;上图用红色圈住中&#xff0c;点击百度&#xff0c;博客网等等。 点击百度效…