Spring IoC/DI

前言

假设项目层次划分包括logic层和dao层,logic层调用dao层完成业务逻辑,dao层一般与数据库交互。定义两个组件,TestLogic和TestDao,分别操作接口ILogic和IDao,这样程序开发时需要考虑怎样管理这两个组件。

传统方式

这种方式中,当TestLogic组件需要调用TestDao组件时,直接使用关键字new
 IDao testDao = new TestDao();

这种方式简单直观,但造成了对外部组件的严重依赖,程序高度耦合,效率低下。当项目需要更换组件时需要修改大量代码,不利于项目的维护和扩展。

工厂模式

工厂模式指的是定义一个工厂,这个工厂用来产生组件,这样其它组件需要该组件时直接通过工厂来获取。例如定义产生TestDao组件的工厂

public class TestDaoFactory {
    public IDao createTestDao() {
        return new TestDao();
    }
}

这样TestLogic组件需要调用TestDao组件时使用如下方式
 IDao testDao = TestDaoFactory.createTestDao(); 
这种方式下TestLogic组件无需与TestDao组件以硬编码方式耦合在一起,只需要与产生TestDao组件的工厂TestDaoFactory耦合。当更换组件时只需要修改工厂类。

使用工厂模式可以实现一定程度上的解耦,但不同的组件之间会有着不同的依赖关系,这样工厂的实现和管理又成了新的问题。IoC容器就在这样的需求下产生了。

IoC(控制反转)

这种方式下,使用配置文件将组件的依赖和管理与业务代码分离,创建被调用组件(TestDao)的工作不再由调用者(TestLogic)来完成,而是由IoC容器来完成,因此称为控制反转。组件是由IoC容器创建了,但是怎么将TestDao组件交给TestLogic组件使用,也就是TestLogic组件如何取得TestDao组件,使用注入方式交给TestLogic组件使用,因此也称为DI(依赖注入)。而注入的方式有接口注入,构造注入和set方法注入,Spring支持后两种方式。

Spring IoC基本使用

介绍SpringIoC的使用方法,项目地址:https://github.com/ichunming/SpringIoC。该工程为Maven工程,不需要下载spring相关jar包。项目包含了两个组件TestLogic,TestDao及相应的接口,TestLogic组件调用TestDao组件。这里使用set方法注入dao层组件,即TestLogic中定义dao属性,并创建该属性对应的set方法。这样进入spring核心部分--applicationContext.xml配置文件,配置文件中主要就是Bean的配置:

--------------------------------------------------------------------------

-- 注册TestDao组件 --
<bean id="testDao" class="com.ioc.dao.TestDao"></bean>
-- 注册TestLogic组件 --
<bean id="testLogic" class="com.ioc.logic.TestLogic">
-- 依赖注入testDao --
<property name="dao" ref="testDao"></property>
</bean>

--------------------------------------------------------------------------

可以看到注册TestLogic组件时配置了相应的property,意思是创建testLogic组件时调用setDao方法,参数是testDao,这样testDao组件就注入到testLogic中了。

最后测试一下是否能从spring容器中取得组件
--------------------------------------------------------------------------

// 加载spring容器
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
// 从容器中取得testLogic组件
ILogic logic = (TestLogic)context.getBean("testLogic");
// 使用该组件
logic.print();

--------------------------------------------------------------------------

总体来说,可以将Spring看成一个大的工厂,用来生产和管理所有组件。对于项目的维护和扩展,当需要更换组件是只要修改配置文件(或者再修改少量代码)就可以实现。

IoC容器模拟实现

这里简单模拟IoC容器的实现,主要使用jdom读取XML,将所有的Bean保存在Map中,如果需要注入就是用set方法注入。

新建MyClassPathXmlApplicationContext类,里面有map属性,用来保存所有的Bean。构造函数中加载并读取XML文件,遍历所有的bean元素,生成相应的组件并写入map中。提供getBean方法,用于取得组件。具体实现与上面IoC基本使用放在一起,git地址:https://github.com/ichunming/SpringIoC

两点说明

  • Web项目中一般不需要手动加载配置文件,在Web容器中配置好监听器容器会自动加载Spring的配置文件。
  • 实际使用时多采用注解方式,实现Bean的自动装配。使用注解方式XML配置文件将不会显得臃肿。
时间: 2024-12-26 19:54:27

Spring IoC/DI的相关文章

Spring -- IOC/DI 基础概念的理解

