从三层架构到IoC的蜕变

经典三层

经典三层架构是U层调B层,B层调D层。代码形式如下:

D层:

package com.tgb.spring.dao;

public interface UserDao {

	public void addUser(String username,String password);
}
package com.tgb.spring.dao;

public class UserDao4MySqlImpl implements UserDao {

	@Override
	public void addUser(String username, String password) {
		System.out.println("UserDao4MySqlImpl.addUser()");
	}
}

B层:

package com.tgb.spring.manager;

public interface UserManager {
	public void addUser(String username, String password);
}
package com.tgb.spring.manager;

import com.tgb.spring.dao.UserDao;
import com.tgb.spring.dao.UserDao4MySqlImpl;

public class UserManagerImpl implements UserManager {

	@Override
	public void addUser(String username, String password) {
		// 由我们的应用程序负责服务(对象)定位
		UserDao userDao = new UserDao4MySqlImpl();
		userDao.addUser(username, password);
	}
}

U层:

package com.tgb.spring.client;

import com.tgb.spring.manager.UserManager;
import com.tgb.spring.manager.UserManagerImpl;

public class Client {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		UserManager userManager = new UserManagerImpl();
		userManager.addUser("屈文哲", "123");
	}
}

经典三层实现了责任分工,U层负责页面、B层负责逻辑、D层负责数据访问,这是OO路上的一次伟大进步。可以经典三层有什么缺陷呢?U层依赖于B层,B层依赖于D层。

依赖好比求人办事,人家心情好给你办,人家心情不爽就是不给你办,你能咋地?大家是不是都不喜欢求爷爷告奶奶?IoC(控制反转)给无数患者带来了福音,让我们不必再看别人脸色。

IoC实现

IoC的核心思想:本来是由应用程序管理的对象之间的依赖关系,现在交给了容器管理,即交给了IoC容器,这个
过程就称作控制反转。

现在我们用代码来说明IoC是如何解决经典三层中的依赖关系的。

D层:

package com.tgb.spring.dao;

public interface UserDao {

	public void addUser(String username,String password);
}
package com.tgb.spring.dao;

public class UserDao4MySqlImpl implements UserDao {

	@Override
	public void addUser(String username, String password) {
		System.out.println("UserDao4MySqlImpl.addUser()");
	}
}

B层:

package com.tgb.spring.manager;

public interface UserManager {
	public void addUser(String username, String password);
}
package com.tgb.spring.manager;

import com.tgb.spring.dao.UserDao;

public class UserManagerImpl implements UserManager {

	private UserDao userDao;

	@Override
	public void addUser(String username, String password) {
		userDao.addUser(username, password);
	}

	public void setUserDao(UserDao userDao) {
		this.userDao = userDao;
	}
}

通过B层代码我们可以发现,在B层UserManagerImpl类中,我们只对D层的UserDao接口进行了声明,并未进行实例化,这个疑问我们马上帮你解决。

U层:

package com.tgb.spring.client;

import org.springframework.beans.factory.BeanFactory;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.tgb.spring.manager.UserManager;

public class Client {

	public static void main(String[] args) {
		BeanFactory factory = new ClassPathXmlApplicationContext(
				"applicationContext.xml");

		UserManager userManager = (UserManager) factory.getBean("userManager");

		userManager.addUser("屈文哲", "123456");
	}
}

通过U层代码我们可以发现,U层声明了B层的UserManager接口,通过getBean的方式完成实例化过程。

核心文件applicationContext.xml:

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
	xmlns:tx="http://www.springframework.org/schema/tx"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
           http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">

	<bean id="userDao4Mysql" class="com.tgb.spring.dao.UserDao4MySqlImpl"></bean>

	<bean id="userManager" class="com.tgb.spring.manager.UserManagerImpl">
		<!-- 构造函数注入 -->
		<!--<constructor-arg ref="userDao4Mysql" />-->
		<!-- <constructor-arg ref="userDao4Oracle" />-->

		<!-- setter方式注入 -->
		<property name="userDao" ref="userDao4Mysql" />
	</bean>
</beans>

在核心文件applicationContext.xml中,我们通过bean管理需要被依赖的类UserDao4MySqlmpl、UserManagerImpl,通过setter注入的方式,把userDao4Mysql注入到UserManagerImpl中。

到此我们可以发现,IoC思想:U层只声明B层的接口UserManager,具体调用哪个实现UserManager接口的类,在applicationContext.xml中通过<bean id="userManager" class="com.tgb.spring.manager.UserManagerImpl">class属性动态配置。

B层只声明D层接口UserDao,具体调用哪个实现UserDao接口的类,通过applicationContext.xml中<property
name="userDao" ref="userDao4Mysql" />的ref属性把UserDao4Mysql注入到B层的UserManagerImpl。

这样完美解决了三层架构层与层之间的依赖关系,把依赖关系都交给IoC容器统一管理。

到此IoC入门思想讲解完毕,希望大家关注后续博客的发表。

时间: 2024-10-28 12:42:27

