问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何替换spring的依赖注入机制

发布网友 发布时间:2022-05-15 10:23

我来回答

2个回答

懂视网 时间:2022-05-15 14:44

这篇文章主要介绍了JSP开发之Spring方法注入之替换方法实现的相关的JSP资料,对JSP感兴趣的朋友可以参考下本篇文章

JSP开发之Spring方法注入之替换方法实现

Spring提供了一种替换方法实现的机制,可以让我们改变某个bean某方法的实现。打个比方我们有一个bean,其中拥有一个add()方法可以用来计算两个整数的和,但这个时候我们想把它的实现逻辑改为如果两个整数的值相同则把它们相乘,否则还是把它们相加,在不改变或者是不能改变源码的情况下我们就可以通过Spring提供的替换方法实现机制来实现这一要求。

替换方法实现机制的核心是MethodReplacer接口,其中定义了一个reimplement ()方法,我们的替换方法实现的主要逻辑就是在该方法中实现的,

具体定义如下:

public interface MethodReplacer {

 /**
 * Reimplement the given method.
 * @param obj the instance we're reimplementing the method for
 * @param method the method to reimplement
 * @param args arguments to the method
 * @return return value for the method
 */
 Object reimplement(Object obj, Method method, Object[] args) throws Throwable;

}

我们可以看到reimplement()方法将接收三个参数,其中obj表示需要替换方法实现的bean对象,method需要替换的方法,args则表示对应的方法参数。针对前面打的比方,假设我们有如下这样一个类定义对应的bean。

public class BeanA {

 public int add(int a, int b) {
 return a+b;
 }
 
}
 <bean id="beanA" class="com.app.BeanA"/>

如果我们需要替换add()方法的实现为a与b相等时则相乘,否则就相加,则我们可以针对该方法提供一个对应的MethodReplacer的实现类,具体实现如下所示。

public class BeanAReplacer implements MethodReplacer {

 /**
 * @param obj 对应目标对象,即beanA
 * @param method 对应目标方法,即add
 * @param args 对应目标参数,即a和b
 */
 public Object reimplement(Object obj, Method method, Object[] args)
 throws Throwable {
 Integer a = (Integer)args[0];
 Integer b = (Integer)args[1];
 if (a.equals(b)) {
 return a * b;
 } else {
 return a + b;
 }
 }

}

之后就需要在定义beanA时指定使用BeanAReplacer来替换beanA的add()方法实现,这是通过replaced-method元素来指定的。其需要指定两个属性,name和replacer。name用来指定需要替换的方法的名称,而replacer则用来指定用来替换的MethodReplacer对应的bean。所以,此时我们的beanA应该如下定义:

<bean id="beanAReplacer" class="com.app.BeanAReplacer"/>
 <bean id="beanA" class="com.app.BeanA">
 <replaced-method name="add" replacer="beanAReplacer"/>
 </bean>

如果我们的MethodReplacer将要替换的方法在对应的bean中属于重载类型的方法,即存在多个方法名相同的方法时,我们还需要通过在replaced-method元素下通过arg-type元素来定义对应方法参数的类型,这样就可以区分需要替换的是哪一个方法。所以,针对上述示例,我们也可以如下定义:

<bean id="beanAReplacer" class="com.app.BeanAReplacer"/>
 <bean id="beanA" class="com.app.BeanA">
 <replaced-method name="add" replacer="beanAReplacer">
 <arg-type match="int"/>
 <arg-type match="int"/>
 </replaced-method>
 </bean>

对应方法名的方法只存在一个时,arg-type将不起作用,即Spring此时不会根据arg-type去取对应的方法进行替换,或者换句话说就是当replaced-method指定名称的方法只存在一个时,无论arg-type如何定义都是可以的。

热心网友 时间:2022-05-15 11:52

创建编写测试Demo使用的工程,并导入Spring调用所需要的jar包。

创建接口类。

