Spring学习之DI(一)

本文通过实例解释了依赖注入(DI)的概念及其如何降低类之间的耦合度,对比了直接实例化与通过接口注入的不同,并介绍了工厂模式作为另一种实现方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

DI也就是依赖注入。几乎任何的功能我们都需要至少两个类以及更多的类相互合作才能完成,这样就会必然会造成一个类依赖另外一个类的现象(也就是耦合),如果耦合程度太高的话会让我们应用的后期维护变得非常困难。DI就是为了解决这个问题,下面举例来说明。

现在我们需要实现一个添加用户的功能,我们几乎可以很快的写出下面的代码。

public class PersonDaoBean {
    public void add(){
        System.out.println("添加一个人进来");  //添加一个用户
    }
}

public class PersonServiceBean {
     private PersonDaoBean personDao;
     public PersonServiceBean {
           personDao = new PersonDaoBean();
     }
     public void save(Person person){
            personDao.save(person);
     }
}

上面的代码中我省略了Person类。上面的代码有一个问题,PersonDaoBean与PersonServiceBean紧紧地绑在了一起,有一个PersonServiceBean就一定存在一个PersonDaoBean,这样的话PersonServiceBean同PersonDaoBean就紧密的耦合在一起了。我们可以使用接口来解决这个高度耦合问题。于是我们可以写出下面的

代码来实现这个功能。
public interface PersonDao {
    public abstract void add();
}

public class PersonDaoBean implements PersonDao{
    public void add(){
        System.out.println("添加一个人进来");  //添加一个用户
    }
}

public class PersonServiceBean {
     private PersonDao personDao;
     public PersonServiceBean {
           personDao = new PersonDaoBean();
     }
     public void save(Person person){
            personDao.save(person);
     }
}

将类的实现隐藏在接口后面,但是PersonServiceBean只能使用一种特定的方式来添加用户(这里是PersonDaoBean)。这个时候我们应该想,是应该让PersonServiceBean自己负责获取保存用户的方式还是应该给予PersonServiceBean保存用户的方式?为了解决这个问题,我们可以像下面这么修改。
public interface PersonDao {
    public abstract void add();
}

public class PersonDaoBean implements PersonDao{
    public void add(){
        System.out.println("添加一个人进来");  //添加一个用户
    }
}

public class PersonServiceBean {
     private PersonDao personDao;
     public PersonServiceBean {
           personDao = new PersonDaoBean();
     }
     public void save(Person person){
            personDao.save(person);
     }
     public void setPersonDao(PersonDao personDao) {
             this.personDao = personDao;
     }
}
现在PersonServiceBean是被动得到保存用户的方式的,你可以按自己需要的保存用户的方式给PersonServiceBean任何一种PersonDao的实现。这就是DI,这就是Spring所起的一个核心作用。

注:让PersonServiceBean被动获得保存用户的的方式还有另外一种方式,那就是工厂模式。可以像下面这样实现

public class PersonServiceBean {
     private PersonDao personDao;
     public PersonServiceBean {
           personDao = DaoFactory.getDao("personDao");
     }
     public void save(Person person){
            personDao.save(person);
     }
}
其中DaoFactory是一个工厂,"personDao"是一个properties文件中的一个键值对的键,我们如果要换一种保存用户的方式,只需要改变“personDao”对应的值(也就是接口personDao实现类的全名)就可以了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值