最近在学习spring,记录下自己对Spring框架的理解。
一、 是什么
(1)其实就是一个大容器,用来管理bean对象,但这里的bean对象和之间了解的JavaBean对象不一样,这里指的就是一个普通的Java类。
(2)那这个容器的作用是什么? 平时写代码时,如果A类里面的方法需要调用B类里面的方法,我们就需要将A类里面先要创建好B的对象,然后再A类对象里面调用B类对象的方法。这样就增加了代码的高耦合性,这种开发方式非常不利于项目后期的维护。Spring 就是解决这一问题的。这个容器中装着所有配置后的对象(即不再需要new对象,这个过程由spring框架完成),通过依赖注入的方式进行解耦。
(3) 之前的们的代码类似于下图的第一个,齿轮就代表项目中的各个类,有着很高的耦合性,当其中一个模块出现问题后,其他的模块也会收到影响。使用Spring之后,就相当于给项目中添加了一个大的齿轮,项目中的其他齿轮通过这个大齿轮联系起来。
二、理解依赖注入和控制反转
其实这两个是一个概念,只不过是从不同的角度来看待的。
- 在Java中一个对象调用另外一个对象时,在传统模式下通常有两种方式
在调用类中主动new 一个被调用类
或者使用接口回调的方式
以上两种方式都会造成一定的耦合。 - 控制反转 nversion of Control (IoC)
使用Spring框架之后,调用者无需主动获取被依赖的对象。调用者只需要被动的接收Spring框架为调用者的成员变量赋值,由此可见,使用Spring框架之后,调用者有之前的主动获取被调用对象到被动接受Spring为其成员变量赋值。站在调用者的角度来说,这就是控制反转 - 依赖注入
从Spring容器来讲,相当于Spring负责将被依赖的对象注入到调用者的成员变量。站在Spring角度来说,这就叫依赖注入。
三、Spring框架的主要特点
通过上述分析,可以发现使用Spring有两个明显的改变
- 所有的对象都有Spring来创建
- 当对象需要获取依赖对象时,无需主动创建,等Spring容器注入即可。
四、依赖注入的两种方式
依赖注入通常由一下两种方式
1.设值注入
这种方式的注入依赖调用者的成员变量的setter方法。
(1)先定义一个Student类用来作为被调用的对象
(2)然后在定义一个调用者类
(3)然后进行Spring中xml文件的配置
其中id为该对象或接口的唯一标识,程序通过id来访问该Bean实例。class对应的具体实现类,此处不能再使用接口。
(4)Spring会自动检测每个bean定义的property元素的内容,Spring通过默认的类构造器创建每个bean实例之后,立即调用setter方法为bean的成员变量赋值。
注意:这里为了方便期间,未使用面向接口编程,在实际应用阶段,Spring推荐用面向接口的方式编程,进将各组件的耦合关系提升到接口层次,便于后期的维护。
2、构造注入
就是采用构造方法对成员变量进行初始化
(1)将上面设值注入的Person类改为下图形式
(2)然后在beans.xml文件中做如下修改
其中constructor-arg标签用来传递构造函数的参数
3.两种注入方式的对比
更推荐用设值注入的方式,其所对应的类更符合JavaBean的写法,更加简洁、明了。