Spring -- IOC/DI 基础概念 思维导图: ------------------------------------------------------- IoC/DI 的基本概念 IoC是什么 ? IoC -- Inversion of control, 控制反转   在Java开发中,IoC意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制.IoC是一种让服务消费者不直接依赖于服务提供者的组件设计方式,是一种减少类与类之间依赖的设计原则. 理解IoC的关键是明

[Spring系列01]Spring IOC/DI模拟

本文以一个简单的实例大致模拟Spring IOC/DI的运行原理,代码简单分dao,model,service三层.即:dao 与数据库的操作,增删改查等方法model 一般都是javabean对象,例如与数据库的某个表相关联.service 供外部调用,等于对dao,model等进行了包装. 程序结构图如下: 先粘贴部分代码,再进行解释: UserDAO.java package com.ctsh.dao; import com.ctsh.model.User; public interfac

Spring IOC/DI/注解

一.定义:Spring 是一个开源的控制反转(Inversion of Control,IoC/DI)和面向切面(AOP)的容器框架,它的主要目的是简化企业开发 二.实例化Spring容器: 方法一:在类路径下寻找配置文件来实例化容器 1 ApplicationContext ctx = new ClassPathXmlApplicationContext(new String[]{"beans.xml"}); 方法二:在文件系统路径下寻找配置文件来实例化容器 1 Applicatio

Spring+IOC(DI)+AOP概念及优缺点

Spring pring是一个轻量级的DI和AOP容器框架. 说它轻量级有一大部分原因是相对与EJB的(虽然本人从没有接触过EJB的应用),重要的是,Spring是非侵入式的,基于spring开发的应用一般不依赖于spring的类. 容器:Spring是个容器,因为它包含并且管理应用对象的生命周期和配置.如对象的创建.销毁.回调等. 框架:Spring作为一个框架,提供了一些基础功能,(如事务管理,持久层集成等),使开发人员更专注于开发应用逻辑. Spring的优点1.降低了组件之间的耦合性 ,

spring ioc DI 理解

下面是我从网上找来的一些大牛对spring ioc和DI的理解,希望也能让你对Spring ioc和DI的设计思想有更进一步的认识. 一.分享Iteye的开涛对Ioc的精彩讲解 Ioc—Inversion of Control,即“控制反转”,不是什么技术,而是一种设计思想.在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制.如何理解好Ioc呢?理解好Ioc的关键是要明确“谁控制谁,控制什么,为何是反转(有反转就应该有正转了),哪些方面反转了”,那我们

spring IOC/DI容器的理解

参与者:应用程序和spring正向:现在的程序方向,A对象要使用B对象,现在是A里面直接创建B的实例,然后调用.publc class A{ void t1(){ new B().t2();  }}public class B{void t2(); 简而言之,就是程序需要什么.就由程序主动去获取需要的资源,这个方向就是正向.容器是用来创建和装配对象,并管理对象生命周期的.对于应用程序而言,就是被动实例化和被动接受依赖了.装配:在spring容器内拼凑bean叫作装配.装配bean的时候,你是在告

spring IOC DI LifeCycle

spring IOC 创建javaBean工厂的三种方式: 1.BeanFactory bf = new XmlBeanFactory(new ClassPathResource("bean.xml")); BeanFactory:spring管理JavaBean的顶级接口,直接用这个接口创建的工厂有延迟加载的作用 常用的有ApplicationContext  ac = new ClassPathXmlAppliactionContext("bean.xml");

记录学习Spring(IOC/DI)

根据自己学习的Spring做一些记录,主要是为了方便自己查阅复习. 一.介绍Spring Spring是一个基于IOC和AOP的结构J2EE系统的轻量级框架; 轻量级主要变现为不需要任何的容器就可以直接运行;  IOC 反转控制 是Spring的基础,Inversion Of Control ; 也就是创建对象由以前的程序员自己new 构造方法来调用,变成了交由Spring创建对象 ; DI 依赖注入 Dependency Inject. 简单地说就是拿到的对象的属性,已经被注入好相关值了,直接

spring IOC(DI)实验

软件151  张鑫栋 一.IOC的意思是控件反转也就是由容器控制程序之间的关系,把控件权交给了外部容器,之前的写法,由程序代码直接操控,而现在控制权由应用代码中转到了外部容器,控制权的转移是所谓反转.DI(Dependency Injection,依赖注入).IoC的一个重点是在系统运行中,动态的向某个对象提供它所需要的其他对象.这一点是通过DI(Dependency Injection,依赖注入)来实现的. IOC实现的原理: 定义DAO接口和接口的实现类 package com.dao; p