Spring 实例入门
本文结合实例理解解容器,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配置文件中添加如下配置
<bean id="s1" class="com.hb.Soldier"></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默认使用单例的方式创建对象。可以通过修改<bean>的配置改变成其它创建方式。这个属性为Scope,称之为作用域或生命周期,它的值为singleton(单例,默认值),prototype(每次产生一个新的实例)等。
<bean id="s1" class="com.hb.Soldier" scope="prototype"></bean>
2. 注入方式有setter注入,构造注入方式,接口注入(不需掌握)。建议多使用Setter注入方式。
Setter注入:
Soldier类中有一个属性name,如何在创建Soldier的时候使name的值变为”RANBO”?
配置如下:
<bean id="s1" class="com.hb.Soldier">
<property name="name" value="RANBO"/>
</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; }
}
配置如下:
<bean id="s1" class="com.hb.Soldier">
<constructor-arg value="RANBO"></constructor-arg>
</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();
}
}
配置如下
<bean id="s1" class="com.hb.Soldier">
<property name="handGun">
<ref bean="handgun"></ref>
</property>
</bean>
<bean id="handgun" class="com.hb.HandGun"></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();
}
}
配置如下
<bean id="s1" class="com.hb.Soldier">
<property name="weapon">
<ref bean="handgun"></ref>
</property>
</bean>
<bean id="handgun" class="com.hb.HandGun"></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,这就是依赖注入依赖注入依赖注入依赖注入了。 看一下你是否已经有所领悟了: 假如“手-枪“已经不满足“士兵”的需要,我们需要将“手-枪”更换为更先进的“机枪”,你的程序如何编写呢?自己试一下吧!!
发表评论
-
webservice的cxf接口
2013-04-07 10:39 979CXF接口: 1.下载cxf-apache的工具包(附 ... -
java程序通信方式(未完)
2013-04-07 09:16 6191:采用J2EE 的Servlet 完成特定功能,部署To ... -
form提交
2013-02-28 16:46 0<html> <head> < ... -
jQuery怎样做开发(陆续更新)
2013-02-28 09:56 680调试环境 firefox firedebug ... -
eclipse撤销spring的方法
2012-10-26 14:51 954撤消MyEclipse对Spring的支持 1. 从 ... -
structs2--搭建
2012-10-24 13:43 0嗷嗷 -
target标签作用
2012-09-21 09:51 763_blank -- 在新窗口中打开链接 _parent -- ... -
js控制链接不在新窗口中打开
2012-09-20 10:35 1047控制目的:禁止右键菜单 <script languag ... -
structs2与structs1.x的原理
2012-09-17 13:52 806当用户向Struts2发送请求时,FilterDispatch ... -
structs2的应用与structs1.x的区别
2012-09-17 10:43 1346【第1步】 安装Struts2 ... -
nginx服务器
2012-08-07 09:45 696Nginx 是一个很牛的高性能Web和反向代理服务器,它具 ... -
AJAX的处理
2012-08-06 12:16 818AJAX异步同步代码分析 var xmlhttp = ...
相关推荐
基于C++开发的WEB服务器,支持C/C++、Python、Java等多语言混合开发WEB应用
基于STM8单片机的编程实例,可供参考学习使用,希望对你有所帮助
基于STM8单片机的编程实例,可供参考学习使用,希望对你有所帮助
该靶场仅供学习使用!
电影详情链接 图片链接 影片中文名 影片外国名 评分 评价人数 概况 相关信息 https://movie.douban.com/subject/1292052/ https://img2.doubanio.com/view/photo/s_ratio_poster/public/p480747492.jpg 肖申克的救赎 The Shawshank Redemption 9.7 2529468 希望让人自由 导演: 弗兰克·德拉邦特 Frank Darabont 主演: 蒂姆·罗宾斯 Tim Robbins ... 1994 美国 犯罪 剧情 https://movie.douban.com/subject/1291546/ https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2561716440.jpg 霸王别姬 9.6 1880353 风华绝代 导演: 陈凯歌 Kaige Chen 主演: 张国荣 Leslie Cheung 张丰毅 ........
汽车中间件市场调研报告:2023年全球汽车中间件市场销售额达到了78亿美元 在数字化转型的浪潮中,汽车中间件作为连接硬件与软件的关键桥梁,正引领着汽车行业的新一轮变革。随着全球汽车产业的快速发展,中间件市场规模持续扩大,展现出前所未有的增长潜力。然而,面对复杂多变的市场环境和不断涌现的新技术,企业如何精准把握市场脉搏,实现可持续发展?本文将深入探讨全球及中国汽车中间件市场的现状、趋势及竞争格局,为您揭示咨询的重要性。 市场概况: 根据QYResearch(恒州博智)的统计及预测,2023年全球汽车中间件市场销售额达到了78亿美元(约7803百万美元),预计2030年将达到156亿美元(约15630百万美元),年复合增长率(CAGR)为10.3%(2024-2030)。这一数据不仅彰显了中间件市场的强劲增长动力,也预示着未来巨大的市场空间。 技术创新与趋势: 随着自动驾驶、车联网等技术的不断发展,汽车中间件正面临着前所未有的技术挑战与机遇。新一代中间件需要具备更高的实时性、更低的延迟以及更强的数据处理能力,以满足复杂多变的汽车应用场景。同时,云计算、大数据、人工智能等技术的融合应用,将进
python语言mp3pl爬虫程序代码QZQ
# 小语种字体TTF文件转PNG图片的方法 ## 准备工作 1. 下载python3.9,推荐3.6~3.9,几个依赖包在这个版本运行的好。 2. 下载 FontForge-mingw-w64 ,可自行下载,或从文末打包好的工具包直接使用。 3. 下载需要导出的字体ttf文件,最好先装在本机系统上。 ## 导出方法 1. 把 `tts2png2.py` 文件复制到软件的bin目录下。 2. 修改 `tts2png2.py` 文件中的字体路径,注意Windows用双斜杠。 3. 从bin目录打开终端(管理员模式启动)。 4. 运行脚本 `./ffpython .\tts2png2.py`。
在21世纪的科技浪潮中,人工智能(AI)无疑是最为耀眼的明星之一,它以惊人的速度改变着我们的生活、工作乃至整个社会的运行方式。而在人工智能的广阔领域中,大模型(Large Models)的崛起更是开启了智能技术的新纪元,引领着AI向更加复杂、高效、智能的方向发展。本文将深入探讨人工智能大模型的内涵、技术特点、应用领域以及对未来的影响。 一、人工智能大模型的内涵 人工智能大模型,顾名思义,是指具有庞大参数规模和数据处理能力的AI模型。这些模型通过深度学习算法,在海量数据上进行训练,能够学习到丰富的知识表示和复杂的模式识别能力。与传统的小型或中型模型相比,大模型在理解自然语言、生成高质量内容、进行跨模态信息处理等方面展现出前所未有的优势。它们不仅能够执行特定的任务,如图像识别、语音识别,还能进行创造性的工作,如文本生成、音乐创作,甚至在某些情况下展现出接近或超越人类的智能水平。 二、技术特点 海量数据与高效训练:大模型依赖于庞大的数据集进行训练,这些数据涵盖了广泛的主题和情境,使得模型能够学习到丰富的语义信息和上下文理解能力。同时,高效的训练算法和硬件加速技术,如TPU(Tensor Processing Unit)和GPU,使得大规模模型的训练成为可能。 自注意力机制与Transformer架构:许多领先的大模型采用了Transformer架构,特别是其自注意力机制,这种设计使得模型在处理序列数据时能够捕捉到长距离依赖关系,极大地提高了模型的表达能力和泛化能力。 多任务学习与迁移学习:大模型通常具备多任务学习的能力,即在一次训练中同时学习多个任务,这有助于模型学习到更通用的知识表示。此外,迁移学习使得这些模型能够轻松适应新任务,只需少量额外数据或微调即可。
下垂控制-基于T型三电平逆变器的下垂控制,电压电流双闭环,采用LCL滤波,SPWM调制方式 1.提供simulink仿真源文件 2.提供下垂控制原理与下垂系数计算方法 3.中点平衡控制,电压电流双闭环控制 4.提供参考文献
城市选择器一个仿大众点评的城市快速选择器, 最少只需 一行 代码即可启动城市选择器, 支持页面样式修改,多元化自定义截屏 版本日志V0.4.6优化地理位置设置时有时会设置不成功问题修复其他若干问题修改UI默认主题色V0.4.5修改设置位置信息方式,由之前必须在打开页面之前获取位置信息改为允许用户在打开页面后设置位置信息,具体使用方式见 Step3简化配置项,不需要在AndroidManifest中再注册Activity,并默认隐藏titlebarV0.4.3修复更新数据库表结构后第一次进入会闪退问题V0.4.0数据库表结构修改,增加了高德地图citycode设置gps城市的api略有改动见 Step3V0.3.3紧急修复一个可能导致内存泄漏问题优化提高滑动检索效率隐藏下拉刷新labelV0.3.1在搜索框后面添加一个清空搜索框按钮修复搜索框中输入空格会搜索出全部城市问题修复搜索结果弹出框中文字在不同theme下显示不同颜色问题,现在已统一为黑色其他调用时参数合法性校验V0.3.0简化api调用形式,修改为Rx形式,见操作步骤
慢性病大数据分析处理慢性病项目
Multisim单片机资源单片机C语言程序设计实训100例提取方式是百度网盘分享地址
PMSM永磁同步电机最大转矩电流比MTPA控制仿真,弱磁控制仿真,前馈补偿仿真程序,详细解析教程文档。 这是一份非常完美的仿真文件及详细教程,从仿真效果图看转速、电流及转矩跟随非常稳定。 该算法架构包含如下模块: 1)SVPWM矢量控制模块 2)转速环PI调节器、电流环PI调节器; 3)MTPA调节器; 4)弱磁控制器; 5)前馈补偿; 一份该仿真的算法说明文档,每一步都有详细介绍如何搭建,包括环路参数怎么算,拿来做毕设或者学习都很方便; 几篇参考文献; 一篇作者自己写的算法总结,让你少走弯路; 两个视频;
手绘卡通儿童人物幼儿园教学课件模板
Simulink电动汽车仿真模型(包含行驶阻力模型,工作模式切模型,驾驶员模型,PID控制模块等,NEDC,CLTC工况仿真结果)东西很全
是一款全功能的备份软件,支持增量备份、差异备份、完全备份和同步备份,帮助用户轻松保护关键文件。支持多种存储选项,包括本地硬盘、USB驱动器、网络文件夹、云存储和 FTP 服务器等。 【使用方法】: 1. 下载并安装 Perfect Backup。 2. 打开软件,选择备份类型(增量、差异、完全或同步)。 3. 指定源文件和目标存储位置。 4. 设置备份计划,选择备份频率。 5. 点击“开始备份”,执行备份任务。
基于STM8单片机的编程实例,可供参考学习使用,希望对你有所帮助
资源描述: HTML5实现好看的创意房屋设计公司网页源码,好看的创意房屋设计公司网页源码,创意房屋设计公司网页源码模板,HTML创意房屋设计公司网页源码,内置酷炫的动画,界面干净整洁,页面主题,全方位介绍内容,可以拆分多个想要的页面,可以扩展自己想要的,注释完整,代码规范,各种风格都有,代码上手简单,代码独立,可以直接运行使用。也可直接预览效果。 资源使用: 点击 index.html 直接查看效果