国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

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

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|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應用的基礎,所有bean都駐留在ioc容器中,由容器負責管理bean生命周期

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

- 使用ListableBeanFactory接口

- 使用Spring Boot Actuator

使用ListableBeanFactory接口

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

下面示例使用Spring Boot 構建:

首先,我們創建一些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.";
    }
}

我們創建了兩個不同的bean:

1.fooController

2.fooService

現在我們運行該應用。使用applicationContext 對象調用其 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提供了用于監視應用程序統計信息的端點(endpoint)。除了/beans,還包括很多其他端點,官方文檔有詳細說明。

現在我們訪問url: http//

:/beans,如果沒有指定其他獨立管理端口,我們使用缺省端口,結果會返回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
        ]
    }
]

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

小結一下

上面介紹了使用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.第一步,創建java project,引入spring.jar

2.創建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.創建接口MyService,只需要一個測試方法save

4.創建實現類MyServiceImpl,控制臺輸出一句話

5.創建一個自己的解析類MyClassPathXmlApplicationContext

主要是構造方法中的兩步

?
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設置到實體中,并保持到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");// 創建//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.實體類

?
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();

小結一下

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

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

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

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

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

延伸 · 閱讀

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

    Java BufferWriter寫文件寫不進去或缺失數據的解決

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

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

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

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

    程序猿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開發項目有所幫助,感興趣的小伙伴們可以參考一下 ...

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

    小米推送Java代碼

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

    富貴穩中求8032021-07-12
  • Java教程xml與Java對象的轉換詳解

    xml與Java對象的轉換詳解

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

    Java教程網2942020-09-17
  • Java教程Java實現搶紅包功能

    Java實現搶紅包功能

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

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

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

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

    阿杜7482021-02-04
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 成人免费视频视频 | 青青久草 | 欧美精品xx | www,四虎 | av影院在线观看 | 日本不卡一区二区三区在线观看 | av在线日韩 | 日韩视频一区二区 | 国产天天操 | 欧美精品一二三 | 成人日韩在线观看 | 性高湖久久久久久久久aaaaa | 久久这里有精品视频 | av在线精品| 九九九亚洲 | 日本天天操 | 久久亚| 中文字幕亚洲欧美日韩在线不卡 | 日韩中文在线 | 一区二区三区日本 | 一区二区在线视频 | 一区二区三区自拍 | 日韩视频在线一区 | 国产午夜精品一区二区三区视频 | 在线免费黄色 | 国产成人综合网 | 免费午夜在线视频 | 伊人五月天在线 | 四虎永久免费影院 | 国产精品第一区 | 国产精品久久久久一区二区三区 | 国产中文字幕一区 | 欧美日韩精品久久久 | 日韩欧美在线一区 | 中文字幕精品一区二区三区精品 | 国产精品亚洲一区 | 日韩中文字幕视频在线观看 | 日本一二三视频 | 99免费视频 | 99re在线观看 | 欧美成人精品一区二区男人看 |