编写ProctDaoImp类,实现ProctDao接口。

编写ProctManage类,实现set方法,以注入ProctDaoImp类。

修改applicationContext.xml文件,添加红框中的代码。

编写测试用主类。

7
执行主类,查看执行结果。可见测试Demo已经成功!
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
急求高人解答 ···管理类的问题 ···!!!急急急···我会在线等... ...如果基层管理幅度为8,高层管理人员管理幅度为3,则该公司中层管理人员... ...发生化学变化的实质是( )A.分子间隔发生变化B.物质状态发生改变C... 下列变化不能说明发生了化学变化的是( )A.变化时有电子的得失或共用电... 下列描述正确的是( )A.固态物质的分子间无间隔B.液态物质的分子不断运动... 原来微信打开这个功能,能够看到马路上的街景,涨知识了! ...百度帐号被人在异地登录了,问题是没有任何人知道我的密码啊?而且也... 医疗事故纠纷和医疗损害纠纷的区别是什么 医疗纠纷与医疗事故的定义是什么? 医疗事故纠纷是指什么的 有的人发微博的故事就只是拍了外景一分钟。他是不是想看看有谁看他关注他啊?为了看访问记录吧 人事部翻译资格考试可以退费吗? 人事部三级笔译难么 【提问】 CATTI人事部的翻译资格证考试,对就业有什么帮助? 国家人事部英语翻译资格(水平)考试 冒险岛武陵道场是第二关不出来啊 我是龙,你是虎,虎和龙自古以来都是并驾齐驱的这句话的日文 请问魔兽世界牛头人哪个名字好听? 暗黑破坏神2死灵法师能召唤多少 自信即巅峰是谁说的? vivox5l的桌面音乐挂件怎样设置歌词和播放键? 哪位哥哥 那位姐姐知道谭咏麟(朋友粤语歌词谐音)的,帮忙拼拼啊 在这感激不尽了! 使用放大镜观察蜗牛 放大镜与什么贴近?A眼睛B哇牛 vivo x7桌面音乐播放器被我不小心点掉了,不是图标,是那个在最上面的和天气什么小挂件。怎么给它弄 火影忍者中纲手的通灵兽是谁 周杰伦的《兰亭序》里的“月下门推”,周杰伦为什么唱成了“月下门催”? 嘉兴哇牛智新股权投资合伙企业(有限合伙)怎么样? QQ消息管理器中已删除联系人是自己删除的好友还是对方删除的自己呢 谁有 澳大利亚电影《糖果》和 、《孤零飘落燕》(也叫生命翻筋斗) 的迅雷或BT下载地址, freesolo 哇牛蓝牙耳机好用吗? 皇冠梨能做冰糖雪梨吗 冰糖炖雪梨能用皇冠梨代替吗 冰糖炖梨的雪梨能用皇冠梨代替吗? 皇冠梨用来做冰糖雪梨好吗? 林则徐在鸦片战争后给朋友的一封信中说:……徐尝谓剿匪八字要言,器良... 林则徐主张什么积极防御思想 如果在鸦片战争中,道光帝仍然重用林则徐,后面将是什么情况 《鸦片战争》经典台词 林则徐禁鸦片赞美林则徐的话第八课林则徐 是否&quot;鸦片战争的一声炮响,给中国带来了近代文明&quot;? 广州一手房未出证可以打详版查册吗 工行放宽房贷年龄对部分购房者带来什么利好? 广州大源按揭代理服务有限公司怎么样? 工行放宽房贷年龄的调整合理吗? 房贷提前还款合算么? 怎样将QQ聊天窗口情侣聊天的对话收藏进蜜语盒子? qq情侣关系没有解除 但为什么有些东西不显示了,例如蜜语盒子图标没了,给对方发的表情也不显示了 西安万象春天4号楼loft现状 华润万象里的商业怎么样?面积区间是多少? 西安地铁一号线能到西咸万象城吗