在本文中,咱們將探索在容器中獲取全部spring管理的bean的相關技術。這有神馬用?主要是用於排查問題。通常都是咱們建立的某一個bean沒有啓動的問題。畢竟工做中老是會遇到各類各樣的bug。提早了解一些沒有壞處。web
bean是spring管理的應用程序的基礎,全部bean都駐留在IOC容器中,該容器負責管理它們的生命週期。spring
咱們能夠經過兩種方式獲取該容器內全部bean的列表:app
ListableBeanFactory接口提供了getBeanDefinitionNames()方法,該方法返回在這個工廠中定義的全部bean的名稱。您能夠在官方文檔中找到全部已知子接口及其實現類的列表。咱們來看這種方式如何獲取全部的bean。spring-boot
`@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依賴於另外一個FooService。spa
`@Service
public class FooService {
public String getHeader() {
return "Display All Beans";
}
public String getBody() {
return "展現全部beans的案例";
}
}
`code
注意,咱們在這裏建立了兩個不一樣的bean:對象
這裏使用applicationContext對象並調用它的getBeanDefinitionNames()方法,該方法將返回applicationContext容器中的全部bean:blog
`@SpringBootApplication
public class DemoApplication {
private static ApplicationContext applicationContext;
public static void main(String[] args) {
applicationContext = SpringApplication.run(DemoApplication.class, args);
displayAllBeans();
}
public static void displayAllBeans() {
String[] allBeanNames = applicationContext.getBeanDefinitionNames();
for(String beanName : allBeanNames) {
System.out.println(beanName);
}
}
}
`接口
這將打印applicationContext容器中的全部bean:
注意,除了咱們定義的bean以外,它還將記錄該容器中的全部其餘bean。爲了清楚起見,咱們在這裏省略了它們,由於它們有不少。
Spring Boot Actuator提供了用於監控應用程序統計信息的端點。下面看看這種方式:
`<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
`
management.endpoints.web.exposure.include=*
把上面代碼添加到properties文件中。
因爲這裏的Actuator沒有配置,因此顯示的比較亂。關於Actuator的配置,會在下一篇文章中呈現。
在本文中,咱們瞭解瞭如何使用ListableBeanFactory接口和Spring Boot Actuator在Spring IoC容器中顯示全部bean。但願對你有點幫助。