使用Spring中的IOC解决程序耦合

概念

IOC——Inversion of Control,即控制反转,不是什么技术,而实一种设计思想。在Java开发中,IOC意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。IOC包括依赖注入(Dependency Injection)和依赖查找(Dependency Lookup)。

  • 谁控制谁,控制什么:传统Java SE程序涉及,我们直接在对象内部通过new进行创建对象,是程序主动去创建依赖对象;而IOC是有专门的一个容器来创建这些对象,即由IOC容器来控制对象的创建;IOC容器控制了对象,主要控制了外部资源获取(不只是对象包括文件等)
  • 为何是反转,哪些方面反转了:有了反转就有正转,传统应用程序是由我们自己在对象中主动控制去直接获取依赖对象,也就是正转;而反转则是由容器来帮忙创建注入依赖对象;为何是反转?因为由容器帮我们查找及注入依赖对象,对象只是被动地接受依赖对象,所以是反转;哪些方面反转了?依赖对象的获取被反转了。

** 传统程序设计如图1-1,都是主动去创建相关对象然后再组合起来**
在这里插入图片描述

当有了IOC/DI容器后,在客户端类中不再主动去创建这些对象了,如图1-2

在这里插入图片描述

作用

削减计算机程序的耦合,解除我们代码中的依赖关系

案例

解决账户的业务层和持久层的依赖关系。由于使用的是spring解决依赖关系,并不真正要做CURD操作,所以此时没必要写实体类,并且再此处使用的是java工程,不是java web工程

  • 准备spring开发包

    官网http://spring.io/
    下载地址:https://repo.spring.io/libs-release-local/org/springframework/spring/

  • 程序示例
    项目结构

    在这里插入图片描述

    表现层
/**
 * 模拟一个表现层,用于调用业务层
 */
public class Client {

    /**
     * 获取spring的IOC核心容器,并根据id获取对象
     * @param args
     */
    public static void main(String[] args) {
        //IAccountService as = new AccountServiceImpl();
        //1、获取核心容器对象。配置文件在根目录,直接写文件名即可。
        ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
        //2、根据id获取bean对象
        IAccountService as = (IAccountService) ac.getBean("accountService");
        IAccountDao adao = ac.getBean("accountDao", IAccountDao.class);

        System.out.println(as);
        System.out.println(adao);
        //as.saveAccount();
    }

}
查看ApplicationContext的继承关系

选中ApplicationContext右键“Diagrams”-,“show Diagram”。在这里插入图片描述

在BeanFactory中有三个实现类,ClassPathXmlApplicationContext、FileSystemXmlApplicationContext、AnnotationConfigApplicationContext的区别。

  • ClassPathXmlApplicationContext:可以加载类路径下的配置文件,要求配置文件必须在类路径下,不在的加载不了**(更常用)**
  • FileSystemXmlApplicationContext:可以加载磁盘中任意位置下的配置文件,必须有访问权限
  • AnnotationConfigApplicationContext:是用于读取注解创建容器的
BeanFactory和ApplicationContext接口的区别
  • ApplicationContext:在构建核心容器时,创建对象采取的策略是采用立即加载的方式,也就是说,只要一读取完配置文件马上就创建配置文件中配置的对象。 单例对象适用(更常用)
//1、获取核心容器对象。配置文件在根目录,直接写文件名即可。
        //ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
        //配置文件在磁盘任意位置,要写绝对路径
        ApplicationContext ac = new FileSystemXmlApplicationContext("D:\\OJ\\SpringIOC\\day01_eesy_03spring\\src\\main\\resources\\bean.xml");
        //2、根据id获取bean对象
        IAccountService as = (IAccountService) ac.getBean("accountService");
        IAccountDao adao = ac.getBean("accountDao", IAccountDao.class);

这一句ApplicationContext ac = new刚执行完,对象就创建了。

  • BeanFactory:创建对象采用延迟加载的方式,也就是说,什么时候根据id获取对象了,什么时候才真正的创建对象 多例对象适用
//----------------BeanFactory----------
        Resource resource = new ClassPathResource("bean.xml");
        BeanFactory factory = new XmlBeanFactory(resource);
        IAccountService asFactory = (IAccountService) factory.getBean("accountService");
        System.out.println(asFactory);

这一句IAccountService asFactory = (IAccountService) factory.getBean("accountService");执行完才会创建对象

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值