iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >如何获取所有spring管理的bean
  • 354
分享到

如何获取所有spring管理的bean

2024-04-02 19:04:59 354人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

目录获取所有spring管理的beanioc容器使用ListableBeanFactory接口使用Spring Boot Actuator小结一下spring管理bean的原理使用s

获取所有spring管理的bean

本文我们探索使用不同的方式获取spring容器中所有bean。

ioC容器

bean是基于spring应用的基础,所有bean都驻留在ioc容器中,由容器负责管理bean生命周期

有两种方式可以获取容器中的bean:

- 使用ListableBeanFactory接口

- 使用Spring Boot Actuator

使用ListableBeanFactory接口

ListableBeanFactory接口提供了getBeanDefinitionNames() 方法,能够返回所有定义bean的名称。该接口被所有factory实现,负责预加载bean定义去枚举所有bean实例。官方文档提供所有其子接口及其实现。

下面示例使用Spring Boot 构建:

首先,我们创建一些spring bean,先定义简单的Controller FooController:


@Controller
public class FooController {
    @Autowired
    private FooService fooService;
    @RequestMapping(value="/displayallbeans") 
    public String getHeaderAndBody(Map model){
        model.put("header", fooService.getHeader());
        model.put("message", fooService.getBody());
        return "displayallbeans";
    }
}

该Controller依赖另一个spring Bean FooService:


@Service
public class FooService {
    public String getHeader() {
        return "Display All Beans";
    }
    public String getBody() {
        return "This is a sample application that displays all beans "
          + "in Spring IoC container using ListableBeanFactory interface "
          + "and Spring Boot Actuators.";
    }
}

我们创建了两个不同的bean:

1.fooController

2.fooService

现在我们运行该应用。使用applicationContext 对象调用其 getBeanDefinitionNames() 方法,负责返回applicationContext上下文中所有bean。


@SpringBootApplication
public class Application {
    private static ApplicationContext applicationContext;
    public static void main(String[] args) {
        applicationContext = SpringApplication.run(Application.class, args);
        displayAllBeans();
    }
    public static void displayAllBeans() {
        String[] allBeanNames = applicationContext.getBeanDefinitionNames();
        for(String beanName : allBeanNames) {
            System.out.println(beanName);
        }
    }
}

会输出applicationContext上下文中所有bean:

fooController

fooService

//other beans

需注意除了我们定义的bean外,它还将打印容器中所有其他bean。为了清晰起见,这里省略了很多。

使用Spring Boot Actuator

Spring Boot Actuator提供了用于监视应用程序统计信息的端点(endpoint)。除了/beans,还包括很多其他端点,官方文档有详细说明。

现在我们访问url: Http//

:/beans,如果没有指定其他独立管理端口,我们使用缺省端口,结果会返回JSON,包括容器所有定义的bean信息:


[
    {
        "context": "application:8080",
        "parent": null,
        "beans": [
            {
                "bean": "fooController",
                "aliases": [],
                "scope": "singleton",
                "type": "com.baeldung.displayallbeans.controller.FooController",
                "resource": "file [E:/Workspace/tutorials-master/spring-boot/target
                  /classes/com/baeldung/displayallbeans/controller/FooController.class]",
                "dependencies": [
                    "fooService"
                ]
            },
            {
                "bean": "fooService",
                "aliases": [],
                "scope": "singleton",
                "type": "com.baeldung.displayallbeans.service.FooService",
                "resource": "file [E:/Workspace/tutorials-master/spring-boot/target/
                  classes/com/baeldung/displayallbeans/service/FooService.class]",
                "dependencies": []
            },
            // ...other beans
        ]
    }
]

当然,结果同样包括很多其他的bean,为了简单起见,这里没有列出。

小结一下

上面介绍了使用ListableBeanFactory 接口和 Spring Boot Actuators 返回spring 容器中所有定义的bean信息。

spring管理bean的原理

Spring容器默认情况下,当服务启动时,解析配置文件,实例化文件中的所有类。

使用spring时,获取spring注入的bean是这样


