论坛首页 Java企业应用论坛

还是没有明白IoC的好处

浏览 58222 次
精华帖 (1) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2004-09-07  
to gigix
我是spring初学者,土土的问一句,不用getBean,那么该怎么搞才能得到容器管理bean的实例?
0 请登录后投票
   发表时间:2004-09-07  
就拿WebWork为例吧。你可以把Spring的配置跟xWork的配置连起来,把Spring管理的bean注射到xWork的action里面。xWork action当然是不需要你自己创建的,WebWork的front controller servlet会帮你创建它们,所以整个系统中你不需要创建任何一个组件。如果你用其他的web框架,也会有类似的办法。

所以你刚才说的“包名+类名”的bean命名规则是愚蠢的。想想吧,如果你修改了Spring这边一个bean的实现类,你就得同时去修改一个WebWork action的配置。
0 请登录后投票
   发表时间:2004-09-07  
sorry 其实我的本意是 包名+接口名 还是想解决bean太多时重名问题,因为我们作erp,经常需要成千上万的bean,本来包名就是来解决命名空间的,如果再规划一套不重复的id,是否不太爽啊?
0 请登录后投票
   发表时间:2004-09-07  
你的每个组件肯定是要完成某个——重要的——任务,所以你才把它交给容器去管理。如果你甚至不能给它起一个unique的名字,它存在的价值就很可疑了。这里的关键是,容器里注册的不是“对象”,而是“组件”——接口与实现的结合体。如果要讨论命名空间,那也得是组件的命名空间,而不是对象的。最起码的,如果用包名+类名作为组件名,当你想为这个组件换一个实现,岂不是连名字也换了?
0 请登录后投票
   发表时间:2004-09-07  
agilecat 写道
sorry 其实我的本意是 包名+接口名 还是想解决bean太多时重名问题,因为我们作erp,经常需要成千上万的bean,本来包名就是来解决命名空间的,如果再规划一套不重复的id,是否不太爽啊?


嘿嘿, 来秀一下偶们的做法, 封装Spring和Pico不同的特性, 写一个Interface:

public interface IoCContainer {
    public Object getComponent(Object key); throws ComponentNotFoundException;
}


对于Spring你可以这样实现, 这个key既可以是一个用来标示component的String ID, 也可以是一个Class:
public class SpringContainer implements IoCContainer {
    private ApplicationContext applicationContext;
          
    public SpringContainer(ApplicationContext applicationContext);{
        this.applicationContext = applicationContext;
    }
    
    /**
     * @param key component class type or component name   
     * @return
     * @throws ComponentNotFoundException
     */    
    public Object getComponent(Object key); throws ComponentNotFoundException {
        if (applicationContext == null);
            throw new IllegalStateException("Spring Application context has not been set");;
        if (key == null);
            throw new ComponentNotFoundException("The component key can not be null");;
        if (key instanceof Class); {
            String names[] = applicationContext.getBeanDefinitionNames((Class); key);;
            if (names == null);
                throw new ComponentNotFoundException("The container is unable to resolve single instance of "
                        + ((Class); key);.getName(); + ", none instances found");;
            if (names.length == 0 || names.length > 1);
                throw new ComponentNotFoundException("The container is unable to resolve single instance of "
                        + ((Class); key);.getName(); + ", number of instances found was: " + names.length);;
            key = names[0];
        }
        return applicationContext.getBean(key.toString(););;
    }
}


而对于Pico那就只能用Class了, 除非你在Pico这个小巧的lib上自己再作个配置文件解析......
0 请登录后投票
   发表时间:2004-09-07  
to Readonly
有见地!
0 请登录后投票
   发表时间:2004-09-08  
readonly,  原来你们就这么“使用”容器呀?
看来我那一棒子没起作用,死心塌地滥用容器是春风吹又生啊!

容器管理组件,你却在组件里写代码干涉容器,好个循环依赖。

同意gigix, 永远不要getBean。
0 请登录后投票
   发表时间:2004-09-16  
ajoo 写道
readonly,  原来你们就这么“使用”容器呀?
看来我那一棒子没起作用,死心塌地滥用容器是春风吹又生啊!

容器管理组件,你却在组件里写代码干涉容器,好个循环依赖。

同意gigix, 永远不要getBean。

没有理解,如何不使用getBean?能够给个例子先?
0 请登录后投票
   发表时间:2005-03-06  
搞了半天,就解决一个new的问题,这就是所谓的oo。直接写new也死不了人。不要相信这些oo鬼话,有一帮子人是专门靠制造名词炒作名词为生的,这不过是今年流行的款式而已。
不过是个适应性比较强的工厂。哪里用得着那么多废话来讲。
0 请登录后投票
   发表时间:2005-03-07  
http://smsbim.blogchina.com/
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics