diff --git a/spring-context/src/main/java/org/springframework/context/support/LiveBeansView.java b/spring-context/src/main/java/org/springframework/context/support/LiveBeansView.java index bf20ae10176..43089a8956d 100644 --- a/spring-context/src/main/java/org/springframework/context/support/LiveBeansView.java +++ b/spring-context/src/main/java/org/springframework/context/support/LiveBeansView.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2012 the original author or authors. + * Copyright 2002-2014 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -25,6 +25,7 @@ import javax.management.MBeanServer; import javax.management.ObjectName; import org.springframework.beans.factory.config.BeanDefinition; +import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; @@ -40,7 +41,7 @@ import org.springframework.util.StringUtils; * (driven by the {@value #MBEAN_DOMAIN_PROPERTY_NAME} environment property). * *

Note: This feature is still in beta and primarily designed for use with - * Spring Tool Suite 3.1. + * Spring Tool Suite 3.1 and higher. * * @author Juergen Hoeller * @since 3.2 @@ -118,6 +119,17 @@ public class LiveBeansView implements LiveBeansViewMBean, ApplicationContextAwar return generateJson(contexts); } + /** + * Find all applicable ApplicationContexts for the current application. + *

Called if no specific ApplicationContext has been set for this LiveBeansView. + * @return the set of ApplicationContexts + */ + protected Set findApplicationContexts() { + synchronized (applicationContexts) { + return new LinkedHashSet(applicationContexts); + } + } + /** * Actually generate a JSON snapshot of the beans in the given ApplicationContexts. *

This implementation doesn't use any JSON parsing libraries in order to avoid @@ -143,11 +155,13 @@ public class LiveBeansView implements LiveBeansViewMBean, ApplicationContextAwar result.append("\"beans\": [\n"); ConfigurableListableBeanFactory bf = context.getBeanFactory(); String[] beanNames = bf.getBeanDefinitionNames(); - for (int i = 0; i < beanNames.length; i++) { - String beanName = beanNames[i]; + boolean elementAppended = false; + for (String beanName : beanNames) { BeanDefinition bd = bf.getBeanDefinition(beanName); - if (bd.getRole() != BeanDefinition.ROLE_INFRASTRUCTURE && - (!bd.isLazyInit() || bf.containsSingleton(beanName))) { + if (isBeanEligible(beanName, bd, bf)) { + if (elementAppended) { + result.append(",\n"); + } result.append("{\n\"bean\": \"").append(beanName).append("\",\n"); String scope = bd.getScope(); if (!StringUtils.hasText(scope)) { @@ -173,9 +187,7 @@ public class LiveBeansView implements LiveBeansViewMBean, ApplicationContextAwar result.append("\""); } result.append("]\n}"); - if (i < beanNames.length - 1) { - result.append(",\n"); - } + elementAppended = true; } } result.append("]\n"); @@ -189,14 +201,16 @@ public class LiveBeansView implements LiveBeansViewMBean, ApplicationContextAwar } /** - * Find all applicable ApplicationContexts for the current application. - *

Called if no specific ApplicationContext has been set for this LiveBeansView. - * @return the set of ApplicationContexts + * Determine whether the specified bean is eligible for inclusion in the + * LiveBeansView JSON snapshot. + * @param beanName the name of the bean + * @param bd the corresponding bean definition + * @param bf the containing bean factory + * @return {@code true} if the bean is to be included; {@code false} otherwise */ - protected Set findApplicationContexts() { - synchronized (applicationContexts) { - return new LinkedHashSet(applicationContexts); - } + protected boolean isBeanEligible(String beanName, BeanDefinition bd, ConfigurableBeanFactory bf) { + return (bd.getRole() != BeanDefinition.ROLE_INFRASTRUCTURE && + (!bd.isLazyInit() || bf.containsSingleton(beanName))); } }