依赖注入DI详解——媳妇儿写的

依赖注入是指,spring在创建对象A时(A依赖于B),自动将B注入的过程

如service依赖dao,spring将自动创建dao,并通过service提供的set方法进行设置(注入)。

is a 与has a的区别
is a –>是什么? –> 继承(父子类)
has a –> 有一个 –> 依赖

依赖注入原理

现在有BookService与BookDao,BookTest 三个类,BookService依赖于BookDao,BookTest用于测试。

public class BookService {
    //传统写法,
    // private bookDao book = new bookDao();
     //新写法,利用setter注入
    private BookDao bookDao;

    public void addBook() {
        bookDao.save();
    }
    //bookDao 的setter方法
    public void setBook(BookDao book) {
        this.bookDao = book;
    }

}
public class BookDao {

    public void save() {
        System.out.println("save book");
    }
}
public class BookTest {

    @Test
    public void testDemo1() {
        BookDao bookDao = new BookDao();
        BookService bookService = new BookService();
        bookService.setBook(bookDao);

        //在此处调用BookService中的addBoook()方法
        //需要做如上的准备工作(创建bookDao,bookService对象,并创建两个对象之间的依赖关系)
        bookService.addBook();
    }
}

修改BookTest 中的代码,添加配置文件,实现依赖注入思想
在applicationContext.xml中添加如下代码

<?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">

    <!--创建bookDao对象-->
    <bean id="bookDao" class="com.xiaowang.b_di.BookDao"></bean>
    <!--创建bookService对象-->
    <bean id="bookService" class="com.xiaowang.b_di.BookService">
        <!-- 该段代码 执行的就是依赖注入的过程,底层将执行setter方法
            name 应填入对象的属性,该属性是根据bookService的setter方法推导出来的(而不是直接获取到的对象属性),
                 setBookDao -> bookDao (由setBookDao方法名,推出bookDao 属性名)
            ref  应填入其对象的引用,
        -->
        <!-- 就是说给bookService对象的bookDao属性赋值,其值为bookDao对象-->
        <property name="bookDao" ref="bookDao"></property>
    </bean>
</beans>
 注意 :
     <bean id="bookDao" class="com.xiaowang.b_di.BookDao"></bean>
         相当于 BookDao bookDao=newBookDao();
     <property name="bookDao" ref="bookDao"></property>
         相当于 bookService.setBookDao("bookDao");

做好如上配置,我们就可以修改BookTest的代码了。

public class BookTest {

    @Test
    public void testDemo2() {
        // 从spring容器中获取内容

        // 1 获得容器
        String xmlPath = "com/xiaowang/b_di/applicationContext.xml";
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext(xmlPath);

        // 获得对象
        BookService bookService = applicationContext.getBean("bookService", BookService.class);

        bookService.addBook();
    }
}

这样就能清晰明了的看到依赖注入的实现原理了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值