天天看点

Spring(三)入门案例DI(依赖注入)

DI介绍

DI (Dependency Injection) 依赖注入

首先要明白:

is a:自己是一个什么,在程序中即继承或接口,比如汽车是交通工具。

has a:有一个,程序中即有一个成员变量,换句话说就是类B中的代码有对类A的引用

class B{
    private A a;//B类依赖A类      

依赖注入解释

依赖:一个对象需要使用另一个对象

注入:通过setter方法进行另一个对象实例设置。

  • 例如:
class BookServiceImpl{
        //之前开发:接口 = 实现类  (service和dao耦合)
        //private BookDao bookDao = new BookDaoImpl();
        //学习spring之后 (解耦:service实现类使用dao接口,不知道具体的实现类)
        private      

要想使用DI 一定要为字段提供setter方法

模拟spring执行过程

创建service实例:BookService bookService = new BookServiceImpl()     -->IoC 配置信息(bean)
创建dao实例:BookDao bookDao = new BookDaoImple()                -->IoC 配置信息(bean)
将dao设置给service:bookService.setBookDao(bookDao);             -->DI   配置信息(property)      

目标类

创建目标类的过程为:

* 创建BookService接口和实现类

* 创建BookDao接口和实现类

* 将dao和service配置xml到文件

创建BookService接口和实现类

package com.scx.di.test;

public interface BookService {
    public void addBook();
}      
package com.scx.di.test;

public class BookServiceImpl implements BookService{

    private BookDao bookDao;
    public void setBookDao(BookDao bookDao) {
        this.bookDao = bookDao;
    }
    @Override
    public void addBook() {
        bookDao.addBook();
    }

}      

创建BookDao接口和实现类

package com.scx.di.test;

public interface BookDao {
    public void addBook();
}      
package com.scx.di.test;

public class BookDaoImpl implements BookDao{

    @Override
    public void addBook() {
        System.out.println("BookDaoImpl add a book.");

    }

}      

将dao和service配置xml到文件

模拟Spring过程

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=
                 "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

<!-- bean definitions here -->
    <bean id="BookServiceId" class="com.scx.di.test.BookServiceImpl">
        <property name="bookDao" ref="BookDaoId"></property>
    </bean>
    <bean id="BookDaoId" class="com.scx.di.test.BookDaoImpl"></bean>
</beans>      

Junit测试

package com.scx.test;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.scx.di.test.BookDao;
import com.scx.di.test.BookDaoImpl;
import com.scx.di.test.BookService;
import com.scx.di.test.BookServiceImpl;

public class TestDI {
    @Test
    public void testDI(){
        //之前开发
        BookDao bookDao=new BookDaoImpl();
        BookServiceImpl bookService1=new BookServiceImpl();
        bookService1.setBookDao(bookDao);
        bookService1.addBook();

        //学习Spring后
        String xmlPath="com/scx/di/test/applicationContext.xml";
        ApplicationContext applicationContext=new ClassPathXmlApplicationContext(xmlPath);
        BookService bookService2=applicationContext.getBean("BookServiceId",BookService.class);
        bookService2.addBook();      

运行结果