直接上代碼:
java
public class BeanUtils implements ApplicationContextAware { protected static Logger logger = LoggerFactory.getLogger(BeanUtils.class); protected ApplicationContext applicationContext; protected DefaultListableBeanFactory beanFactory; public void init() { ConfigurableApplicationContext context = (ConfigurableApplicationContext) applicationContext; beanFactory = (DefaultListableBeanFactory) context.getBeanFactory(); } public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { this.applicationContext = applicationContext; } //初始化 protected DefaultListableBeanFactory initBeanFactory() { ConfigurableApplicationContext context = (ConfigurableApplicationContext) applicationContext; return (DefaultListableBeanFactory) context.getBeanFactory(); } }
/** * Created by zhangqidzq on 16/4/27. */ public class GenericBeanUtils extends BeanUtils { /** * 註冊一個新的 bean,若是該beanName的值已存在,則直接返回 * * @param genericBeanConfig */ public void regGeneralBean(GenericBeanConfig genericBeanConfig) { if (null == beanFactory) { beanFactory = initBeanFactory(); } if (applicationContext.containsBean(genericBeanConfig.getBeanName())) { return; } BeanDefinitionBuilder beanBuilder = buildGeneralBean(genericBeanConfig); registBean(genericBeanConfig.getBeanName(), beanBuilder); } /** * 得到已註冊的bean * * @param beanName * @return */ public Object getBean(String beanName) { try { return applicationContext.getBean(beanName); } catch (NoSuchBeanDefinitionException e) { return null; } catch (BeansException e) { return null; } } /** * 構建 bean * * @param genericBeanConfig * @return */ private BeanDefinitionBuilder buildGeneralBean(GenericBeanConfig genericBeanConfig) { BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.rootBeanDefinition(genericBeanConfig.getBeanClass()); beanDefinitionBuilder.setInitMethodName(genericBeanConfig.getInitMethod()); Map<String, String> properties = genericBeanConfig.getPropertyMap(); for (Map.Entry<String, String> entry : properties.entrySet()) { beanDefinitionBuilder.addPropertyValue(entry.getKey(), entry.getValue()); } return beanDefinitionBuilder; } /** * 動態註冊bean * * @param beanName * @param beanBuilder */ private void registBean(String beanName, BeanDefinitionBuilder beanBuilder) { beanFactory.registerBeanDefinition(beanName, beanBuilder.getBeanDefinition()); } /** * 向spring的beanFactory動態地裝載bean * * @param configLocationString 要裝載的bean所在的xml配置文件位置 */ public void loadBean(String configLocationString) { XmlBeanDefinitionReader beanDefinitionReader = new XmlBeanDefinitionReader((BeanDefinitionRegistry) beanFactory); beanDefinitionReader.setResourceLoader(applicationContext); beanDefinitionReader.setEntityResolver(new ResourceEntityResolver(applicationContext)); try { String[] configLocations = new String[]{configLocationString}; for (int i = 0; i < configLocations.length; i++) beanDefinitionReader.loadBeanDefinitions(applicationContext.getResources(configLocations[i])); } catch (BeansException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }
public class GenericBeanConfig { private String beanName; private Class<?> beanClass; private String initMethod; private Map<String, String> propertyMap; public String getBeanName() { return beanName; } public void setBeanName(String beanName) { this.beanName = beanName; } public Class<?> getBeanClass() { return beanClass; } public void setBeanClass(Class<?> beanClass) { this.beanClass = beanClass; } public String getInitMethod() { return initMethod; } public void setInitMethod(String initMethod) { this.initMethod = initMethod; } public Map<String, String> getPropertyMap() { return propertyMap; } public void setPropertyMap(Map<String, String> propertyMap) { this.propertyMap = propertyMap; } }