Spring DI(依赖注入)详解

阳光穿透心脏的1/2处 2023-03-04 11:29 136阅读 0赞

参考文章:DI以及依赖注入详解

【SSH系列】深入浅出spring IOC中三种依赖注入方式

1 DI是什么?

  1. 在应用间通常会有两个或者多个类组成,然后他们互相协作共同完成一个特定的业务逻辑,每个对象负责管理与自己相互协作的对象的引用。这将会导致高耦合难以测试的代码。
  2. 简单的说DI是能够将组件的依赖关系进行松耦合一种编程方式,让组件之间复杂的依赖关系简单化,下面演示DI的好处:
  3. package com.example.spring.DI;
  4. import lombok.extern.slf4j.Slf4j;
  5. /**
  6. * 演示在demo01里初始化demo02的类的行为
  7. */
  8. @Slf4j
  9. public class Demo01 {
  10. private Demo02 demo02;
  11. private Quest quest;
  12. /**
  13. * 可以发现Demo02类与Demo01类紧紧耦合在一起,紧密耦合的代码难以测试,难以复用。紧耦合
  14. * demo01只能够做demo02的类的行为
  15. */
  16. public Demo01(){
  17. demo02=new Demo02();
  18. }
  19. /**
  20. * 将quest类注入到Demo01类里,可以把很多行为写在quest里,这种方式为构造器注入,
  21. * 可以定义一个quest接口或者抽象类,然后将所有的共同行为实现quest类,实现了松耦合
  22. * @param quest
  23. */
  24. public Demo01(Quest quest){
  25. this.quest=quest;
  26. }
  27. public void B(){
  28. log.debug(""+demo02.A());
  29. }
  30. }
  31. 最重要的是quest为定义的所有请求,可以是一个接口,然后将它以构造器的形式注入到类中,可以使用不同的具体实现类 执行不同的行为。

2 依赖注入

依赖注入的3种方式:

2.1 构造器注入

在构造期间完成一个完整的、合法的对象。所有依赖关系在构造函数中集中呈现。依赖关系在构造时由容器一次性设定,组件被创建之后一直处于相对“不变”的稳定状态。只有组件的创建者关心其内部依赖关系,对调用者而言,该依赖关系处于“黑盒”之中。

2.2 接口注入

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

2.3 Setter 注入

对于习惯了传统 javabean 开发的程序员,通过 setter 方法设定依赖关系更加直观。如果依赖关系较为复杂,那么构造子注入模式的构造函数也会相当庞大,而此时设值注入模式则更为简洁。如果用到了第三方类库,可能要求我们的组件提供一个默认的构造函数,此时构造子注入模式也不适用。

3 代码示例

3.1 构造器注入

  1. import com.tgb.spring.dao.UserDao;
  2. public class UserManagerImpl implements UserManager{
  3. private UserDao userDao;
  4. //使用构造方式赋值
  5. public UserManagerImpl(UserDao userDao) {
  6. this.userDao = userDao;
  7. }
  8. @Override
  9. public void addUser(String userName, String password) {
  10. userDao.addUser(userName, password);
  11. }
  12. }

3.2 接口注入

  1. public class ClassA {
  2. private InterfaceB clzB;
  3. public void doSomething() {
  4. Ojbect obj = Class.forName(Config.BImplementation).newInstance();
  5. clzB = (InterfaceB)obj;
  6. clzB.doIt();
  7. }
  8. ……
  9. }

3.3 Setter 注入

  1. import com.tgb.spring.dao.UserDao;
  2. public class UserManagerImpl implements UserManager{
  3. private UserDao userDao;
  4. //使用设值方式赋值
  5. public void setUserDao(UserDao userDao) {
  6. this.userDao = userDao;
  7. }
  8. @Override
  9. public void addUser(String userName, String password) {
  10. userDao.addUser(userName, password);
  11. }
  12. }

发表评论

表情:
评论列表 (有 0 条评论,136人围观)

还没有评论,来说两句吧...

相关阅读

    相关 SpringDI(依赖注入)

    依赖注入(DI)是一个过程,在这个过程中,对象仅通过构造函数参数、工厂方法的参数或在对象被实例化后通过属性设置来定义它们的依赖项(即与该对象一起工作的其他对象)。然后,容器在创

    相关 Spring---DI依赖注入

    上一篇介绍了关于IOC的内容:IOC称为控制反转,简单来说就是讲对象的创建的权利以及对象的生命周期的管理过程交给Spring容器来管理,从此在开发的过程中不需要关注对象的创建以

    相关 Spring依赖注入DI

    开头语:本文是我整理网上各种资料后整合而成的一篇文章。文中涉及到了代码重构、面向接口编程、持久化和工厂设计模式的内容。 1. Spring是什么?