激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術(shù)及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - 如何獲取所有spring管理的bean

如何獲取所有spring管理的bean

2022-01-04 13:11夢想畫家 Java教程

這篇文章主要介紹了如何獲取所有spring管理的bean,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

獲取所有spring管理的bean

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

IOC容器

bean是基于spring應用的基礎(chǔ),所有bean都駐留在ioc容器中,由容器負責管理bean生命周期

有兩種方式可以獲取容器中的bean:

- 使用ListableBeanFactory接口

- 使用Spring Boot Actuator

使用ListableBeanFactory接口

ListableBeanFactory接口提供了getBeanDefinitionNames() 方法,能夠返回所有定義bean的名稱。該接口被所有factory實現(xiàn),負責預加載bean定義去枚舉所有bean實例。官方文檔提供所有其子接口及其實現(xiàn)。

下面示例使用Spring Boot 構(gòu)建:

首先,我們創(chuàng)建一些spring bean,先定義簡單的Controller FooController:

?
1
2
3
4
5
6
7
8
9
10
11
@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:

?
1
2
3
4
5
6
7
8
9
10
11
@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.";
    }
}

我們創(chuàng)建了兩個不同的bean:

1.fooController

2.fooService

現(xiàn)在我們運行該應用。使用applicationContext 對象調(diào)用其 getBeanDefinitionNames() 方法,負責返回applicationContext上下文中所有bean。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
@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提供了用于監(jiān)視應用程序統(tǒng)計信息的端點(endpoint)。除了/beans,還包括很多其他端點,官方文檔有詳細說明。

現(xiàn)在我們訪問url: http//

:/beans,如果沒有指定其他獨立管理端口,我們使用缺省端口,結(jié)果會返回json,包括容器所有定義的bean信息:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
[
    {
        "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
        ]
    }
]

當然,結(jié)果同樣包括很多其他的bean,為了簡單起見,這里沒有列出。

小結(jié)一下

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

spring管理bean的原理

Spring容器默認情況下,當服務啟動時,解析配置文件,實例化文件中的所有類。

使用spring時,獲取spring注入的bean是這樣

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

那下面我們模擬spring管理bean這個的過程

代碼如下:

1.第一步,創(chuàng)建java project,引入spring.jar

2.創(chuàng)建spring.xml配置文件

?
1
2
3
4
<?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.創(chuàng)建接口MyService,只需要一個測試方法save

4.創(chuàng)建實現(xiàn)類MyServiceImpl,控制臺輸出一句話

5.創(chuàng)建一個自己的解析類MyClassPathXmlApplicationContext

主要是構(gòu)造方法中的兩步

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
// 裝載實例化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();
       }
 
       /**
        * 通過反射機制,初始化配置文件中的bean
        */
       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();
                     }
              }
       }
 
       /**
        * 解析配置文件,把解析后的bean設(shè)置到實體中,并保持到list
        *
        * @param filename
        */
       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");// 創(chuàng)建//ns:beans//ns:bean查詢路徑
                     xpath.setNamespaceURIs(nsMap);// 設(shè)置命名空間
                     List<Element> eles = xpath.selectNodes(doc);// 取得文檔下所有節(jié)點
                     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.實體類

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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.測試

?
1
2
3
MyClassPathXmlApplicationContext ctx = new MyClassPathXmlApplicationContext("spring.xml");
  MyService myService = (MyService) ctx.getBean("myService");
  myService.save();

小結(jié)一下

自定義代碼同樣可以得到使用spring容器實例化的效果,也就是說,實際spring實例化管理bean時,也是經(jīng)過兩大步:

第一:服務啟動解析配置文件,并保存配置文件中的元素;

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

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持服務器之家。

原文鏈接:https://blog.csdn.net/neweastsun/article/details/80464893

延伸 · 閱讀

精彩推薦
  • Java教程Java BufferWriter寫文件寫不進去或缺失數(shù)據(jù)的解決

    Java BufferWriter寫文件寫不進去或缺失數(shù)據(jù)的解決

    這篇文章主要介紹了Java BufferWriter寫文件寫不進去或缺失數(shù)據(jù)的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望...

    spcoder14552021-10-18
  • Java教程升級IDEA后Lombok不能使用的解決方法

    升級IDEA后Lombok不能使用的解決方法

    最近看到提示IDEA提示升級,尋思已經(jīng)有好久沒有升過級了。升級完畢重啟之后,突然發(fā)現(xiàn)好多錯誤,本文就來介紹一下如何解決,感興趣的可以了解一下...

    程序猿DD9332021-10-08
  • Java教程Java使用SAX解析xml的示例

    Java使用SAX解析xml的示例

    這篇文章主要介紹了Java使用SAX解析xml的示例,幫助大家更好的理解和學習使用Java,感興趣的朋友可以了解下...

    大行者10067412021-08-30
  • Java教程20個非常實用的Java程序代碼片段

    20個非常實用的Java程序代碼片段

    這篇文章主要為大家分享了20個非常實用的Java程序片段,對java開發(fā)項目有所幫助,感興趣的小伙伴們可以參考一下 ...

    lijiao5352020-04-06
  • Java教程小米推送Java代碼

    小米推送Java代碼

    今天小編就為大家分享一篇關(guān)于小米推送Java代碼,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧...

    富貴穩(wěn)中求8032021-07-12
  • Java教程xml與Java對象的轉(zhuǎn)換詳解

    xml與Java對象的轉(zhuǎn)換詳解

    這篇文章主要介紹了xml與Java對象的轉(zhuǎn)換詳解的相關(guān)資料,需要的朋友可以參考下...

    Java教程網(wǎng)2942020-09-17
  • Java教程Java實現(xiàn)搶紅包功能

    Java實現(xiàn)搶紅包功能

    這篇文章主要為大家詳細介紹了Java實現(xiàn)搶紅包功能,采用多線程模擬多人同時搶紅包,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙...

    littleschemer13532021-05-16
  • Java教程Java8中Stream使用的一個注意事項

    Java8中Stream使用的一個注意事項

    最近在工作中發(fā)現(xiàn)了對于集合操作轉(zhuǎn)換的神器,java8新特性 stream,但在使用中遇到了一個非常重要的注意點,所以這篇文章主要給大家介紹了關(guān)于Java8中S...

    阿杜7482021-02-04
主站蜘蛛池模板: 一级看片免费视频 | 少妇一级淫片高潮流水电影 | 全黄性色大片 | av日韩一区二区三区 | 一区二区三区欧美在线 | 91精品国产99久久久久久 | 日韩毛片一区二区三区 | 九九精品在线观看视频 | 91成人免费视频 | 成人性生活视频在线播放 | 久久99精品久久久久久秒播蜜臀 | 午夜视频在线免费观看 | 成人激情在线 | 草久在线| 国产一区网址 | av免费在线观看国产 | mmmwww| 欧洲色阁中文字幕 | 亚洲va国产va | 日韩电影视频 | 中韩毛片 | 97porn| 黄色片视频观看 | 欧美另类视频在线 | 久久嗨| 精品久久久一二三区播放播放播放视频 | 国产女厕一区二区三区在线视 | 亚洲日本乱码在线观看 | 成人毛片久久 | 国产成年人视频 | 羞羞的视频 | 成人三区四区 | xnxx 日本免费 | 久久精品国产清自在天天线 | 久草资源在线观看 | 色综合久久99 | 羞羞视频免费视频欧美 | 亚洲网站在线观看视频 | 日韩.www| 欧美日韩电影在线 | 欧美一极视频 |