`

【SSH进阶之路】一步步重构容器实现Spring框架——从一个简单的容器开始(八)

阅读更多

目录

【SSH进阶之路】一步步重构容器实现Spring框架——从一个简单的容器开始(八)

【SSH进阶之路】一步步重构容器实现Spring框架——解决容器对组件的“侵入式”管理的两种方案--主动查找和控制反转(九)已更新
【SSH进阶之路】一步步重构容器实现Spring框架——配置文件+反射实现IoC容器(十)更新
【SSH进阶之路】一步步重构容器实现Spring框架——彻底封装,实现简单灵活的Spring框架(十一)已更新

 

最近一直在和容器打交道,甚至前面的博文,我们也介绍了Spring的IoC的原理以及源码,但是回头看看,duang~ duang~的,还是深了,不够通俗易懂,不够深入浅出。由于以上原因吧,从这篇博客开始,我们从一个简单的容器开始,一步步的重构,最后实现一个基本的Spring框架的雏形,为了帮助我们更加深入的理解Spring的IoC的原理和源码。

 

容器

 

相信大家对容器并不陌生,它是生活中非常常见的物品,容器用来包装和装载物品的贮存器(如箱、罐、坛等等),但是在编程中什么容器呢?我们先看一下百科的解释:

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

容器可以管理对象的生命周期、对象与对象之间的依赖关系,您可以使用一个配置文件(通常是XML),在上面定义好对象的名称、如何产生(Prototype 方式或Singleton 方式)、哪个对象产生之后必须设定成为某个对象的属性等,在启动容器之后,所有的对象都可以直接取用,不用编写任何一行程序代码来产生对象,或是建立对象与对象之间的依赖关系。

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

看见上面的解释,第一感觉就是什么玩意?说白了,容器就是一个专门用来管理对象的模块。它负责创建对象,管理对象的依赖关系,管理对象的生命周期等等,类似这样的模块就叫容器。

运行在容器中的对象也称为组件,它们必须遵循容器定义的规范。

 

普通实现

 

我们理解了容器之后,下面我们从一个简单的实例开始。先看一下代码:

Service层:

 

public interface Service {
	public void serviceMethod();
}
import com.tgb.container.dao.Dao;
import com.tgb.container.dao.impl.Dao4MySqlImpl;
import com.tgb.container.service.Service;

public class ServiceImpl implements Service {
	//实例化Dao实现
	private Dao dao = new Dao4MySqlImpl();  

	@Override
	public void serviceMethod() {
		//调用Dao实现的方法
		dao.daoMethod();
	}
}

Dao层:

 

 

public interface Dao {
	public void daoMethod();
}
import com.tgb.container.dao.Dao;

public class Dao4MySqlImpl implements Dao {
	public void daoMethod(){
		System.out.println("Dao4MySqlImpl.daoMethod()");
		
	}
}

 

 

import com.tgb.container.dao.Dao;

public class Dao4OracleImpl implements Dao {
	public void daoMethod(){
		System.out.println("Dao4OracleImpl.daoMethod()");
		
	}
		
}


客户端:

 

 

import com.tgb.container.service.Service;
import com.tgb.container.service.impl.ServiceImpl;

public class Client {
	public static void main(String[] args) {
		//实例化Service实现
		Service service = new ServiceImpl();
		//调用Service实现的方法
		service.serviceMethod();
	}
}

 

 

这段代码的运行结果,大家一眼就能看出来,如下:

 

Dao4MySqlImpl.daoMethod()

 

UML类图如下:

从上图我们可以发现,ServiceImpl不仅依赖Dao层接口,而且还依赖Dao层实现,显然违背了面向对象的基本设计原则,依赖倒转原则:抽象不应该依赖细节,细节应该依赖与抽象,说白了,就是针对接口编程,不要对实现编程。

 

借助容器

 

下面我们使用容器来将依赖实现的关系去掉。

Container类:

 

import java.util.HashMap;
import java.util.Map;

import com.tgb.container.dao.Dao;
import com.tgb.container.dao.impl.Dao4MySqlImpl;
import com.tgb.container.service.Service;
import com.tgb.container.service.impl.ServiceImpl;

public class Container {
	//定义一个map结构的对象
	private static Map<String, Object> components;

	private Container() {
	}

	/**
	 * 初始化容器
	 */
	public static synchronized void init() {
		if (components == null) {
			components = new HashMap<String, Object>();
			//写一个读配置文件的类,根据读取的配置文件,反射对应的类
			//反射好类后进行 依赖管理,往对应的属性上注入相应的类
			//客户端创建新类的时候把容器创建好的类付给新类
			
			Dao dao4Mysql = new Dao4MySqlImpl();
			components.put("dao4Mysql", dao4Mysql);
			
			Service service = new ServiceImpl();  
			components.put("service", service);
			
		}
	}

	/**
	 * 查找组件
	 * 
	 * @param id
	 * @return
	 */
	public static Object getComponent(String id) {
		return components.get(id);
	}

}

修改ServiceImpl类:

 

 

 

import com.tgb.container.Container;
import com.tgb.container.dao.Dao;
import com.tgb.container.service.Service;

public class ServiceImpl implements Service {
	//从容器查找响应的对象
	private Dao dao = (Dao) Container.getComponent("dao4Mysql");  

	@Override
	public void serviceMethod() {
		dao.daoMethod();
	}
}

 

客户端:

 

import com.tgb.container.Container;
import com.tgb.container.service.Service;

public class Client {
	public static void main(String[] args) {
		//容器初始化,这个可以用filter完成,只需在整个项目中初始化一次
		Container.init();
		
		//从容器中查找接口
		Service service =(Service)Container.getComponent("service");
		//调用Service实现的方法
		service.serviceMethod();
	}
}

 

此时的UML类图如下:


对比两张类图,我们可以发现,容器给我们带来了优点,同时也带来了缺点。

优点:

此时的Service层不再依赖Dao层实现,而把这种对实现的依赖交给了容器。

缺点:

但是我们却发现,ServiceImpl依赖了Container容器类,使得组件不能脱离容器独立存在,显然,这是一种“侵入式”的管理。

如何让组件不依赖容器,见博客《【SSH进阶之路】一步步重构容器实现Spring框架——解决容器对组件的“侵入式”管理的两种方案--主动查找和控制反转(九)》。

 

源码下载

 

 

分享到:
评论

相关推荐

    Spring框架的简单实现

    【SSH进阶之路】一步步重构容器实现Spring框架——从一个简单的容器开始(八) 【SSH进阶之路】一步步重构容器实现Spring框架——解决容器对组件的“侵入式”管理的两种方案--服务定位器和IoC容器(九) 【SSH进阶之路】...

    SpringIoC的简单实现

    【SSH进阶之路】一步步重构容器实现Spring的IoC——从一个简单的容器开始(八) 【SSH进阶之路】一步步重构容器实现Spring的IoC——解决容器对组件的“侵入式”管理的两种方案--服务定位器和IoC容器(九) 【SSH进阶之路...

    springssh 我上培训班时spring框架搭建课件

    根据提供的文件信息,我们可以深入解析Spring、Struts2以及Hibernate(简称SSH)的集成应用,这一组合常被称为SSH框架,是Java企业级应用开发中的经典架构之一。 ### Spring框架的搭建与整合 #### 1\. Spring与...

    1003————自动搭建SSH框架 1004————SSH框架手动搭建

    在IT行业中,SSH框架是一个非常重要的概念,尤其对于Java Web开发者来说。SSH是Spring、Struts和Hibernate三个开源框架的首字母缩写,它们分别负责应用的依赖注入、MVC模式实现以及对象关系映射。这里我们将深入探讨...

    在SSH框架Spring的作用

    在探讨SSH框架中Spring的作用之前,我们先简要回顾一下SSH框架的基本构成。SSH框架,即Struts+Spring+Hibernate框架,是Java Web开发中的一种流行架构,它将三种技术结合在一起,各自承担不同的职责,共同构建出稳定...

    一个简单的SSH框架程序

    这个“一个简单的SSH框架程序”很显然是一个基于这些技术构建的应用实例,用于帮助开发者理解并学习如何整合这三种框架。接下来,我们将深入探讨SSH框架以及与其相关的技术。 **Struts2框架**: Struts2是MVC...

    SSH框架搭建——登录、注册实例

    SSH框架是Struts、Spring和Hibernate三个开源框架的组合,分别用于MVC模式的实现、依赖注入和持久层操作,使得开发者能够快速高效地开发企业级应用。 首先,需要强调的是数据库表名的选择问题。在SQL Server 2000中...

    javaSSH框架——学生学籍管理系统.pdf

    在"javaSSH框架——学生学籍管理系统"中,我们可以看到一个典型的SSH框架应用,主要用于实现学生学籍的管理。 一、设计目的 该设计旨在让学生通过实际操作加深对J2EE框架技术的理解,特别是在Struts2、Spring和...

    SSH框架——注册登录

    Spring框架则是一个全面的企业级应用框架,提供了依赖注入(DI)和面向切面编程(AOP)等核心特性。在SSH框架中,Spring作为中心枢纽,管理其他组件,如Struts2和Hibernate,以及应用程序中的所有对象。Spring还提供...

    SSH三大框架登录小实例,以及spring的登录增删改查实例测试

    在这个实例中,我们将探讨如何利用这三个框架实现一个简单的登录功能,并通过Spring进行登录、增、删、改、查的完整操作。 首先,Struts2作为MVC模式中的Controller层,负责处理用户请求并转发到相应的Action。在...

    一个简单的ssh框架实现的增删改查

    在"一个简单的ssh框架实现的增删改查"项目中,你可能找到了以下关键部分: 1. 数据库表结构:这部分包含了项目的数据库设计,可能包括用户表、商品表等,每个表都有对应的字段和约束,这些信息会直接影响到...

    SSH框架搭建——测试

    SSH框架,全称为Struts2 + Spring + Hibernate,是Java Web开发中常用的一种技术栈,它结合了三个强大的开源框架,用于构建高效、灵活且可扩展的企业级应用程序。本教程将带你逐步了解如何搭建SSH框架,并实现登录和...

    (进阶)SSH框架实现员工部门管理系统

    这个项目“(进阶)SSH框架实现员工部门管理系统”旨在利用SSH的优势,构建一个能够管理员工及其所在部门的高效应用。下面将详细阐述SSH框架的核心组件以及在系统中的应用。 1. **Struts2**:Struts2作为MVC(模型-...

    一个完整的SSH框架demo

    **Spring框架**:Spring是一个全方位的轻量级应用框架,它提供了IOC(Inversion of Control)容器,用于管理对象的生命周期和依赖关系。此外,Spring还提供了AOP(Aspect-Oriented Programming)功能,实现切面编程...

    SSH框架概述——适用得很!

    SSH框架,全称为Struts+Hibernate+Spring,是Java Web开发中的一个流行组合,用于构建高效、可扩展的多层Web应用程序。这三个组件分别负责不同的职责,共同构成了强大的MVC(Model-View-Controller)架构。 Struts...

    SSH总结之Spring

    Spring框架是一个开源的轻量级企业级应用框架,主要由核心容器、数据访问/集成、Web、AOP(面向切面编程)、工具、测试、消息和REST等功能模块组成。Spring的核心特性包括控制反转(IoC)和面向切面编程(AOP),它简化了...

    SSH框架JAR包集合

    SSH框架,全称为Spring、Struts和Hibernate,是Java Web开发中的一个经典组合,用于构建高效、可维护的Web应用程序。这些框架各自负责不同的职责,Spring作为基础架构框架,Struts处理视图与控制,Hibernate则专注于...

    SSH框架整合包/SSH框架jar包集合/Spring/Struts2/Hibernate

    SSH框架是Java开发中常用的三大开源框架——Spring、Struts2和Hibernate的组合,它们各自在应用程序的不同层次上提供服务,以实现一个高效且灵活的开发环境。下面将详细介绍这三个框架以及它们的整合。 **Spring...

    简单的SSH框架搭建包含测试方法(其中hibernate包含在Spring框架中)

    在这个简单的SSH框架搭建中,Hibernate被集成到Spring框架内,形成了一个更高效的解决方案。 首先,我们需要理解Spring框架的核心概念。Spring通过IoC(Inversion of Control,控制反转)和DI(Dependency ...

    struts spring hibernate ssh 三大框架集成详细步骤 手把手教你搭框架

    SSH(Struts + Spring + Hibernate)框架集成旨在实现MVC(Model-View-Controller)设计模式,为业务逻辑、数据访问以及用户交互提供了高效的解决方案。 **Struts框架**: Struts是一个开源的MVC框架,负责处理用户...

Global site tag (gtag.js) - Google Analytics