Spring中IoC的入门实例
当前位置:以往代写 > JAVA 教程 >Spring中IoC的入门实例
2019-06-14

Spring中IoC的入门实例

Spring中IoC的入门实例

副标题#e#

Spring的模块化是很强的,各个成果模块都是独立的,我们可以选择的利用。这一章先从Spring的IoC开始。所谓IoC就是一个用XML来界说生成工具的模式,我们看看假如来利用的。

数据模子

1、如下图所示有三个类,Human(人类)是接口,Chinese(中国人)是一个子类,American(美国人)是别的一个子类。

Spring中IoC的入门实例

源代码如下:

package cn.com.chengang.spring;
public interface Human {
void eat();
void walk();
}
package cn.com.chengang.spring;
public class Chinese implements Human {
/* (非 Javadoc)
* @see cn.com.chengang.spring.Human#eat()
*/
public void eat() {
System.out.println("中国人对吃很有一套");
}
/* (非 Javadoc)
* @see cn.com.chengang.spring.Human#walk()
*/
public void walk() {
System.out.println("中国人行如飞");
}
}
package cn.com.chengang.spring;
public class American implements Human {
/* (非 Javadoc)
* @see cn.com.chengang.spring.Human#eat()
*/
public void eat() {
System.out.println("美国人主要以面包为主");
}
/* (非 Javadoc)
* @see cn.com.chengang.spring.Human#walk()
*/
public void walk() {
System.out.println("美国人以车代步,有四肢退化的趋势");
}
}


#p#副标题#e#

2、对以上工具回收工场模式的用法如下

建设一个工场类Factory,如下。这个工场类里界说了两个字符串常量,所标识差异的人种。getHuman要领按照传入参数的字串,来判定要生成什么样的人种。

package cn.com.chengang.spring;
public class Factory {
public final static String CHINESE = "Chinese";
public final static String AMERICAN = "American";
public Human getHuman(String ethnic) {
if (ethnic.equals(CHINESE))
return new Chinese();
else if (ethnic.equals(AMERICAN))
return new American();
else
throw new IllegalArgumentException("参数(人种)错误");
}
}

下面是一个测试的措施,利用工场要领来获得了差异的“人种工具”,并执行相应的要领。

package cn.com.chengang.spring;
public class ClientTest {
public static void main(String[] args) {
Human human = null;
human = new Factory().getHuman(Factory.CHINESE);
human.eat();
human.walk();
human = new Factory().getHuman(Factory.AMERICAN);
human.eat();
human.walk();
}
}

节制台的打印功效如下:

Spring中IoC的入门实例

#p#副标题#e#

3、回收Spring的IoC的用法如下:

在项目根目次下建设一个bean.xml文件

<?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="Chinese" class="cn.com.chengang.spring.Chinese"/>
<bean id="American" class="cn.com.chengang.spring.American"/>
</beans>

bean.xml的位置如下图,留意不要看花眼把它当作是lib目次下的了,它是在myspring目次下的。

Spring中IoC的入门实例

修改ClientTest措施如下:

package cn.com.chengang.spring;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
public class ClientTest {
public final static String CHINESE = "Chinese";
public final static String AMERICAN = "American";
public static void main(String[] args) {
// Human human = null;
// human = new Factory().getHuman(Factory.CHINESE);
// human.eat();
// human.walk();
// human = new Factory().getHuman(Factory.AMERICAN);
// human.eat();
// human.walk();
ApplicationContext ctx = new FileSystemXmlApplicationContext("bean.xml");
Human human = null;
human = (Human) ctx.getBean(CHINESE);
human.eat();
human.walk();
human = (Human) ctx.getBean(AMERICAN);
human.eat();
human.walk();
}
}

从这个措施可以看到,ctx就相当于本来的Factory工场,本来的Factory就可以删除去了。然后又把Factory里的两个常量移到了ClientTest类里,整个措施布局根基一样。

再转头看本来的bean.xml文件的这一句:

<bean id="Chinese" class="cn.com.chengang.spring.Chinese"/>

id就是ctx.getBean的参数值,一个字符串。class就是一个类(包名+类名)。然后在ClientTest类里得到Chinese工具就是这么一句

human = (Human) ctx.getBean(CHINESE);

因为getBean要领返回的是Object范例,所以前面要加一个范例转换。

#p#副标题#e#

总结

(1)也许有人说,IoC和工场模式不是一样的浸染吗,用IoC好象还贫苦一点。

#p#分页标题#e#

举个例子,假如用户需求产生变革,要把Chinese类修改一下。那么前一种工场模式,就要变动Factory类的要领,而且从头编译布署。而IoC只需要将class属性改变一下,而且由于IoC操作了Java反射机制,这些工具是动态生成的,这时我们就可以热插拨Chinese工具(不必把原措施遏制下来从头编译布署)

(2)也许有人说,即然IoC这么好,那么我把系统所有工具都用IoC方法来生成。

留意,IoC的机动性是有价钱的:配置步调贫苦、生成工具的方法不直观、反射比正常生成工具在效率上慢一点。因此利用IoC要看有没有须要,我认为较量通用的判定方法是:用到工场模式的处所都可以思量用IoC模式。

(3)在上面的IoC的方法里,尚有一些可以变革的处所。好比,bean.xml不必然要放在项目次下,也可以放在其他处所,好比cn.com.chengang.spring包里。不外在利用时也要变革一下,如下所示:

new FileSystemXmlApplicationContext("src/cn/com/chengang/spring/bean.xml");

别的,bean.xml也可以改成其他名字。这样我们在系统中就可以分门别类的配置差异的bean.xml。

(4)关于IoC的低侵入性。

什么是低侵入性?假如你用过Struts或EJB就会发明,要担任一些接口或类,才气操作它们的框架开拓。这样,系统就被绑定在Struts、EJB上了,对系统的可移植性发生倒霉的影响。假如代码中很少涉及某一个框架的代码,那么这个框架就可以称做是一个低侵入性的框架。

Spring的侵入性很低,Humen.java、Chinese.java等几个类都不必担任什么接口或类。但在ClientTest里照旧有一些Spring的影子:FileSystemXmlApplicationContext类和ctx.getBean方法等。

此刻,低侵入性好像也成了鉴定一个框架的实现技能优劣的尺度之一。

(5)关于bean.xml的用法

bean.xml的用法尚有许多,个中内容是相当富厚的。假设Chinese类里有一个humenName属性(姓名),那么原的bean.xml修改如下。从此生成Chinese工具时,“陈刚”这个值将自动配置到Chinese类的humenName属性中。并且由于singleton为true这时生成Chinese工具将回收单例模式,系统仅存在一个Chinese工具实例。

<?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="Chinese" class="cn.com.chengang.spring.Chinese" singleton="true">
<property name="humenName">
<value>陈刚</value>
</property>
</bean>
<bean id="American" class="cn.com.chengang.spring.American"/>
</beans>

关于bean.xml的其它用法,不再具体先容了,各人本身拿Spring的文档一看就大白了。

    关键字:

在线提交作业