Spring笔记之DI | 青训营笔记

93 阅读2分钟

注:本人理解可能不够到位,代码内容也不完整,bean的实现是比较早期的方式,现在有注解的方式用来实现,不需要xml配置,本文的目的主要是为了自己记笔记。。。。

spring之DI

IOC容器负责了对象的初始化和管理等工作,但是在案例演示中业务层对象的创建需要用到数据层的对象,为了降低业务层和数据层的耦合度,应该避免使用new关键字创建对象。spring为了解决这个问题,实现了IOC容器,通过容器来管理对象的创建等工作,但是对于不同对象的依赖关系还是不能处理,这需要用到spring的另一个核心思想,DI(依赖注入)。

问题演示

首先回顾一下业务层和数据层的依赖情况

public interface BookDao {
    public void save();
}
public class BookDaoImpl implements BookDao{
    public void save(){
        System.out.println("book dao save...");
    }
}
public interface BookService{
    public void save();
}
public class BookServiceImpl implements BookService{
    private BookDao bookDao = new BookDaoImpl();
    public void save(){
        System.out.println("book service save...");
        bookDao.save();
    }
}

可以看到案例中的BookService使用了new创建bookDao,为了解决上述问题,spring提供了一套方案。

案例演示

为了去掉上面的new关键字,让spring自动的在创建BookService时要首先创建一个BookDao,我们需要告诉springBookService是依赖于BookDao的,这个通知的方式可以通过xml文件配置的方式实现。 首先在BookService实现类中提供set方法

public class BookServiceImpl implements BookService{
    private BookDao bookDao;
    public void save(){
        System.out.println("book service save...");
        bookDao.save();
    }
    public void setBookDao(BookDao bookDao){
        this.bookDao = bookDao;
    }
}

然后在xml中通知spring依赖关系

..........
<bean id="bookDao" class="com.xxx.xxx.xxx.BookDaoImpl"/>
<bean id="bookService" class="com.xxx.xxx.xxx.BookServiceImpl">
    <property name="bookDao" ref="bookDao"/>
</bean>
..........

name是通知spring将name大写第一个字母然后加上set去找对应的方法,ref是通知spring去找id为bookDao的bean进行注入。

注:本人理解可能不够到位,代码内容也不完整,bean的实现是比较早期的方式,现在有注解的方式用来实现,不需要xml配置,本文的目的主要是为了自己记笔记。。。。