package com.doumee.core.wx; import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.support.BeanDefinitionBuilder; import org.springframework.beans.factory.support.BeanDefinitionRegistry; import org.springframework.beans.factory.support.DefaultListableBeanFactory; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.stereotype.Component; /** * NOTICE: NEVER USE IT WHEN REGISTERING A SPRING BEAN. * * @author Guang YANG */ @Component public class SpringUtils implements ApplicationContextAware { private static ApplicationContext CTX; public static ApplicationContext get() { return CTX; } @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { CTX = applicationContext; } /** * 向容器中动态添加Bean * * @param ctx * @param beanName * @param beanClass */ public static void addBean(ApplicationContext ctx, String beanName, Class beanClass) { BeanDefinitionRegistry beanDefReg = (DefaultListableBeanFactory)ctx.getAutowireCapableBeanFactory(); BeanDefinitionBuilder beanDefBuilder = BeanDefinitionBuilder.genericBeanDefinition(beanClass); BeanDefinition beanDef = beanDefBuilder.getBeanDefinition(); if (!beanDefReg.containsBeanDefinition(beanName)) { beanDefReg.registerBeanDefinition(beanName, beanDef); } } /** * 从容器中移除Bean * * @param ctx * @param beanName */ public static void removeBean(ApplicationContext ctx, String beanName) { BeanDefinitionRegistry beanDefReg = (DefaultListableBeanFactory) ctx.getAutowireCapableBeanFactory(); beanDefReg.getBeanDefinition(beanName); beanDefReg.removeBeanDefinition(beanName); } /** * 遍历输出所有Bean的信息 */ static void showAllBeans(ApplicationContext ctx) { //遍历 for (String name : ctx.getBeanDefinitionNames()) { System.out.println("name:" + name + ",class:" + ctx.getBean(name).getClass()); } } }