当前位置:首页 > 开发 > 系统架构 > 架构 > 正文

[Spring3.1]动态创建Spring bean

发表于: 2012-09-13   作者:dinguangx   来源:转载   浏览次数:
摘要:   目前正在使用的软件开发包中有一个业务服务基类BaseService,所有的自定义服务类都会继续于这个BaseService,但是业务服务实例是由软件包中封装好的BaseServiceFactory创建的,在需要使用具体的业务实例时,BaseServiceFactory接收具体的BaseService类名来创建服务实例,如下:   public BaseService

 

目前正在使用的软件开发包中有一个业务服务基类BaseService,所有的自定义服务类都会继续于这个BaseService,但是业务服务实例是由软件包中封装好的BaseServiceFactory创建的,在需要使用具体的业务实例时,BaseServiceFactory接收具体的BaseService类名来创建服务实例,如下:

 

public BaseService getService(String className);
 

现在想要将该软件开发包与spring进行整合,将所有的业务服务类加入到spring容器中,作为spring bean使用,所以就想采用动态创建spring bean的方式来实现:首先由className生成Bean定义,再由Bean定义来产生代码业务类。

目前spring提供基于XMLannotation等多种方式的bean配置,但是这些配置都是在容器启动的时候已经确定了bean的类型以及参数类型,要实现我们现在的这种业务场景,只有通过BeanDefinitionBuilder来创建Bean定义并加入BeanFactory

springBeanFactory子类众多,其中DefaultListableBeanFactory可以支持动态增加Bean定义,代码实现如下

public class CustomBaseServiceFactory {
 
  private static final String BEAN_POSTFIX = ".service";
  public BaseService getService(String className) {
     String beanName = className + BEAN_POSTFIX;
     ConfigurableApplicationContext applicationContext = (ConfigurableApplicationContext) SpringContextHolder
            .getApplicationContext();
     DefaultListableBeanFactory beanFactory = (DefaultListableBeanFactory) applicationContext
            .getBeanFactory();
     if (!beanFactory.containsBean(beanName)) {
         BeanDefinitionBuilder bdb = BeanDefinitionBuilder
                .rootBeanDefinition(className);
         bdb.setScope("prototype");
         beanFactory.registerBeanDefinition(beanName,
                bdb.getBeanDefinition());
     }
 
     return (BaseService) beanFactory.getBean(beanName);
  }
}
 

这样,即完成了对BaseService的改造,无论是对业务类增加AOP或者注入属性都可以方便地实现。更为方便的是,如果使用的是该类的子类,不再需要在子类上增加@Service,@Component之类的标记了;如果需要在子类中注入其他的bean,只需要在该属性上增加@autowired@resource即可实现属性的注入。

 

 

 

[Spring3.1]动态创建Spring bean

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
上接Spring提供的BeanPostProcessor的扩展点-1继续学习。 一、Bean Validation框架简介 写道 Bean V
上接Spring提供的BeanPostProcessor的扩展点-1继续学习。 一、Bean Validation框架简介 写道 Bean V
上接Spring提供的BeanPostProcessor的扩展点-1继续学习。 一、Bean Validation框架简介 写道 Bean V
上接Spring提供的BeanPostProcessor的扩展点-1继续学习。 一、Bean Validation框架简介 写道 Bean V
上接Spring提供的BeanPostProcessor的扩展点-1继续学习。 一、Bean Validation框架简介 写道 Bean V
上接Spring提供的BeanPostProcessor的扩展点-1继续学习。 一、Bean Validation框架简介 写道 Bean V
上接Spring提供的BeanPostProcessor的扩展点-1继续学习。 一、Bean Validation框架简介 写道 Bean V
上接Spring提供的BeanPostProcessor的扩展点-1继续学习。 一、Bean Validation框架简介 写道 Bean V
上接Spring提供的BeanPostProcessor的扩展点-1继续学习。 一、Bean Validation框架简介 写道 Bean V
上接Spring提供的BeanPostProcessor的扩展点-1继续学习。 一、Bean Validation框架简介 写道 Bean V
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号