ApplicationContext ctx = new ClassPathXmlApplicationContext("spring.xml");
              MyService myService1 = (MyService) ctx.getBean("myService");

那下面我们模拟spring管理bean这个的过程

代码如下:

1.第一步,创建java project,引入spring.jar

2.创建spring.xml配置文件


<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
 </beans>

3.创建接口MyService,只需要一个测试方法save

4.创建实现类MyServiceImpl,控制台输出一句话

5.创建一个自己的解析类MyClassPathXmlApplicationContext

主要是构造方法中的两步


// 装载实例化bean
       private Map<String, Object> beanMap = new HashMap<String, Object>();
       // 装载配置文件的属性和值
       private List<MyBeans> beanlist = new ArrayList<MyBeans>();      
       public MyClassPathXmlApplicationContext(String filename) {
              //第一步,解析spring配置文件
              readXml(filename);
              //第二步,通过反射,实例化所有注入bean
              initBeans();
       }
 
       
       private void initBeans() {
              for (MyBeans bean : beanlist) {
                     try {
                            if (bean.getClassName() != null && !"".equals(bean.getClassName())) {
                                   beanMap.put(bean.getId(), Class.forName(bean.getClassName()).newInstance());
                            }
                     } catch (Exception e) {
                            e.printStackTrace();
                     }
              }
       }
 
       
       private void readXml(String filename) {
              SAXReader reader = new SAXReader();
 
              Document doc = null;
              URL xmlpath = this.getClass().getClassLoader().getResource(filename);
              try {
                     Map<String, String> nsMap = new HashMap<String, String>();
                     nsMap.put("ns", "http://www.springframework.org/schema/beans");
                     doc = reader.read(xmlpath);
                     XPath xpath = doc.createXPath("//ns:beans//ns:bean");// 创建//ns:beans//ns:bean查询路径
                     xpath.setNamespaceURIs(nsMap);// 设置命名空间
                     List<Element> eles = xpath.selectnodes(doc);// 取得文档下所有节点
                     for (Element element : eles) {
                            String id = element.attributeValue("id");
                            String cn = element.attributeValue("class");
                            //自定义实体bean,保存配置文件中id和class
                            MyBeans beans = new MyBeans(id, cn);
                            beanlist.add(beans);
                     }
              } catch (Exception e) {
                     e.printStackTrace();
              }
 
       }
 
       public Object getBean(String beanId) {
              return beanMap.get(beanId);
       }

6.实体类


package com.mooing.service; 
public class MyBeans {
       private String id;
       private String className; 
       public MyBeans(String id, String className) {
              this.id = id;
              this.className = className;
       }
 
       public String getId() {
              return id;
       }
 
       public void setId(String id) {
              this.id = id;
       }
 
       public String getClassName() {
              return className;
       }
 
       public void setClassName(String className) {
              this.className = className;
       }
}

7.测试


MyClassPathXmlApplicationContext ctx = new MyClassPathXmlApplicationContext("spring.xml");
  MyService myService = (MyService) ctx.getBean("myService");
  myService.save();

小结一下

自定义代码同样可以得到使用spring容器实例化的效果,也就是说,实际spring实例化管理bean时,也是经过两大步:

第一:服务启动解析配置文件,并保存配置文件中的元素;

第二:实例化所有元素,并提供获取实例方法。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: 如何获取所有spring管理的bean

