SSH框架中spring的原理
在ssh项目中,是有明确分工的,spring的作用就相当于将struts和hibernate连接起来,是将两个没有关系的框架的特性,方法,action都放在spring的配置文件中使他们建立关系。取他门各自所长。而这些做法他们自己不知道,他们是听命于spring调度的,他的的任务只是做好自己的事情。
这样做的好处就是任务结构分明,struts只管理显示与做什么,hibernate只关心怎么做,而spring就相当于领导,所以一切的类都要交给spring的工厂创建,这是一种良好的开发模式,体现了一种编程思想,最大的好处就是结构分明,便于维护,一旦项目出现问题,只修改spring文件,而不在你复杂的程序中去发现是谁在调用谁。
简而言之,ssh框架总体是为了解耦合使用的,struts管理表示层,spring管理业务逻辑层,hibernate管理持久化层,3个框架互相不关联,spring调用hibernate、struts调用spring来做方法调用,好处在于spring面向接口的设计,只要你的接口不变,impl变动在配置文件中配置就好了,这样在工程实施后,可以实现软编码,在异地调用用的配置文件直接修改配置文件调用已经写好的类,来增加功能。
下面结合实例理解解容器,DI,IOC,耦合,解耦等Spring所涉及的概念,同时了解Spring的最基本也是最核心的使用方法。
1. Spring容器
Spring容器负责对象的实例化,对象生命周期的管理,被Spring管理的对象称之为Bean。
例如有Soldier类需要交由Spring容器管理,我们先编写类
|
package com.hb; public class Soldier { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } } |
在Spring配置文件中添加如下配置
|
<</SPAN>bean id="s1" class="com.hb.Soldier"></</SPAN>bean> |
初始化Spring容器
|
public class Test { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); } } |
从Spring容器中取得对象实例
|
Soldier s1 = (Soldier) context.getBean("s1"); |
Spring默认使用单例的方式创建对象。可以通过修改的配置改变成其它创建方式。这个属性为Scope,称之为作用域或生命周期,它的值为singleton(单例,默认值),prototype(每次产生一个新的实例)等。
|
<</SPAN>bean id="s1" class="com.hb.Soldier" scope="prototype"></</SPAN>bean> |
2. 注入方式有setter注入,构造注入方式,接口注入(不需掌握)。建议多使用Setter注入方式。
Setter注入:
Soldier类中有一个属性name,如何在创建Soldier的时候使name的值变为”RANBO”?
配置如下:
|
<</SPAN>bean id="s1" class="com.hb.Soldier"> <</SPAN>property name="name" value="RANBO"/> </</SPAN>bean> |
这样创建的Soldier对象的name属性就有值了,测试代码:
|
public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); Soldier s1 = (Soldier) context.getBean("s1"); System.out.println(s1.getName()); } |
构造注入:
我们先修改下Soldier类,给它添加一个构造方法:
|
package com.hb; public class Soldier { private String name; public Soldier(String name) { this.name = name; }
public String getName() { return name; } } |
配置如下:
|
<</SPAN>bean id="s1" class="com.hb.Soldier"> <</SPAN>constructor-arg value="RANBO"></</SPAN>constructor-arg> </</SPAN>bean> |
测试结果同上。
3. 依赖
当A对象使用了B对象的方法,A对B产生依赖,称之为A依赖B。下面的例子中Soldier类依赖HandGun类。
|
package com.hb; public class Soldier { public void fight(){ HandGun handGun = new HandGun(); handGun.killEnemy(); } } |
|
package com.hb; public class HandGun { public void killEnemy(){ System.out.println("手枪杀敌"); } } |
当HandGun发生变化时,必然导致Soldier必须做相应修改,同时,当Soldier需要使用OtherGun时也必须重新编写代码,导致代码重用度不高。
当对象之间的依赖关系很强时(耦合),会使程序代码死板,不利于后期的维护和扩展。降低对象之间的依赖关系称之为解耦。Spring能够很好的解决这一问题。
4. 控制反转(Inversion of Control,简称IOC)和依赖注入(Dependence Inject简称DI)
我们运用Spring的setter注入方式解决HandGun和Soldier的耦合问题。修改Soldier的代码,将HandGun定义为Soldier的属性并提供setter方法:
|
package com.hb; public class Soldier { private HandGun handGun; public void setHandGun(HandGun handGun) { this.handGun = handGun; } public void fight(){ handGun.killEnemy(); } } |
配置如下
|
<</SPAN>bean id="s1" class="com.hb.Soldier"> <</SPAN>property name="handGun"> <</SPAN>ref bean="handgun"></</SPAN>ref> </</SPAN>property> </</SPAN>bean> <</SPAN>bean id="handgun" class="com.hb.HandGun"></</SPAN>bean> |
到这里,我们已经降低了HandGun和Soldier的部分依赖关系,至少在Soldier中不用再自己去实例化HandGun了。然而并没有彻底解决问题,Soldier中仍然可以看到HandGun类,因此我们使用接口进一步改进代码:
|
package com.hb; public interface Weapon { void killEnemy(); } |
|
package com.hb; public class HandGun implements Weapon{ public void killEnemy(){ System.out.println("手枪杀敌"); } } |
|
package com.hb; public class Soldier { private Weapon weapon; public void setWeapon(Weapon weapon) { this.weapon = weapon; } public void fight(){ weapon.killEnemy(); } } |
配置如下
|
<</SPAN>bean id="s1" class="com.hb.Soldier"> <</SPAN>property name="weapon"> <</SPAN>ref bean="handgun"></</SPAN>ref> </</SPAN>property> </</SPAN>bean> <</SPAN>bean id="handgun" class="com.hb.HandGun"></</SPAN>bean> |
测试:
|
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); Soldier s1 = (Soldier) context.getBean("s1"); s1.fight(); |
至此,我们使用Spring很好的解决了HandGun和Soldier的耦合问题。Soldier类中再也看不到HandGun的踪影了,Soldier只依赖于接口,而最终Soldier还是使用了HandGun,这是为什么呢?Spring在这里管理了单个的对象,也管理了对象之间即Soldier和HandGun的依赖关系。原本是由Soldier控制HandGun的实例化的,转变为由Spring容器来控制,这里发生了控制权的转移,这就是控制反转(Inversion of Control,简称IOC)。当Soldier需要HandGun时,Spring会自动将HandGun对象注入给Soldier,这就是依赖注入了。
SSH框架中spring的原理的更多相关文章
- SSH框架中 Spring设置定时器 Quartz
一,首先下载quartz-1.6.0.jar架包,到lib目录下 二,写你自己定时器业务方法 package com.lbnet.lzx.timing; import org.quartz.JobEx ...
- ssh框架中spring整合hibernate的配置文件模板(带详细注释)
applicationContext.xml的配置文件模板 <?xml version="1.0" encoding="UTF-8"?> <b ...
- 在SSH框架中使用Spring的好处(转)
以下是我总结下今天笔试中SSh中的总结: 在SSH框架中spring充当了管理容器的角色.我们都知道Hibernate用来做持久层,因为它将JDBC做了一个良好的封装,程序员在与数据库进行交互时可以不 ...
- Eclipse搭建SSH框架(Struts2+Spring+Hibernate)
见识少的我经过一天多的研究才知道,在MyEclipse中搭好的框架的配置文件和jar包是通用的.接下来——亮剑! 工具:Eclipse+Tomcat+Mysql 一.先在Eclipse中配置好Tomc ...
- SSH框架中配置log4j的方法
SSH框架中使用log4j的方便之处 1. 动态的改变记录级别和策略,即修改log4j.properties,不需要重启Web应用,这需要在web.xml中设置一下.2. 把log文件定在 /WEB- ...
- Maven环境下搭建SSH框架之Spring整合Hibernate
© 版权声明:本文为博主原创文章,转载请注明出处 1.搭建环境 Spring:4.3.8.RELEASE Hibernate:5.1.7.Final MySQL:5.7.17 注意:其他版本在某些特性 ...
- 在SSH框架中,如何得到POST请求的URL和参数列表
在做项目的API通知接口的时候,发现在SSH框架中无法获取到对方服务器发来的异步通知信息.最后排查到的原因可能是struts2对HttpServletRequest进行了二次处理,那么该如何拿到pos ...
- SSH框架中hibernate 出现 user is not mapped 问题
SSH框架中hibernate 出现 user is not mapped 问题 在做SSH框架整合时,在进行DAO操作时.这里就只调用了chekUser()方法.运行时报 user is ...
- 在SSH框架中使用Spring的好处
在SSH框假中spring充当了管理容器的角色.我们都知道Hibernate用来做持久层,因为它将JDBC做了一个良好的封装,程序员在与数据库进行交互时可以不用书写大量的SQL语句.Struts是用来 ...
随机推荐
- SQL Server SA 密码丢失无法连接数据库怎么办?
如果Windows账户无法连接并且SA密码也丢失了,那么如何可以连接到数据库呢? 答案是: 在单用户模式下启动SQL Server然后用本地管理员权限连接.登陆之后就可以修改SA密码了. 步骤: 1. ...
- 【HTML5】Web Workers
什么是 Web Worker? 当在 HTML 页面中执行脚本时,页面的状态是不可响应的,直到脚本已完成. web worker 是运行在后台的 JavaScript,独立于其他脚本,不会影响页面的性 ...
- Windows自带Android模拟器启动失败
Windows自带Android模拟器启动失败 错误信息:[Critical] XDE Exit Code: InvalidArguments (3)XDE执行的第三个参数为设置内存值,形式为/mem ...
- 精灵动画Animation对话框组成Idle动画的各精灵
精灵动画Animation对话框组成Idle动画的各精灵 1.3 精灵动画 场景中已经添加了精灵,现在是时候让让它动起来了.读者也许已经从精灵图集中,各精灵的命名中看出来了,这个精灵一共有两种动画状 ...
- HDU 5212 Code
筛法. 统计所有 [数] 的所有 [倍数] 的 [数] 的个数,即 i 的所有倍数 i, 2i, 3i, 4i...个数为 dp[i], 则所有 倍数两两结合共有 dp[i] * dp[i] 个. 此 ...
- 10个国内外jQuery的CDN性能大比拼
jQuery是前端开发最常见也是最流行的javascript库,如何去加载它才能使我们的项目性能更好以及问什么要用CDN?当用户访问自己的站点时从服务器加载文件,每个服务器同时只能下载2-4个文件,这 ...
- 【wikioi】1230 元素查找(巨水题+set/hash)
http://wikioi.com/problem/1230/ 这题我真的不好意思写题解了...set练手.. #include <cstdio> #include <set> ...
- 关于APP自动化工程的一点小想法
首先谈一下APP自动化测试面临的一些局限性? 答:测试业务的不明确性,APP逻辑复杂,界面的跳转变化随时间变化. 测试本身的不确定性,如不定时弹窗问题. 测试环境不稳定性,主要是网络的稳定性. 测试接 ...
- java开源网站
1.http://www.java1234.com 2.http://www.2cto.com/Soft/
- Configuration of OpenCV2.1.0 with VS2010
Add in the system Path: C:\Program Files (x86)\OpenCV-2.1.0\build\bin\Debug Project->Project Prop ...