java本身就可以通过接口、构造等实现依赖注入,那为什么Spring的依赖注入还会大行其道呢?


Author: Kimmy

java本身就可以通过接口、构造等实现依赖注入,那为什么Spring的依赖注入还会大行其道呢?

知乎链接


请做一个简单对比:

new HelloWorldApp(DefaultStrategyFactory.getInstance(),
new PrintMessageResolver(
new TokenizedMessageParser(
new WordsTokenizer(DefaultTokenListFactory.getInstance())),
new ConcreteTokenVisitor()))
.say(DefaultMessageFactory
.getInstance().create("Hello world", System.out));

new ApplicationRunner().run(HelloWorldApp.class);

一个用的是手动依赖注入,一个用了IoC容器。

代码见 kenpusney/hello
==================

我觉得很简单,无论是@Autowire,还是xml配置,都需要我做额外的事情就是去读Spring的配置。所以在我的代码里面,@Inject设计成了可以加入实现类的。在HelloWorldApp里面就能看到他会依赖到哪些东西。当然这也就会带来Atry所提到的另外一个问题就是硬编码

但是XML配置和各种@Configuration依然也是在硬编码嘛。

所以,在程序入口点(比如main)以及各种服务终结点(比如routing),这种硬编码并不需要特别地做额外抽取。这也是为什么第一种做法我依然很喜欢的原因。就像Atry说的,所有的依赖一目了然。

诚然,Spring给了我很多方便的东西,比如AOP,但这实际上只是在给Java的设计缺陷打补丁。但是反过来看,当国内Java社区大部分人都很难驾驭Scala的时候,有这么一个补丁也蛮好的。

另外,关于声明式和命令式的问题。我觉得并不是在于是否抽离出一套专门的DSL(注解也好,XML配置也好),而是有没有好好考虑过设计。
比如正则表达式,也包含分支判断甚至是断言,仍不妨碍其精炼的声明式结构。
再比如上面代码中的第一种做法,也只是声明并初始化了一个HelloWorldApp而已。

创建时间:2015-12-09 最近更新时间:2023-11-03