spring ioc 的好处???

2018-04-18 15:22:09 +08:00
 zhecaoli

都说 spring ioc 的好处是可以在切换调用新增的业务方法的时候,不需要修改一行代码,也不需要重新编译,只需要修改配置文件 spring.txt ,再运行即可。

但是,我很好奇:这个新增的业务类是怎么放进去 jar 包的?我看网上的文章总是说直接修改配置文件,难道这个新增的业务类本来就在 jar 包了吗?)还是说通过 jar uf 来塞进去?大神们有过这样的实战经验吗?

3206 次点击
所在节点    程序员
18 条回复
Cbdy
2018-04-18 15:25:43 +08:00
原因只是因为 Java 不支持 object 关键词
zhecaoli
2018-04-18 15:26:35 +08:00
@Cbdy 啥?
zjp
2018-04-18 15:34:03 +08:00
修改 Spring 配置文件能够替换掉 bean 的方法,但新的类总归还是要打包进去。正确的表述应该是"不需要修改一行原有代码,也不需要重新编译旧代码"……感觉是在浮夸吹捧 Spring …

楼上说的是 Java 不原生支持单例
cloudzhou
2018-04-18 15:41:20 +08:00
你去关注一下几个关键词:

面向接口编程 /依赖,注入,依赖接口而不是实现,等等
zhecaoli
2018-04-18 15:42:19 +08:00
@zjp 嗯,这样说就好理解了,新增的类编译后 重新打包,省掉的是编译原来的代码的时间, 没有很大的代码量的公司确实没有这样的经历。。。谢谢了
lhx2008
2018-04-18 15:45:02 +08:00
ioc,在组织方式上更加灵活,可以完全控制对象的生命周期,而且可以先实现接口不实现类,最后再按类型注入,这样开发过程中就互不干扰,互不依赖。
aop 的好处就不说了
zhecaoli
2018-04-18 15:45:13 +08:00
@cloudzhou 我理解这些概念,只是对于这种操作有疑惑:“ 不需要修改一行代码,也不需要重新编译,只需要修改配置文件 spring.txt ,再运行” , 我好奇在线上怎么进行这种切换呢
zhecaoli
2018-04-18 15:46:09 +08:00
@lhx2008 只看标题就回答了吧😂
zjp
2018-04-18 15:48:37 +08:00
@zhecaoli #5 我还是学生…只是试过 Spring 里方法替换的功能……
其他楼层都在回答你的标题…这标题误导了……
lhx2008
2018-04-18 15:50:26 +08:00
@zhecaoli 这种意义不大,打包的时间又不用很久,而且大部分都用注解了。
zhecaoli
2018-04-18 15:50:44 +08:00
@zjp 也没办法修改了看来,没有 stackoverflow 那么方便
zhecaoli
2018-04-18 15:52:41 +08:00
@lhx2008 嗯,基本都用了注解了,也就是说现在 spring ioc 这种免编译的好处 是可以忽略的了?
lhx2008
2018-04-18 15:52:44 +08:00
jar 包运行的时候肯定是已经解压了的,可以替换 class,这种也和 spring 没关系。但是意义不大,具体可以看热更新的一些技术。
rensuperk
2018-04-18 16:10:52 +08:00
我怎么感觉楼上的都偏题了。。。
nl101531
2018-04-18 16:32:26 +08:00
IOC 只是业务上的解耦. 比如我最近写的一个观察者模式,所有的观察者在 Subject 中可以 Spring 容器启动完毕后自动注入.
这样我新增观察者只需要写一个实现对应观察者接口的类,让 Spring 管理就好了,其他都不用理会.这就是一种解耦.

```java

private void initPaidObserver(ContextRefreshedEvent event) {
Map<String, OrderPaidHandlerObserver> matchingBeans =
BeanFactoryUtils.beansOfTypeIncludingAncestors(event.getApplicationContext(), OrderPaidHandlerObserver.class, true, false);
this.paidObservers = Collections.unmodifiableList(Lists.newArrayList(matchingBeans.values()));
if (this.paidObservers.size() <= 0) {
throw new IllegalStateException("OrderPaidHandlerObserver not found");
} else {
log.info("initPaidObserver finish, observer is {}", matchingBeans.keySet());
}
}

```
earendil1412
2018-04-18 16:46:14 +08:00
你不写单元测试?
如果没有 IOC,没有数据库的情况下要测试 Service 怎么办
hsuan
2018-04-18 17:14:53 +08:00
简单来说,IOC 的好处就是解耦
Inside
2018-04-18 17:28:00 +08:00
建议把 spring 去掉,ioc 不是 spring 特有的。
你去看看宇宙最好的语言写出来的 laravel,照样 ioc+各种依赖注入。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/447823

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX