level 9
在Spring的体系中,这种被初始化好的,可以被用的Object被称为“Bean”,以避免和Java自己术语的object混淆,也利于顺便从EJB用户那里刷存在感(都是“Bean”嘛)。Bean的配置和注入都用xml来定义(称为application context)。用Spring写的程序启动时会优先启动Spring的一个加载器来读取xml文件,并且按照xml里的描述来自动创建、初始化和管理Bean(Spring后续版本也支持用annotation或者Java代码描述注入关系了,但是道理是一样的)。Spring加载器会自动识别依赖关系,按照树形结构依次创建那些Bean。万一发生了依赖循环,Spring能自己检测出来并报错。这就把程序员关于系统里Object怎么初始化,管理和相互引用的工作量降到最低。
2020年11月16日 01点11分
2
level 9
通过动态注入,Spring可以搞一些比较炫的功能,比如绕开访问权限,直接注入private成员,方便编码和测试;动态产生代码以实现AOP;还有最玄幻的AutoConfiguration。Spring能根据当前能加载的Bean有哪些来决定如何初始化一些业务功能。比如启动时,如果classpath里有HSQLDB,而开发者并没有手工配置数据源的类型,那么Spring就会帮你创建一个HSQLDB的内存数据源,来应对那些需要注入DataSource的地方。Spring会用类似的办法帮你决定controller的返回是变成json还是xml,mvc里到底用哪套模版引擎,监控数据到底输出哪些metrics等等。
2020年11月16日 01点11分
3
level 9
动态编码在表达能力上肯定是比静态更灵活和方便,有利于提高开发效率。但动态注入也有不小的代价,就是编译器不能帮助检查错误了,程序员要面对大量的运行时错误。此外,报错信息也会比较难看。最后,加载Object的速度也比静态编译好的代码要慢。
2020年11月16日 01点11分
4
level 9
Beyond注入
抛开注入这个事情本身, Spring实际上提供的是全家桶式的开发支持。这才是他被大量使用的更主要的原因。Spring的注入能力只是其庞大身躯中比较核心的内容,但是相比于其他功能来说非常小。 Spring的作者最早想做的事情是“J2EE Development without EJB“。Spring在Java Web服务这个领域的地位几乎无可撼动。
2020年11月16日 01点11分
5
level 9
Dagger主要的应用场景是Android的开发,原因是Android的JRE的反射特别慢,所以不得不利用静态注入的方式来提速。
2020年11月16日 01点11分
6
level 9
历史小知识:Spring诞生于2002~2004年;Guice诞生于2007年;Dagger1诞生于2013年;Dagger2诞生于2015年;刚好与“直觉上”的顺序相反,很有趣吧。
2020年11月16日 01点11分
7