1.让对象与对象(模块与模块)之间的关系没有通过代码之间来联系,通过配置类说明,这样可以降低耦合性。
spring会根据这些配置内部通过反射区动态地组装对象。
2.spring是一个容器,凡是在容器里的对象都有spring提供的服务和功能。
3.spring最核心的是IOC,动态注入,将对象之间的依赖关系交由spring管理,进行控制。比如让一个对象的创建不需要new,可以自动生产,这里面用了java的反射机制。
java的反射机制其实是在运行的时候去创建、调用对象,spring也是在运行的时候根据spring的配置去动态创建对象和调用对象的方法。
4.spring的第二个核心就是AOP,这个叫做面向切面编程,是oop的扩展,可以为某一类对象进行监督、控制(想加 什么功能直接加)。意思是在调用这些类对象的具体方法前后去调用你指定的模块从而达到一个模块扩充的功能。也是通过spring配置来实现的。
2)spring组成内容
3)依赖注入的几种实现类型
Type1接口注入。
Type2设值注入:通过类的setter方法完成依赖关系的设置,就是给bean类中属性加set方法。
Type3构造器注入:即通过构造函数完成依赖关系的设置。
各种方式的优势:
Type1接口注入的优势:
这种方法我没怎么用~我觉得没什么优势。
Type2设值注入的优势:
1.对于传统的JavaBean开发的程序员而言,通过setter的方法设定依赖关系显得更加直观,更加自然。
2.如果依赖关系(或者继承关系)较为复杂,那么Type3模式的构造函数也会相当庞大(我们需要在构造函数中设定所有的依赖关系),此时Type2模式往往更为简洁。
3.对于某些第三方类库而言,可能要求我们的组件必须提供一个默认的构造函数(如structs中的Action),此时Type3类型的依赖注入机制就体现出其的局限性,难以完成我们期望的功能。
Type3构造子注入的优势:
1.“在构造期即创建一个完整、合法的对象”,对于这条Java设计原则,Type3无疑是最好的响应者。
2.避免了繁琐的setter的编写,所有依赖关系均在构造函数中设定,依赖关系集中呈现,更加易读。
3.由于没有setter方法,依赖关系在构造时由容器一次性设定,因此组件在被创建之后即处于相对“不变”的稳定状态,无需担心上层代码在调用过程中执行setter方法对组件依赖关系产生破坏,特别是对于单例模式的组件而言,这可能对整个系统产生重大的影响。
4.同样,由于关联关系仅在构造函数中表达,只有组件创建者需要关心组件内部的依赖关系。对调用者而言,组件中的依赖关系处于黑盒之中。对上层屏蔽不必要的信息,也为系统的层次清晰性提供了保证。
5.通过构造器的注入,可以确定依赖关系的注入顺序(这对于一个大量依赖外部服务的组件而言非常重要)。
总的来说,个人认为以Type3类型为主,以Type2类型为辅,可以达到最好的依赖效果。不过对于基于Spring Framework开发应用而言,Type2使用更为广泛。