spring的IOC入门

Spring的核心机制

管理Bean

程序主要是通过Spring容器来访问容器中的Bean,ApplicationContext是Spring容器最常用的接口,该接口有如下两个实现类:

ClassPathXmlApplicationContext: 从类加载路径下搜索配置文件,并根据配置文件来创建Spring容器。

FileSystemXmlApplicationContext: 从文件系统的相对路径或绝对路径下去搜索配置文件,并根据配置文件来创建Spring容器。

package com.xue.test;

import com.xue.service.BookService;
import com.xue.service.Impl.BookServiceImpl;
import org.junit.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Test01 {
    BookService bookService;

    @Test
    public void Test01() {
        //创建对象执行方法。对象的创建由Spring框架创建,此处可以直接问Ioc容器要就可以
        //bookService = new BookServiceImpl();
        //1.通过ClassPathXmlApplicationContext加载application.xml获取IOC容器
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("application.xml");
        //2.从IOC容器中根据名字获取对象
        bookService = (BookService) context.getBean("bookService");
        bookService.save();
    }
}

依赖注入=控制反转

Spring框架的核心功能有两个:

Spring容器作为超级大工厂,负责创建、管理所有的Java对象,这些Java对象被称为Bean。

Spring容器管理容器中Bean之间的依赖关系,Spring使用一种被称为"依赖注入"的方式来管理Bean之间的依赖关系。

当某个Java对象(调用者)需要调用另一个Java对象(被依赖对象)的方法时,在传统模式下通常有两种做法:

  1. 原始做法: 调用者主动创建被依赖对象,然后再调用被依赖对象的方法。

  1. 简单工厂模式: 调用者先找到被依赖对象的工厂,然后主动通过工厂去获取被依赖对象,最后再调用被依赖对象的方法。

注意:使用Spring框架之后,调用者无需主动获取被依赖对象,调用者只要被动接受Spring容器为调用者的成员变量赋值即可,由此可见,使用Spring后,调用者获取被依赖对象的方式由原来的主动获取,变成了被动接受——所以Rod Johnson称之为控制反转

1.创建项目,导入spring的jar包

2.按照如下目录结构创建接口及其实现类

dao层代码

//接口
package com.xue.dao;

public interface BookDao {
    void add();
}
//实现类
package com.xue.dao.Impl;

import com.xue.dao.BookDao;

public class BookDaoImpl implements BookDao {
    @Override
    public void add() {
        System.out.println("BookDaoImpl....add");
    }
}

service层代码

//接口
package com.xue.service;

public interface BookService {
    void save();
}
//实现类
package com.xue.service.Impl;

import com.xue.dao.BookDao;
import com.xue.dao.Impl.BookDaoImpl;
import com.xue.service.BookService;

public class BookServiceImpl implements BookService {
    //BookServiceImpl依赖bookDao的对象
    private BookDao bookDao;
    public String name;
    private int age;

    public void setBookDao(BookDao bookDao) {
        this.bookDao = bookDao;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public void save() {
        System.out.println("BookServiceImpl...save"+"姓名:"+name+"年龄:"+age);
        bookDao.add();
    }
}

3.使用spring完成IOC的配置和DI依赖注入

创建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">
    <!--告诉Spring框架,创建管理那些对象
    id是给创建的对象起一个名字
    class:要创建对象的全类名
    -->
    <bean id="bookDao" class="com.xue.dao.Impl.BookDaoImpl"/>
    <bean id="bookService" class="com.xue.service.Impl.BookServiceImpl">
<!--使用property给类的属性注入数据:默认使用set方法
常规类型使用value注入
对象使用ref引用上边的定义
-->
        <property name="name" value="之"/>
        <property name="age" value="11"/>
        <property name="bookDao" ref="bookDao"/>
    </bean>
</beans>

bean标签表示把对应class的对象创建到IOC容器中,如果当前对象有依赖的其他对象,那么可以通过property对依赖的对象使用ref引用容器中已经注册过的对象。

注意:BookServiceImpl需要给bookDao属性设置setter方法,框架才能自动注入

public class BookServiceImpl implements BookService {
    //BookServiceImpl依赖bookDao的对象
    private BookDao bookDao;
    public String name;
    private int age;

    public void setBookDao(BookDao bookDao) {
        this.bookDao = bookDao;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setAge(int age) {
        this.age = age;
    }
4.在servlet中进行测试
1.首先获取IOC的容器;
2.从容器中获取bookService对象;
3.执行方法:servlet执行---service执行,由于spring完成了依赖注入------dao层执行
package com.xue.test;

import com.xue.service.BookService;
import com.xue.service.Impl.BookServiceImpl;
import org.junit.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Test01 {
    BookService bookService;

    @Test
    public void Test01() {
        //创建对象执行方法。对象的创建由Spring框架创建,此处可以直接问Ioc容器要就可以
        //bookService = new BookServiceImpl();
        //1.通过ClassPathXmlApplicationContext加载application.xml获取IOC容器
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("application.xml");
        //2.从IOC容器中根据名字获取对象
        bookService = (BookService) context.getBean("bookService");
        bookService.save();

        BookServiceImpl b = new BookServiceImpl();
        
    }
}

运行结果如下:

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值