锁定老帖子 主题:还是没有明白IoC的好处
精华帖 (1) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2004-09-07
to gigix
我是spring初学者,土土的问一句,不用getBean,那么该怎么搞才能得到容器管理bean的实例? |
|
返回顶楼 | |
发表时间:2004-09-07
就拿WebWork为例吧。你可以把Spring的配置跟xWork的配置连起来,把Spring管理的bean注射到xWork的action里面。xWork action当然是不需要你自己创建的,WebWork的front controller servlet会帮你创建它们,所以整个系统中你不需要创建任何一个组件。如果你用其他的web框架,也会有类似的办法。
所以你刚才说的“包名+类名”的bean命名规则是愚蠢的。想想吧,如果你修改了Spring这边一个bean的实现类,你就得同时去修改一个WebWork action的配置。 |
|
返回顶楼 | |
发表时间:2004-09-07
sorry 其实我的本意是 包名+接口名 还是想解决bean太多时重名问题,因为我们作erp,经常需要成千上万的bean,本来包名就是来解决命名空间的,如果再规划一套不重复的id,是否不太爽啊?
|
|
返回顶楼 | |
发表时间:2004-09-07
你的每个组件肯定是要完成某个——重要的——任务,所以你才把它交给容器去管理。如果你甚至不能给它起一个unique的名字,它存在的价值就很可疑了。这里的关键是,容器里注册的不是“对象”,而是“组件”——接口与实现的结合体。如果要讨论命名空间,那也得是组件的命名空间,而不是对象的。最起码的,如果用包名+类名作为组件名,当你想为这个组件换一个实现,岂不是连名字也换了?
|
|
返回顶楼 | |
发表时间: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上自己再作个配置文件解析...... |
|
返回顶楼 | |
发表时间:2004-09-07
to Readonly
有见地! |
|
返回顶楼 | |
发表时间:2004-09-08
readonly, 原来你们就这么“使用”容器呀?
看来我那一棒子没起作用,死心塌地滥用容器是春风吹又生啊! 容器管理组件,你却在组件里写代码干涉容器,好个循环依赖。 同意gigix, 永远不要getBean。 |
|
返回顶楼 | |
发表时间:2004-09-16
ajoo 写道 readonly, 原来你们就这么“使用”容器呀?
看来我那一棒子没起作用,死心塌地滥用容器是春风吹又生啊! 容器管理组件,你却在组件里写代码干涉容器,好个循环依赖。 同意gigix, 永远不要getBean。 没有理解,如何不使用getBean?能够给个例子先? |
|
返回顶楼 | |
发表时间:2005-03-06
搞了半天,就解决一个new的问题,这就是所谓的oo。直接写new也死不了人。不要相信这些oo鬼话,有一帮子人是专门靠制造名词炒作名词为生的,这不过是今年流行的款式而已。
不过是个适应性比较强的工厂。哪里用得着那么多废话来讲。 |
|
返回顶楼 | |
发表时间:2005-03-07
http://smsbim.blogchina.com/
|
|
返回顶楼 | |