当springboot启动后,如何获取已经放入spring IOC容器的所有bean,不特指springboot,即便没有使用springboot,只使用spring的话,也会有这种功能性的要求的,其实要想获得spring IOC容器里所有的bean,首先要考虑怎么得到spring IOC容器applicationContext,然后才能从applicationContext中通过方法getBeanNamesForType(Class<?> type)获取所有的bean的名字,代码如下所示:
package com.roadjava.sb.utils; import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.stereotype.Component; @Component public class SpringFactory implements ApplicationContextAware{ private static ApplicationContext applicationContext = null; @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { if(SpringFactory.applicationContext == null){ SpringFactory.applicationContext = applicationContext; } } //获取所有在ioc容器里面的bean的名字 public static String[] getAllBeanNames(){ return applicationContext.getBeanNamesForType(Object.class); } }
这里用的有点巧妙,我可以使用getBeanNamesForType(UserHandler.class)获取UserHandler类在容器中的名字,在这里我使用Object.class获取所有Object类型的class,因为java里面所有的类的超级父类都是Object,所以这里会返回IOC容器中所有的bean名称。添加方法映射:
@RequestMapping("/getAllBeansNameInApplicationContext") @ResponseBody public Map<String, Object> getAllBeansNameInApplicationContext(){ //LinkedHashMap按放入的顺序返回 Map<String, Object> returnMap=new LinkedHashMap<>(); String[] arr = SpringFactory.getAllBeanNames(); for (int i = 0; i < arr.length; i++) { returnMap.put((i+1)+"", arr[i]); } return returnMap; }
当请求"/getAllBeansNameInApplicationContext"这个url的时候,就会返回json对象,如下所示:
点击红框中的超链接就调用"/getAllBeansNameInApplicationContext",返回结果截图如下: