Spring IoC 依赖注入的三种方式

目录

1、什么是Spring IoC?

2、Spring IoC 注入的三种方式

(1)构造方法注入

(2)setter方法注入

(3)接口注入


IoC原则对应:好莱坞原则 Don’t call us,we will call you

1、什么是Spring IoC?

        Spring IoC(Inversion of Control,控制反转)是一种设计原则,也是一种编程思想。IoC 的核心思想是将对象的创建和对象之间的依赖关系的管理交由容器来负责,而不是由程序员手动管理。Spring IoC 才接触会比较难懂,但实际上很简单,总结起来就一句话:让别人为你服务!

        下边一张图展示了 IoC 容器在对象与依赖对象之间扮演的角色:

Spring IoC 依赖注入的三种方式_第1张图片

        那么问题来了,如何让IoC容器为你服务呢?IoC容器又是如何把你所需要的对象提供给你的呢?

2、Spring IoC 注入的三种方式

        loC模式最权威的总结和解释,应该是 Martin Fowler 的这篇文章:Inversion of Control Containers and the Dependency Injection pattern,在这篇文章中提到了三种依赖注入的方式,即构造方法注入 (constructor injection)、setter方法注入 (setter injection)以及接口注入 (interface injection)。

(1)构造方法注入

        在这种方式中,依赖通过目标类的构造函数传递。在容器实例化 Bean 时,将会调用目标类的构造函数并传入所需的依赖项。这种方式可以保证依赖项的完整性,并且使得类的实例化在一开始就具有所需的依赖项//构造方法使得初始化的实例具有完整的依赖项

public class MyClass {
    private MyDependency dependency;

    public MyClass(MyDependency dependency) {
        this.dependency = dependency;
    }
}

        构造方法注入方式比较直观,对象被构造完成后,即进入就绪状态,可以马上使用。这就好比你刚进酒吧的门,服务生已经将你喜欢的啤酒摆上了桌面一样。坐下就可马上享受一份清凉与惬意。

(2)setter方法注入

        这种方式使用类的 setter 方法来注入依赖。容器实例化 Bean 后,调用相应的 setter 方法来设置依赖。相对于构造函数注入,这种方式更加灵活,因为它允许你在类的生命周期中更改依赖//就是一种为对象设置属性值方式

public class MyClass {
    private MyDependency dependency;

    public void setDependency(MyDependency dependency) {
        this.dependency = dependency;
    }
}

        setter方法注入虽不像构造方法注入那样,让对象构造完成后即可使用,但相对来说更宽松一些,可以在对象构造完成后再注入。这就好比你可以到酒吧坐下后再决定要点什么啤酒,可以要百威,也可以要青岛,随意性比较强。如果你不急着喝,这种方式当然是最适合你的。

(3)接口注入

        这种方式通过在目标类中实现特定的接口来实现依赖注入。它是一种比较少用的方式,在现代版本的 Spring 中不太常见,因为它引入了一定的复杂性并且相对于其他两种方式不够直观//本质上就是一种方法注入,但是还要去实现一个接口,啰嗦且不够直观

public interface MyInterface {
    void injectDependency(MyDependency dependency);
}

public class MyClass implements MyInterface {
    private MyDependency dependency;

    @Override
    public void injectDependency(MyDependency dependency) {
        this.dependency = dependency;
    }
}

        接口注入方式相对于前两种依赖注入方式,显得比较死板和烦琐。如果需要注入依赖对象,被注入对象就必须声明和实现另外的接口。这就好像你同样在酒吧点啤酒,为了让服务生理解你的意思,你就必须戴上一顶啤酒杯式的帽子,看起来滑稽且有点多此一举。

        总的来说,接口注入是现在不再提倡的一种方式,基本处于“退役状态”。因为它强制被注入对象实现不必要的接口,带有侵入性。

        至此,全文结束。

你可能感兴趣的:(Spring,spring,spring,ioc,依赖注入)