论坛首页 Java版 Spring

关于spring context 的问题

浏览 2537 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
最后更新时间:2007-11-06
jeremydomett 写道
我需要的 bean 的个数并不是固定的~
而是要根据运行时的需要动态添加的~

也就是我想在运行是向容器里动态增加 和 在配置文件里写<bean>
一样功能的东西~

然后再 用 getBean("***") 来使用动态增加的 bean



可以看看 tapestry5 IOC。
   
0 请登录后投票
最后更新时间:2007-11-06
jeremydomett 写道
spring 是根据在配置文件里写的 <bean>....</bean>
在 ApplicationContext 里可以使用 getBean  来获得一个对象.

问一下:
能不能不在配置文件里写  <bean>....</bean>
而是通过写程序来动态 给  context 添加 bean ?

这个需要直接对spring IOC编程了,比如扩展spring IOC的LoadBeanDefinition的相关实现。但我不太明白,如果想要动态的bean,为什么不在context里定义一个FactoryBean然后由他为你生成呢?
   
0 请登录后投票
最后更新时间:2007-11-07
jeremydomett 写道
我需要的 bean 的个数并不是固定的~
而是要根据运行时的需要动态添加的~

也就是我想在运行是向容器里动态增加 和 在配置文件里写<bean>
一样功能的东西~

然后再 用 getBean("***") 来使用动态增加的 bean

Spring bean的5种scope都不能满足你的要求么?你的业务很特别啊,有点好奇~~~
   
0 请登录后投票
最后更新时间:2007-11-07
动态的Bean管理.看一下OSGI.
   
0 请登录后投票
最后更新时间:2008-04-20
osgi 是个好东西, 确实能满足你很多需要的哦
   
0 请登录后投票
最后更新时间:2008-04-28
  这并不奇怪, 使用XML 来进行配置,这种配置方式是一种"静态"绑定。但在一些场境中,为了更加灵活,需要在运行时进行运态绑定。

  举个例子,做 RCP 开发时,UI组件的生命周期是由RCP 框架来管理,并非由IOC 来创建,这时我们就不能将这些组件写到XML文件中。

   解决办法都有好多,例如 在UI 与业务层中建立一个簿层,使用 ApplicationContext (将依赖转为Spring API)来获取业务类。

  还有就是, Spring 也提供使用代码方式来创建 bean。只不过,大部分人习惯使用 XML 来配置,所以了解的不多(包括我。。 ^-^), 下面一段编程加入Bean的代码:

public static void main(String[] args)
{
DefaultListableBeanFactory beanRegistry = new DefaultListableBeanFactory();
BeanFactory container = (BeanFactory)bindViaCode(beanRegistry);
FXNewsProvider newsProvider = (FXNewsProvider)container.getBean("djNewsProvider");
newsProvider.getAndPersistNews();
}

public static BeanFactory bindViaCode(BeanDefinitionRegistry registry)
{
AbstractBeanDefinition newsProvider = new RootBeanDefinition(FXNewsProvider.class,true);
AbstractBeanDefinition newsListener = new RootBeanDefinition(DowJonesNewsListener.class,true);
AbstractBeanDefinition newsPersister = new RootBeanDefinition(DowJonesNewsPersister.class,true);
    // register beans to container
    registry.registerBeanDefinition("djNewsProvider", newsProvider);
    registry.registerBeanDefinition("djListener", newsListener);
    registry.registerBeanDefinition("djPersister", newsPersister);
// resolve dependencies
    // 1 constructor injection
    ConstructorArgumentValues argValues = new ConstructorArgumentValues();
    argValues.addIndexedArgumentValue(0, newsListener);
    argValues.addIndexedArgumentValue(1, newsPersister);
    newsProvider.setConstructorArgumentValues(argValues);
    // 2 setter injection
MutablePropertyValues propertyValues = new MutablePropertyValues();
    propertyValues.addPropertyValue(new PropertyValue("newsListener",newsListener));
    propertyValues.addPropertyValue(new PropertyValue("newPersistener",newsPersister));
    newsProvider.setPropertyValues(propertyValues);
    // binding is done
return (BeanFactory)registry;
}

正如,java 这样的静态语言受欢迎的同时,也会有 Ruby 这样的动态语言受热棒。动静相宜,这是太极所表达的真理。
   
0 请登录后投票
论坛首页 Java版 Spring

跳转论坛:
JavaEye推荐