spring动态bean注册示例分享

1.在一些特殊的场景中需要动态向spring注册bean
2.spring版本2.5.6


public class ServiceServiceImpl implements ServiceService,ApplicationContextAware {

 @Override
 public void setApplicationContext(org.springframework.context.ApplicationContext applicationContext)
   throws BeansException {
  this.context = applicationContext;
 }

 public void addBeanService(Service service) throws BVSException {
  if (!context.containsBean(service.getServiceName())) {
   Class<?> serviceClass = getServiceClass(service.getClassName());
   BeanDeFinitionBuilder beanDeFinitionBuilder = BeanDeFinitionBuilder.genericBeanDeFinition(serviceClass);
   beanDeFinitionBuilder.addPropertyValue("servicename",service.getServiceName());
   registerBean(service.getServiceName(),beanDeFinitionBuilder.getRawBeanDeFinition());
  }

 }

 /**
  * @desc 向spring容器注册bean
  * @param beanName
  * @param beanDeFinition
  */
 private void registerBean(String beanName,BeanDeFinition beanDeFinition) {
  ConfigurableApplicationContext configurableApplicationContext = (ConfigurableApplicationContext) context;
  BeanDeFinitionRegistry beanDefinitonRegistry = (BeanDeFinitionRegistry) configurableApplicationContext
    .getbeanfactory();
  beanDefinitonRegistry.registerBeanDeFinition(beanName,beanDeFinition);
 }

 /**
  * @desc 根据类名查找class
  * @param className
  * @return
  * @throws BVSException
  */
 private Class<?> getServiceClass(String className) throws BVSException {
  try {
   return Thread.currentThread().getContextClassLoader().loadClass(className);
  } catch (ClassNotFoundException e) {
   log.error("not found service class:" + className,e);
   throw new BVSException("not found service class:" + className,e);
  }
 }
}

相关文章

HashMap是Java中最常用的集合类框架,也是Java语言中非常典型...
在EffectiveJava中的第 36条中建议 用 EnumSet 替代位字段,...
介绍 注解是JDK1.5版本开始引入的一个特性,用于对代码进行说...
介绍 LinkedList同时实现了List接口和Deque接口,也就是说它...
介绍 TreeSet和TreeMap在Java里有着相同的实现,前者仅仅是对...
HashMap为什么线程不安全 put的不安全 由于多线程对HashMap进...