其实就是在做 instance 的管理
物件导向一个很重要概念就是 多型
所以你可以在 runtime 再决定 instance 到底是什么
IoC 就是实体是外部送进来 不要自己去 new
DI 只是在提示 要送东西进来的人说 你想要的是什么东西
例如我们可以用 interface 用 name 用 类型等等
来提示我想要的实体是什么
就这么简单而已
那这有什么好处呢... 好处很多
以你那个例子
如果 Server1 产生了 dao1
如果 Server2 也想要这个实体的时候 你要怎么把这个实体送过去给 Server2
你可能要写成
main{
server1 = Server1()
server2 = Server2(server1.dao1)
}
如果你的实体都是个别产生的时候 你就要想办法去维护这些关系
但是你会说 Server2 可以自己 new 这种也只是一种实体管理的特例 prototype
但是这样你会有 2个 实体 就要看里面的特性来决定是否正确
另外还有个问题是 当你自己 new 的时候 很比较缺乏弹性
例如你是 接手开发 Dao1 的人 你想要去做里面的 override
比较理想的改法是
你写一个子类别 Dao11 继承 Dao1 (例如 Dao1 是第三方的 lib)
但是如果你是写成 Server1 去 new Dao1
你要怎么把 Dao11 送进去给 Server1
再来就是统一的容器管理 有一个好处就是 他可以在容器里面帮我们加工
所以可以加上新的 life cycle 可以送 event 可以做 aop 等等
另外有一点就是 早期的 di 是透过 xml 来设定的
这样有一个很大的好处是 不用重新编译
现在虽然都是透过 annotation or java config
但是也都是可以透过 application.yaml 来 override
达到不用重新编译就可以替换的效果