冬眠(Hibernate)过后,春天(Spring)又来了!呵呵,JAVA开源世界就是这样生机勃勃。Spring这个框架够经典,我们来一起学习下。下面我们以新颖的对话方式来讲述Spring。一直很喜欢听赵传的“我是一只小小鸟”,初学者傻傻地,羽翼未丰,就简称“小鸟”吧,技术强人呢,牛气冲天,当然就叫“大牛”了。
一天, 小鸟在路上郁闷地唱着歌:“我是一只小小小小鸟,想学Spring却怎么也学不好……”,突然遇到刚发工资的大牛,欣喜若狂。
“牛哥,碰到你太好了,我们新项目要用Spring,看了几天书,可我还是没通。”
“呵呵,客气了不是,叫啥牛哥。牛顿姓牛,牛魔王也姓牛,你就叫我阿牛吧!”,大牛心情大好。
小鸟:“好的,牛哥。没问题,牛哥。”
大牛:“#¥%¥#¥%&”
小鸟:“牛哥,你说Spring咋就这么难学啊,莫非我跟它无缘?!”
大牛:“恩,非也。缘由心生,不管什么技术,你要先知道它的好处,对它产生强烈的兴趣,然后才会用心征服它。”
小鸟:“这个我明白,找女朋友就是这样的技术。”
大牛:“#¥%¥#¥%&”
“看了几天书,你自己如何理解Spring,觉得Spring又难在哪里呢?”大牛点上支烟,悠悠地问道。
“从概念上讲,Spring是一个轻量级的非侵入式的基于控制反转(IOC)和面向切面(AOP)的容器框架。轻量级嘛,是说它的体积和处理开销都小。非侵入式是说Spring应用中的对象不依赖于Spring的特定类。而且,Spring允许通过名称创建和检索对象,也可以管理对象的生命周期和对象之间的关系,所以它是个容器。它又提供了很多基础功能如事务管理、持久化框架集成等,将应用逻辑的开发留给我们,这就是典型的框架了。吼吼,我说的没错吧。”小鸟得意洋洋。
“恩,非常好,接着说。”大牛很满意。
“我了解的就差不多这些了。”小鸟黯然道。
“IOC,书上说叫控制反转,我差点被它弄反转了,还是不能理解。而AOP更是捉摸不透。”
“哈哈,其实IOC这个概念按照这个名字是很费解。”大牛摆出专业知识,“在Java开发中,IoC意味着将你设计好的类交给系统去控制,而不是在你的类内部控制。这就是为什么它被称为控制反转。不过Martin Fowler大师给IoC起了一个更为直观的名字:依赖注入DI(Dependency Injection)。”
“依赖注入?怎么理解?”小鸟还是很困惑。
“小鸟啊,我问你个小问题,你感冒了要输液,是自己打针啊,还是请护士帮你打针。”大牛开始启发小鸟。
“那肯定是让护士帮忙打针啊,自己打针容易打错地方,太麻烦。”,大牛开始点头,“哎,不过一般给我打针的护士都不好看,长的太IT了,下次……”小鸟似乎很有感触。
“好了,回到正题。JAVA中A类的方法调用B类的方法(一般B类在A类中做属性),就说A依赖B,你以前要想调用A类中这样的方法,你会怎么做?”大牛认真道。
“恩,我会在代码中先产生B类的实例,再用构造器或者set器把对象传给A。保证A类的实例在调用方法之前,B类属性是有值的。”小鸟不敢马虎。
“非常好,但如果像这样的依赖关系很多,如A类还依赖C,D,E类,C类又依赖F,G类等。那你的工作量……”大牛打住。
“太大太繁琐了!”小鸟自己吼道。
“好啊,我们小鸟蛮有悟性嘛,都学会抢答了。我们再打个比方,如果你要寻找另一半……”大牛接道。
“咿呀,有合适的吗,牛哥?你知道我品味高,我要小鸟依人型,不喜欢大鹏展翅型,我要她会洗衣服会做饭,会撒娇还会浪漫……”小鸟显得很兴奋。
“扯淡。这样的女孩子让你自己去找,你找的到?”大牛望着一脸激动的小鸟,很是不屑。
“但你想想,如果你爸妈都帮你找好了,那是多美地事啊!”大牛知道小鸟好这口,接着启发他。
“哦,牛哥,我知道你意思了。你是说传统的方式就是我自己主动去寻找女孩,而IOC就是我被动地接受。我依赖的女孩,爸妈都帮我物色好直接给我。”小鸟恍然大悟。
“对啊,说白了以前我们写代码就是自由恋爱,有了IOC,就成了包办婚姻了。”
“哈哈,父母之命,媒妁之言。哎呀,牛哥,你这牛头啥构造,这你都想的出来。难怪Spring的口号是Do not call me, I will call you! 我彻底明白了。太妙了,我这就去写代码。”小鸟激动不已。一个小时后,小鸟拿出了成果。见代码:
男孩:
package com.softeem.spring.service;
public class Boy {
private String name;
private Girl girl;
public void setName(String name) {
this.name = name;
}
public void setGirl(Girl girl) {
this.girl = girl;
}
/**
* 寻找另一半
*/
public void findAnother() {
System.out.println(name + "找到了" + girl.getName());
}
}
女孩:
package com.softeem.spring.service;
public class Girl {
private String name;
public Girl(String name) {
this.name = name;
}
public String getName() {
return "符合条件的老婆:" + name + "!";
}
}
Spring.xml放在src(classpath)下
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN"
"http://www.springframework.org/dtd/spring-beans-2.0.dtd">
<beans>
<bean id="boy" class="com.softeem.spring.service.Boy">
<property name="name"><!-- set方式注入依赖 -->
<value>小鸟</value>
</property>
<property name="girl">
<ref bean="girl" />
</property>
</bean>
<bean id="girl" class="com.softeem.spring.service.Girl">
<constructor-arg><!-- 构造器方式注入依赖 -->
<value>晶晶</value>
</constructor-arg>
</bean>
</beans>
测试,记得将spring.jar包导入到工程
package com.softeem.spring.service;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestService {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext(
"spring.xml");
Boy boy = (Boy) context.getBean("boy");
Boy.findAnother();
}
}
“牛哥,你看,我通过Spring中的配置文件配置Boy和Girl两个对象以及他们之间的关系,再用IOC容器去管理它们。这样我从容器中取得一个boy小鸟的时候,他所依赖的老婆晶晶就有了。哈哈,这要是真的就好了。”
“恩,小鸟进步很快啊。”大牛大赞小鸟。
“那你赶紧教我AOP吧,我都等不及了。”小鸟兴致勃勃。
“口有点渴了,跟我买杯奶茶先。”大牛就是大牛。
一阵旋风,奶茶到。
“你先把IOC巩固好,接着把AOP预习一下,有了基础。我明天再教你AOP。”大牛接到老婆电话,命他火速回去洗碗。
一阵旋风,大牛闪人。
来源:http://blog.youkuaiyun.com/lenotang/archive/2008/07/02/2606541.aspx
一天, 小鸟在路上郁闷地唱着歌:“我是一只小小小小鸟,想学Spring却怎么也学不好……”,突然遇到刚发工资的大牛,欣喜若狂。
“牛哥,碰到你太好了,我们新项目要用Spring,看了几天书,可我还是没通。”
“呵呵,客气了不是,叫啥牛哥。牛顿姓牛,牛魔王也姓牛,你就叫我阿牛吧!”,大牛心情大好。
小鸟:“好的,牛哥。没问题,牛哥。”
大牛:“#¥%¥#¥%&”
小鸟:“牛哥,你说Spring咋就这么难学啊,莫非我跟它无缘?!”
大牛:“恩,非也。缘由心生,不管什么技术,你要先知道它的好处,对它产生强烈的兴趣,然后才会用心征服它。”
小鸟:“这个我明白,找女朋友就是这样的技术。”
大牛:“#¥%¥#¥%&”
“看了几天书,你自己如何理解Spring,觉得Spring又难在哪里呢?”大牛点上支烟,悠悠地问道。
“从概念上讲,Spring是一个轻量级的非侵入式的基于控制反转(IOC)和面向切面(AOP)的容器框架。轻量级嘛,是说它的体积和处理开销都小。非侵入式是说Spring应用中的对象不依赖于Spring的特定类。而且,Spring允许通过名称创建和检索对象,也可以管理对象的生命周期和对象之间的关系,所以它是个容器。它又提供了很多基础功能如事务管理、持久化框架集成等,将应用逻辑的开发留给我们,这就是典型的框架了。吼吼,我说的没错吧。”小鸟得意洋洋。
“恩,非常好,接着说。”大牛很满意。
“我了解的就差不多这些了。”小鸟黯然道。
“IOC,书上说叫控制反转,我差点被它弄反转了,还是不能理解。而AOP更是捉摸不透。”
“哈哈,其实IOC这个概念按照这个名字是很费解。”大牛摆出专业知识,“在Java开发中,IoC意味着将你设计好的类交给系统去控制,而不是在你的类内部控制。这就是为什么它被称为控制反转。不过Martin Fowler大师给IoC起了一个更为直观的名字:依赖注入DI(Dependency Injection)。”
“依赖注入?怎么理解?”小鸟还是很困惑。
“小鸟啊,我问你个小问题,你感冒了要输液,是自己打针啊,还是请护士帮你打针。”大牛开始启发小鸟。
“那肯定是让护士帮忙打针啊,自己打针容易打错地方,太麻烦。”,大牛开始点头,“哎,不过一般给我打针的护士都不好看,长的太IT了,下次……”小鸟似乎很有感触。
“好了,回到正题。JAVA中A类的方法调用B类的方法(一般B类在A类中做属性),就说A依赖B,你以前要想调用A类中这样的方法,你会怎么做?”大牛认真道。
“恩,我会在代码中先产生B类的实例,再用构造器或者set器把对象传给A。保证A类的实例在调用方法之前,B类属性是有值的。”小鸟不敢马虎。
“非常好,但如果像这样的依赖关系很多,如A类还依赖C,D,E类,C类又依赖F,G类等。那你的工作量……”大牛打住。
“太大太繁琐了!”小鸟自己吼道。
“好啊,我们小鸟蛮有悟性嘛,都学会抢答了。我们再打个比方,如果你要寻找另一半……”大牛接道。
“咿呀,有合适的吗,牛哥?你知道我品味高,我要小鸟依人型,不喜欢大鹏展翅型,我要她会洗衣服会做饭,会撒娇还会浪漫……”小鸟显得很兴奋。
“扯淡。这样的女孩子让你自己去找,你找的到?”大牛望着一脸激动的小鸟,很是不屑。
“但你想想,如果你爸妈都帮你找好了,那是多美地事啊!”大牛知道小鸟好这口,接着启发他。
“哦,牛哥,我知道你意思了。你是说传统的方式就是我自己主动去寻找女孩,而IOC就是我被动地接受。我依赖的女孩,爸妈都帮我物色好直接给我。”小鸟恍然大悟。
“对啊,说白了以前我们写代码就是自由恋爱,有了IOC,就成了包办婚姻了。”
“哈哈,父母之命,媒妁之言。哎呀,牛哥,你这牛头啥构造,这你都想的出来。难怪Spring的口号是Do not call me, I will call you! 我彻底明白了。太妙了,我这就去写代码。”小鸟激动不已。一个小时后,小鸟拿出了成果。见代码:
男孩:
package com.softeem.spring.service;
public class Boy {
private String name;
private Girl girl;
public void setName(String name) {
this.name = name;
}
public void setGirl(Girl girl) {
this.girl = girl;
}
/**
* 寻找另一半
*/
public void findAnother() {
System.out.println(name + "找到了" + girl.getName());
}
}
女孩:
package com.softeem.spring.service;
public class Girl {
private String name;
public Girl(String name) {
this.name = name;
}
public String getName() {
return "符合条件的老婆:" + name + "!";
}
}
Spring.xml放在src(classpath)下
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN"
"http://www.springframework.org/dtd/spring-beans-2.0.dtd">
<beans>
<bean id="boy" class="com.softeem.spring.service.Boy">
<property name="name"><!-- set方式注入依赖 -->
<value>小鸟</value>
</property>
<property name="girl">
<ref bean="girl" />
</property>
</bean>
<bean id="girl" class="com.softeem.spring.service.Girl">
<constructor-arg><!-- 构造器方式注入依赖 -->
<value>晶晶</value>
</constructor-arg>
</bean>
</beans>
测试,记得将spring.jar包导入到工程
package com.softeem.spring.service;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestService {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext(
"spring.xml");
Boy boy = (Boy) context.getBean("boy");
Boy.findAnother();
}
}
“牛哥,你看,我通过Spring中的配置文件配置Boy和Girl两个对象以及他们之间的关系,再用IOC容器去管理它们。这样我从容器中取得一个boy小鸟的时候,他所依赖的老婆晶晶就有了。哈哈,这要是真的就好了。”
“恩,小鸟进步很快啊。”大牛大赞小鸟。
“那你赶紧教我AOP吧,我都等不及了。”小鸟兴致勃勃。
“口有点渴了,跟我买杯奶茶先。”大牛就是大牛。
一阵旋风,奶茶到。
“你先把IOC巩固好,接着把AOP预习一下,有了基础。我明天再教你AOP。”大牛接到老婆电话,命他火速回去洗碗。
一阵旋风,大牛闪人。
来源:http://blog.youkuaiyun.com/lenotang/archive/2008/07/02/2606541.aspx