2006-11-29
spring里的依赖注入模式(设值注入)
关键字: 依赖注入
“控制反转”( Inversion of Control,IoC)一个大家都很熟悉的名词,而其大而化之的名字却很容易为它的神秘增加一道朦胧的面纱.为了更能描述其特点,于是诞生——“依赖注入”(Dependency Injection),
依赖注入模式主要分为:设置注入,构造子注入和接口注入.
本文只讲述设置注入.
每一个男孩都具有亲吻别人的能力.而且他们都想亲吻女孩.
每一个女孩可以选择由那位男生亲吻她,但是却不告诉别人到底由谁来亲吻她.
于是女孩用写信的方式来告诉别人她希望谁来亲吻她.
下面的spring.xml告诉别人女孩希望boy来亲吻她.
故事结束了,那么我们再看看这段测试代码:
依赖注入模式主要分为:设置注入,构造子注入和接口注入.
本文只讲述设置注入.
每一个男孩都具有亲吻别人的能力.而且他们都想亲吻女孩.
每一个女孩可以选择由那位男生亲吻她,但是却不告诉别人到底由谁来亲吻她.
public interface Kissable
{
void kiss( Object kisser);
}
public class Boy implements Kissable
{
public void kiss( Object kisser)
{
System.out.println("I was kissed by " + kisser);
}
}
public class Girl
{
private Kissable kissable;
public Kissable getKissable()
{
return kissable;
}
public void setKissable( Kissable kissable)
{
this.kissable = kissable;
}
public void kissSomeone()
{
kissable.kiss(this);
}
}
于是女孩用写信的方式来告诉别人她希望谁来亲吻她.
下面的spring.xml告诉别人女孩希望boy来亲吻她.
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> <beans> <bean id="girl" class="com.ftf.pattern.dependencyInjection.setter.Girl"> <property name="kissable"> <ref local="boy" /> </property> </bean> <bean id="boy" class="com.ftf.pattern.dependencyInjection.constructor.Boy"> </bean> </beans>
故事结束了,那么我们再看看这段测试代码:
public class InterfacesTestCase extends TestCase
{
public void testKissing()
{
ApplicationContext ctx = new
FileSystemXmlApplicationContext("bin/spring.xml");
Girl girl = (Girl)ctx.getBean("girl");
girl.kissSomeone();
}
}
评论
夺天策
2007-04-24
我是spring的初学者,感觉楼主写的很好。。让我理解了一些东西,呵呵
shaucle
2006-11-30
pico container文档的最前面的例子,还比较好玩,嘿嘿.
抛出异常的爱
2006-11-30
想像一下xml变成java是什么样子就清楚了...
目的是为了像积木一样把东西垒起来
而没有什么高深的东东...
目的是为了像积木一样把东西垒起来
而没有什么高深的东东...
fantasy
2006-11-30
恩,的确解释的不是很清楚!但是只是想演示下spring里的设值注入。如果有更为简单的设置注入方法,还望赐教!
foxty
2006-11-29
fantasy 写道
foxty 写道
不就是通过类的set方法将其他对象注入进去,这么简单的一个概念,有必要搞的这么麻烦么?
恩,如果用set方法把对象注入进去是这样
Girl gril = new Girl(); gril.setKissable(new Boy()); gril.kissSomeone();
的确很简单,但是如果这个女孩不想亲吻这个男孩,想亲吻另外一个男孩,是不是得修改这段代码?
如果修改这段代码,那么符不符合设计模式中的开闭原则呢?
我说的意思是,spring的set注入,就是将手工的set转换成了配置,一个很简单明了的概念,没有必要搞的这么复杂而已.
抛出异常的爱
2006-11-29
fantasy 写道
foxty 写道
不就是通过类的set方法将其他对象注入进去,这么简单的一个概念,有必要搞的这么麻烦么?
恩,如果用set方法把对象注入进去是这样
Girl gril = new Girl(); gril.setKissable(new Boy()); gril.kissSomeone();
的确很简单,但是如果这个女孩不想亲吻这个男孩,想亲吻另外一个男孩,是不是得修改这段代码?
如果修改这段代码,那么符不符合设计模式中的开闭原则呢?
foxty说你把简单问题复杂化了....
而且你说的也不是很清楚
如果想研究就用很清楚的例子&清晰的解释
fantasy
2006-11-29
foxty 写道
不就是通过类的set方法将其他对象注入进去,这么简单的一个概念,有必要搞的这么麻烦么?
恩,如果用set方法把对象注入进去是这样
Girl gril = new Girl(); gril.setKissable(new Boy()); gril.kissSomeone();
的确很简单,但是如果这个女孩不想亲吻这个男孩,想亲吻另外一个男孩,是不是得修改这段代码?
如果修改这段代码,那么符不符合设计模式中的开闭原则呢?
fantasy
2006-11-29
lighter 写道
我记得这是网上最早的一个关于picocontainer例子吧,Kissable,Boy,Girl的类都一模一样的......
Kissable,Boy,Girl对象是picocontainer的例子,但是picocontainer是构造子注入容器!我写的是设置注入.
foxty
2006-11-29
不就是通过类的set方法将其他对象注入进去,这么简单的一个概念,有必要搞的这么麻烦么?
lighter
2006-11-29
我记得这是网上最早的一个关于picocontainer例子吧,Kissable,Boy,Girl的类都一模一样的......
- 浏览: 79802 次
- 性别:

- 来自: 北京

- 详细资料
搜索本博客
最近加入圈子
最新评论
-
J2EE开发注意事项
写绝对路径,在移动文件到其他文件夹的时候,不需要修改代码。
-- by fantasy -
J2EE开发注意事项
5.页面上的地址原则上写绝对路径。 是何道理呢? 相对路径先定位到根,然后定 ...
-- by nwangwei -
深入osworkflow的function
kathytingzi 写道怎么实现会签阿,谢谢啦 增加两个conditon, ...
-- by fantasy -
使用Filter控制页面的权限
恩,是面向切面。过滤器可以看成是一个切面。
-- by fantasy -
深入osworkflow的function
工作流初学者: 参考:http://hi.baidu.com/vjame/blo ...
-- by amuj2ee






评论排行榜