本文链接: https://www.lsjlt.com/news/135793.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何获取所有spring管理的bean
    目录获取所有spring管理的beanIOC容器使用ListableBeanFactory接口使用Spring Boot Actuator小结一下spring管理bean的原理使用s...
    99+
    2022-11-12
  • spring如何获取bean的源码解析
    这篇文章主要介绍了spring如何获取bean的源码解析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。源码直接看源码吧@Overridepublic Object&...
    99+
    2023-06-14
  • Spring中获取Bean对象的注入方式有哪些
    本篇内容主要讲解“Spring中获取Bean对象的注入方式有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Spring中获取Bean对象的注入方式有哪些”吧!前言获取 bean 对象也叫做对...
    99+
    2023-07-05
  • 利用JSP 如何实现获取spring容器中的bean
    这篇文章给大家介绍利用JSP 如何实现获取spring容器中的bean,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。JSP 获取spring容器中bean的方法总结方案1(Web中使用):ApplicationCont...
    99+
    2023-05-31
    jsp spring bean
  • win7如何获得管理员所有权
    这篇文章主要介绍了win7如何获得管理员所有权,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、在桌面空白处右键,选择新建文本文档。二、将以下内容复制到刚刚创建的文本文档中。...
    99+
    2023-06-28
  • java如何获取list所有值
    在Java中,可以使用for循环遍历List来获取所有值。具体步骤如下:1. 定义一个List对象,例如:```javaList l...
    99+
    2023-09-20
    java
  • java中如何获取map的所有键
    在Java中,可以使用`keySet()`方法获取Map的所有键。该方法返回一个Set集合,其中包含Map中所有的键。以下是一个示例...
    99+
    2023-08-31
    java
  • JavaScript如何获取对象的所有键
    这篇文章主要为大家展示了“JavaScript如何获取对象的所有键”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“JavaScript如何获取对象的所有键”这篇文章吧。获取对象的所有键cosnt&...
    99+
    2023-06-27
  • golang 如何获取map所有key的方式
    最佳方式:根据map的长度,新建一个数组,遍历map逐个压入 方法1(效率很高): func getKeys1(m map[int]int) []int { // 数组默认长度...
    99+
    2022-11-12
  • Springboot项目如何获取所有的接口
    目录Springboot项目获取所有接口获取项目下所有http接口的信息一、接口信息类二、单元测试Springboot项目获取所有接口 @Autowired private We...
    99+
    2022-11-12
  • redis中如何获取list中的所有元素
    这篇文章主要介绍了redis中如何获取list中的所有元素,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一种方法是用 lrange( key, 0, -1 )。这种方法不会影...
    99+
    2023-06-14
  • Java如何获取接口所有的实现类
    目录Java获取接口所有的实现类反射获取接口的所有实现类总结Java获取接口所有的实现类 最近因业务需求,要实现NodeRed服务后端化,为使各个节点的解析进行插件化(NodeRed...
    99+
    2023-01-09
    Java接口 Java实现类 Java获取接口实现类
  • php如何获取对象的所有方法名
    这篇“php如何获取对象的所有方法名”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“php如何获取对象的所有方法名”文章吧。在...
    99+
    2023-06-29
  • thinkphp如何获取模块下的所有方法
    这篇文章主要介绍“thinkphp如何获取模块下的所有方法”,在日常操作中,相信很多人在thinkphp如何获取模块下的所有方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”thinkphp如何获取模块下的所...
    99+
    2023-07-06
  • java如何获取数据库所有表名
    要获取数据库中的所有表名,可以使用如下的Java代码:```javaimport java.sql.Connection;impor...
    99+
    2023-09-27
    java 数据库
  • java如何获取压缩包下所有文件
    要获取压缩包下的所有文件,可以使用Java的ZipFile类来实现。下面是一个示例代码: import java.io.IOExce...
    99+
    2023-10-27
    java
  • python如何获取目录下所有子目录
    Python可以使用os模块来获取目录下的所有子目录。方法一:使用os.walk()函数os.walk()函数可以遍历指定目录下的所...
    99+
    2023-09-27
    python
  • springboot如何获取接口下所有实现类
    目录springboot获取接口下所有实现类springboot动态调用实现类1、添加接口2、创建实现类3、获取实现类的相关接口 springboot获取接口下所有实现类 ...
    99+
    2022-11-13
  • android中是如何获取联系人所有信息的
    这篇文章将为大家详细讲解有关android中是如何获取联系人所有信息的,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。工具类:package com.example.test;imp...
    99+
    2023-05-30
    android
  • 如何获取Android设备挂载的所有存储器
    android系统提供了Environment.getExternalStorageDirectory()接口获得存储器的路径,但是这个接口往往给的结果并不是我们想要的,在某些...
    99+
    2022-06-06
    存储器 存储 Android
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作