从三层架构到IoC的蜕变的相关文章

从MVC和三层架构说到ssh整合开发-下

这章主要讲整合开发,直接从实战讲起,对与ssh的单方面了解,请继续等待我的兴许文章. 解说不到位的地方欢迎大家指正:联系方式rlovep.com 具体请看源码凝视: 全部代码下载(csdn):链接 Github链接:链接https://github.com/wpeace1212/javaBlog/tree/master/sshDemo 写文章不易,欢迎大家採我的文章,以及给出实用的评论.当然大家也能够关注一下我的github.多谢. 1.整合流程 针对一个简单项目.让大家对三层机构和MVC有一个

企业级应用框架(一) 三层架构之解耦

前言 前段时间朋友拿了个网站给我,让我帮忙添加几个小功能,我爽快的答应了,但是当我打开源码,我瞬间就奔溃了,整个项目连最基本的三层框架也没有搭建,仅仅是封装了一个sqlhelp作为数据库的操作接口,项目中的SQL查询语句无处不在,业务逻辑紧紧耦合在UI逻辑中,看到这样的代码,坦白来说,我什么兴致都没有了,但是碍着人情,我硬着头皮,把基本功能的完成交差,通过这件事情,我对软件分层进行了深入的思考. 三层架构 说到三层架构,大伙都很熟悉,我也不再多啰嗦了,我们直接快速搭建一个. 项目的引用关系是:S

从MVC和三层架构说到SSH整合开发

相信很多人都认同JavaWeb开发是遵从MVC开发模式的,遵从三层架构进行开发的,是的,大家都这么认同.但是相信大家都会有过这样一个疑问,if(MVC三层模式==三层架构思想)out.println(“请继续观看……”) 1.MVC(MODEL-VIEW-CONTROLLER)设计模式: 首先让我们了解下MVC(Model-View-Controller)的概念: MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写

Java Web 三层架构详解

java 三层架构ssh 一个spring2.5+hibernate3.2+struts2.0组合框架,使用spring的 IoC来管理应用的 所有bean,包括struts2的 action,充分发挥了spring轻量级框架的 优势.  摘 要: 针对当前Web应用程序开发面临的问题,结合目前比较流行的开源框架Spring.Struts和hibernate,提出了一种开发J2EE Web应用的轻量级解决方案,以帮助开发人员在短期内搭建结构清晰.可复用性好.维护方便的Web应用程序.并且,通过案

从MVC和三层架构说到ssh整合开发-上

相信很多人都认同JavaWeb开发是遵从MVC开发模式的,遵从三层架构进行开发的,是的,大家都这么认同.但是相信大家都会有过这样一个疑问,if(MVC三层模式==三层架构思想)out.println("请继续观看--") 1.MVC(Model-View-Controller)设计模式: 首先让我们了解下MVC(Model-View-Controller)的概念: MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controlle

三层架构、MVC

三层架构 将整个业务应用划分为:界面层(User Interface layer, UIL).业务逻辑层(Business Logic Layer, BLL).数据访问层(Data access layer, DAL). 1:界面层:主要是指与用户交互的界面.用于接收用户输入的数据和显示处理后用户需要的数据.如果逻辑层相当强大和完善,无论表现层如何定义和更改,逻辑层都能完善地提供服务. 2:业务逻辑层:UI层和DAL层之间的桥梁.实现业务逻辑.业务逻辑具体包含:验证.计算.业务规则等等. 3:数

搭建连接MySql的三层架构的ASP.NetCore2.0的WebApi

里我们用三层架构搭建一个连接MySql的ASP.netCore模板的WebApi项目 首先添加WebApi项目(ASP.NetCore版本) 右键解决方案>新建项目> 选择Web>ASP.NET Core Web应用程序(.NET Core) 选择Web API 此时的目录结构: 添加实体层Entity 右键添加>新建项目>.Net Core类库 添加后的目录结构 BaseEntity: using System; using System.Collections.Gener

C#三层架构

最近新学的,C#中得三层架构                                                                                ----2016-10-23 表示层 业务逻辑层(BLL) 数据访问层(DAL) 关联:产生依赖关系 描述:三层体系结构就是在客户端和数据库之间加一个中间层,通常情况下客户端不能直接和数据库进行交互,而是通过中间层和数据层进行交互的. [表示层] 主要负责完成用户和系统的交互. 它接收用户输入的信息,并把上级传

后台三层架构

后台三层架构 所谓的三层开发就是将系统的整个业务应用划分为表示层.业务逻辑层.数据访问层,这样有利于系统的开发.维护.部署和扩展. 分层实现了“高内聚.低耦合”,采用“分而治之”的思想,把问题划分开来解决,易于控制.延展,易于分配资源. 第一层:表现层/表示层:负责直接跟用户进行交互,一般是指系统的界面,用于数据录入.数据显示等.意味着只做与外观显示相关的工作,不属于它的工作不用做. 第二层:业务层/服务层:用于做一些有效性验证的工作,以更好地保证程序运行的健壮性.如完成数据添加.修改和查询业务