`

【SSH进阶之路】一步步重构容器实现Spring框架——解决容器对组件的“侵入式”管理的两种方案--主动查找和控制反转(九)

阅读更多

目录

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

 

对于IOC的原理,我们曾经写过一篇博文,【SSH进阶之路】Spring的IOC逐层深入——为什么要使用IOC[实例讲

解](二),对比学习可以对同一个问题理解的更加深刻。

上篇博文【SSH进阶之路】一步步重构容器实现Spring框架——从一个简单的容器开始(八),我们为了去掉接口

对具体实现的依赖关系,封装了一个特别简陋的容器,最后给大家抛出了一个问题:如何让组件不再依赖容器?这篇

博文主要是通过两种解决方案来解决这个问题,最后对比各自的优缺点。

 

服务定位器

 

解决方案之一就是使用服务定位器(Service Locator),我们也可以叫主动查找。服务定位器用来封装复杂的查

找逻辑,同时对外开放简单的查找方法,所有组件都可以将查找请求委派给服务定位器。

服务定位器可是一个简单的类,也可以是一种复杂的机制,如JNDI。不同的容器有着不同的查找机制。

下面是一个简单的服务定位器:

 

public class ServiceLocator {
	
	static{
		//该类加载的时候执行一次
		Container.init();
	}
	public static Object getDao(){
		return Container.getComponent("dao4Mysql");
//		return Container.getComponent("dao4Oracle");
	}
}

修改ServiceImpl的查找逻辑:

 

 

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

public class ServiceImpl implements Service {
	// 从服务器定位器查找所需的接口
	private Dao dao = (Dao) ServiceLocator.getDao();;  
	
	@Override
	public void serviceMethod() {
		dao.daoMethod();
	}

}

UML类图:

 

原先由ServiceImpl到Container的依赖线上添加了ServiceLocator,组件不再直接依赖于容器,实现了“非侵入

式”管理。

 

控制反转(IoC)

 

解决方案之二就是使用控制反转,我们将控制权交给容器,在运行期才由容器决定将具体的实现动态的“注入”到

调用类的对象中。

Ioc是一种通用的设计原则,DI(依赖注入)则是具体的设计模式。依赖注入有三种方式,我们使用的是Setter注入。

 

修改Service接口:

 

import com.tgb.container.dao.Dao;


public interface Service {
	//增加注入接口的方法
	public void setDao(Dao dao);
	public void serviceMethod();
}

修改ServiceImpl:

 

 

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

public class ServiceImpl implements Service {
	private Dao dao;  
	//依赖注入
	public void setDao(Dao dao) {
		this.dao= dao;
	}
	
	@Override
	public void serviceMethod() {
		dao.daoMethod();
	}
}

修改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 {
	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);
			
			//容器维护依赖关系
			service.setDao(dao4Mysql);
		}
	}

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

UML类图:

 

 

由ServiceImpl到Container的依赖线可以直接抹掉了!

Setter注入易于使用,但是会有安全问题。第一次注入之后,有可能再一次调用setter方法,改变了原有的依赖。

这种对依赖的无意修改会带来无法预料的后果。所以需要有安全检查机制。

 

对比

 

解决组件不再依赖容器,我们使用了两种方案:服务定位器和控制反转。

1、使用服务定位器查找组件,这是一种主动查找的行为。这种查找有一个缺点:组件需要知道如何查找资源。组件和容器依赖变成了组件和服务定位器的依赖。

2、然后,我们使用了控制反转,这是一种被动查找的行为。容器主动将资源推送给组件,组件则以一种合适的方式来接受资源。反转资源获取方向,这就是大名鼎鼎的Ioc(控制反转)。

 

从类图中我们可以发现,容器需要知道各个组件,容器和组件的耦合度还是很高的,下篇博文【SSH进阶之路】

一步步重构容器实现Spring框架——配置文件+反射实现IoC容器(十),我们利用配置文件+反射进一步降低耦合度。

 

源码下载

 

分享到:
评论

相关推荐

    Spring框架的简单实现

    【SSH进阶之路】一步步重构容器实现Spring框架——解决容器对组件的“侵入式”管理的两种方案--服务定位器和IoC容器(九) 【SSH进阶之路】一步步重构容器实现Spring框架——配置文件+反射实现IoC容器(十) 【SSH进阶之...

    SpringIoC的简单实现

    【SSH进阶之路】一步步重构容器实现Spring的IoC——解决容器对组件的“侵入式”管理的两种方案--服务定位器和IoC容器(九) 【SSH进阶之路】一步步重构容器实现Spring的IoC——工厂+反射+配置文件实现IoC容器(十)

    rapidsh-SSH经典整合框架-包括权限管理-文件上传下载-用户管理-分页-lookup

    **Spring**:Spring作为核心的IOC(Inversion of Control,控制反转)和AOP(Aspect-Oriented Programming,面向切面编程)框架,可以管理应用的各个组件,实现依赖注入,使得代码更加解耦。同时,Spring MVC是...

    搭建SSH框架需要引入的Struts2包(log4j,spring-web,struts2-spring-plugin)

    SSH框架,全称为Struts2、Spring和Hibernate的组合,是Java Web开发中常见的三大开源框架集成。在构建SSH框架时,每个框架都扮演着不同的角色,以提供一个高效、可扩展的后端架构。现在我们来详细了解一下搭建SSH...

    SSH和Spring框架简介

    通过阅读"SSH框架简介.doc"和"Spring框架简介.doc",你可以深入理解这两个框架的工作原理、优缺点及应用场景,为你的Java开发之路打下坚实基础。在学习过程中,实践是关键,尝试创建小型项目,将理论知识转化为实际...

    SSH(Spring+Hibernate+Struts2)框架整合必须的85个jar包

    SSH框架整合是Java Web开发中常见的一种技术栈,由Spring、Hibernate和Struts2三个开源框架组合而成。这个组合提供了一种高效、灵活且可扩展的解决方案,用于构建企业级的Web应用程序。以下是对SSH框架整合及其中...

    在SSH框架Spring的作用

    综上所述,在SSH框架中,Spring作为核心的管理容器,通过其独特的IoC和DI机制,实现了组件间的松耦合,提升了代码的可读性和可维护性。同时,Spring的AOP特性进一步增强了系统的灵活性和扩展性,特别是在事务管理和...

    ssh三大框架jar包

    SSH三大框架,即Struts2、Spring和Hibernate,是Java Web开发中常用的一套集成解决方案。这三大框架分别负责不同的职责:Struts2处理MVC(Model-View-Controller)架构中的控制器部分,Spring提供了全面的依赖注入和...

    SSH 框架 struts-2.3.34 spring4.3.12 hibernate5.0.12

    这个框架集合提供了一种高效且强大的方式来构建企业级应用,它整合了模型-视图-控制器(MVC)设计模式、依赖注入(DI)与面向切面编程(AOP)以及持久层管理。 1. **Struts2**: Struts2是Apache软件基金会下的一...

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

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

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

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

    SSH--Spring详解

    Spring框架由Rod Johnson于2003年创建,最初的目标是提供一种替代传统EJB的解决方案,简化Java EE应用的开发过程。Spring框架通过使用基本的Java Bean代替EJB,大大减少了项目启动和维护的成本。 #### Spring框架的...

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

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

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

    SSH是Spring、Struts和Hibernate三个开源框架的首字母缩写,它们分别负责应用的依赖注入、MVC模式实现以及对象关系映射。这里我们将深入探讨SSH框架的自动搭建与手动搭建。 首先,让我们了解SSH框架的核心组件: 1...

    Java:SSH-Spring整合struts2&hibernate;框架

    Hibernate是SSH中的持久层框架,它为Java应用提供了一种简单、高效的对象/关系映射解决方案。通过Hibernate,开发者可以将数据库操作抽象成对Java对象的操作,避免了直接编写SQL语句,减少了代码量和出错概率。...

    SSH框架实现的学生管理系统

    SSH框架,全称为Struts2、Spring和Hibernate的组合,是Java Web开发中常用的一套集成框架。这个框架集合了Struts2的MVC设计模式、Spring的依赖注入(DI)和面向切面编程(AOP)以及Hibernate的对象关系映射(ORM),...

    SSH-框架笔记

    SSH框架,全称为Spring、Struts2和Hibernate,是Java Web开发中常用的一套集成解决方案。这三大框架分别负责不同的职责,Spring作为整体的管理容器,Struts2处理请求和展示,Hibernate则专注于数据持久化。下面将...

    SSH框架——图书管理系统

    使用SSH框架实现图书管理系统,通过创建BaseDao的接口和实现类提高效率。其中javascript向java类中传递值解决中文乱码问题是一个难点,该项目成功地解决了该问题。此外,组合查询时如何解决浏览器缓存也让我思考很久...

    SSH总结之Spring

    Spring提供了一种简单的方式来组合简单的组件形成复杂的应用,通过声明式的组件配置,通常是在XML文件中,Spring还提供了一系列的基础功能,如事务管理、持久化框架集成等,使得开发人员能够专注于业务逻辑的实现。...

    SSH框架----初学基础

    SSH框架,全称为Struts、Spring和Hibernate,是Java Web开发中的一个经典组合,用于构建高效、可扩展的Web应用程序。这个压缩包文件名为"webApp",很可能包含了一个完整的SSH框架项目,供初学者实践和学习。 Struts...

Global site tag (gtag.js) - Google Analytics