spring控制反转

spring IOC的三种注入方式:

  1. 接口注入
  2. getter,setter方式注入
  3. 构造器注入

对象与对象之间的关系可以简单的理解为对象之间的依赖关系:

思考:对象与对象之间可能存在什么关系?(is a, has a,use a)

a) is a 关系

class A implements IA{} ; A 实现了IA 接口
class A extends B{}; A 继承了 B这个类
b) has a 关系
class Point{}
class Circle{
  private Point point;
}
Circle对象中有一个Point类型的对象
c) use a 关系
class ProjectUtil{
public String getId(){
   return UUID.randomUUID().toString();
}}

1.接口注入

在需要使用接口的地方直接注入一个接口的实现类。在ssm框架中,service实现类都继承各自的service接口,对service使用@Service注入,在controller中则只是定义一个service接口,使用@Autowried注解获取。

2.getter,setter注入

在属性的set方法中设置需要使用类型的形参

3.构造器注入

在类中将要注入的类设置为属性,在构造方法中传入该类的实例


三种注入方式比较:

接口注入:

接口注入模式因为具备侵入性,它要求组件必须与特定的接口相关联,实际使用有限

setter注入:

依赖关系比较复杂的时候set注入模式比较简洁直观

构造器注入:

在构造期完成一个完整的、合法对的对象

所有依赖关系在构造函数中集中呈现

依赖关系在构造时由容器一次性设定,组件被创建之后一直处于相对“不变”的稳定状态

只有组件的创建者关心其内部的依赖关系,对调用者而言,该依赖关系处于黑盒之中

总结

Spring使用注入方式,为什么使用注入方式?这系列问题实际归结起来就是一句话,Spring的注入和IOC反转控制是一回事。

理论上:第三种注入方式(构造注入)在符合java使用原则上更加合理,第二种注入方式(set注入)作为补充

实际上:第二种注入方式(set注入)可以取得更加直观的效果,在使用工作上有不可比拟的优势,所有运用应该更加广泛