分享
 
 
 

快速上手Spring--2.HelloWorld(2)

王朝java/jsp·作者佚名  2006-01-31
窄屏简体版  字體: |||超大  

这是第二部分。

3. 采用“工厂模式”

· 新建一个包,包名:javamxj.spring.beginning2,在这个包下,新建一个“Hello”接口,这个接口含有一个方法。 Hello.java

package javamxj.spring.beginning2;

public interface Hello {

void sayHello();

}

· 分别新建两个类,实现这个接口。 HelloWorld.java

package javamxj.spring.beginning2;

public class HelloWorld implements Hello {

public void sayHello() {

System.out.println("Hello World!");

}

}

HelloJavamxj.java

package javamxj.spring.beginning2;

public class HelloJavamxj implements Hello {

public void sayHello() {

System.out.println("Hello, javamxj!");

}

}

· 建立一个工厂类,调用上面两个实现接口的子类。 HelloFactory.java

package javamxj.spring.beginning2;

public class HelloFactory {

public Hello getHello(String hello) {

if (hello.equals("world"))

return new HelloWorld();

else if (hello.equals("javamxj"))

return new HelloJavamxj();

else

throw new IllegalArgumentException("输入参数错误!");

}

}

· 最后,利用工厂类,测试一下。

Test.java

package javamxj.spring.beginning2;

public class Test {

public static void main(String[] args) {

Hello hello = null;

HelloFactory factory = new HelloFactory();

hello = factory.getHello("world");

hello.sayHello();

hello = factory.getHello("javamxj");

hello.sayHello();

}

}

运行Test,控制台输出如下语句:

Hello World!

Hello, javamxj!

4. Setter Injection

讲了这么多,似乎一点都不关Spring的事,别急,下面就看看用Spring是如何实现的。

· 新建一个包,包名:javamxj.spring.beginning3

· 在这个包下,新建一个HelloBean的类,这个类有一个属性:helloWorld属性,这个属性只是一个字符串。可以通过setHelloWorld方法设置这个属性,getHelloWorld方法得到这个属性。

HelloBean.java

package javamxj.spring.beginning3;

public class HelloBean {

private String helloWorld = "Hello!World!";

public void setHelloWorld(String helloWorld) {

this.helloWorld = helloWorld;

}

public String getHelloWorld() {

return helloWorld;

}

}

· 同样,在这个包下,建立一个XML文件,它是Spring配置文件。

bean.xml

<?xml version="1.0" encoding="GBK"?>

<!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN"

"http://www.springframework.org/dtd/spring-beans.dtd">

<beans>

<bean id="helloBean" class="javamxj.spring.beginning3.HelloBean">

<property name="helloWorld">

<value>Hello! Javamxj!</value>

</property>

</bean>

</beans>

Spring配置文件必须遵循spring-beans.dtd定义的内容模型。

这个XML文件在Spring容器中声明了一个HelloBean的实例,并且将它的helloWorld属性设置为“Hello! Javamxj!”。

分析这个XML文件,位于根部的是<beans>元素,它是任何Spring配置文件的根元素。<bean>元素用于告诉Spring容器一个类以及它是如何配置的。这里,id属性用于为Bean helloBean命名,而class属性指定了这个Bean的全限定类名。

在<bean>元素内,<property>元素用于设置一个属性,在本例中它是helloWorld属性。通过使用<property>,我们告诉Spring容器当设置这个属性时调用setHelloWorld方法。greeting属性的值定义在<value>元素内。在这里我设置为“Hello! Javamxj!”。

bean.xml必须在您的CLASSPATH可以存取到的目录中。

· 新建Main.java,测试一下。

Main.java

package javamxj.spring.beginning3;

import org.springframework.beans.factory.BeanFactory;

import org.springframework.beans.factory.xml.XmlBeanFactory;

import org.springframework.core.io.ClassPathResource;

import org.springframework.core.io.Resource;

public class Main {

public static void main(String[] args) {

// 直接调用HelloBean

HelloBean helloBean = new HelloBean();

System.out.println(helloBean.getHelloWorld());

// 利用Spring调用HelloBean

Resource res = new ClassPathResource("javamxj/spring/beginning3/bean.xml");

BeanFactory factory = new XmlBeanFactory(res);

helloBean = (HelloBean) factory.getBean("helloBean");

System.out.println(helloBean.getHelloWorld());

}

}

这里使用的BeanFactory类就是Spring容器。在将hello.xml文件装入容器后,main方法调用BeanFactory的getBean方法检索出了helloBean服务的一个引用。通过这个引用,它调用了getHelloWorld方法。当我们运行这个Hello应用时,它会打印出“Hello! Javamxj!”。

· 另外,为了更好的调试程序,了解运行机理,建立一个log4j.properties,放在src目录下。

src/log4j.properties

log4j.rootLogger=warn, stdout

log4j.appender.stdout=org.apache.log4j.ConsoleAppender

log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

log4j.appender.stdout.layout.ConversionPattern=%c{1} - %m%n

5. Constructor Injection

· 新建一个包,包名:javamxj.spring.beginning3

· 新建一个HelloBean.java文件,可以与Setter Injection中的HelloBean比较一下,注意是通过Constructor设置helloWorld属性值的。

HelloBean.java

package javamxj.spring.beginning4;

public class HelloBean {

private String helloWorld;

public HelloBean(String helloWorld) {

this.helloWorld = helloWorld;

}

public void sayHello() {

System.out.println(helloWorld);

}

}

· 同样,在这个包下,也需要一个Spring配置文件。

bean.xml

<?xml version="1.0" encoding="GBK"?>

<!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN"

"http://www.springframework.org/dtd/spring-beans.dtd">

<beans>

<bean id="helloBean" class="javamxj.spring.beginning4.HelloBean">

<constructor-arg>

<value>Hello! Javamxj!</value>

</constructor-arg>

</bean>

</beans>

这里通过<constructor-arg>来表示将使用 constructor injection。如果constructor的参数不只一个,那么需要利用index属性指定参数的位置索引,即<constructor-arg index="索引值">,索引值从0开始。

· 测试一下。

Main.java

package javamxj.spring.beginning4;

import org.springframework.beans.factory.BeanFactory;

import org.springframework.beans.factory.xml.XmlBeanFactory;

import org.springframework.core.io.ClassPathResource;

import org.springframework.core.io.Resource;

public class Main {

public static void main(String[] args) {

Resource res = new ClassPathResource("javamxj/spring/beginning4/bean.xml");

BeanFactory factory = new XmlBeanFactory(res);

HelloBean helloBean = (HelloBean) factory.getBean("helloBean");

helloBean.sayHello();

}

}

这样,通过BeanFactory的getBean方法,以及xml配置文件,避免了在Main类中直接实例化HelloBean,消除了应用程序(Main)与服务(HelloBean)之间的耦合,实现了IOC(控制反转)或者说实现了依赖的注射(Dependency Injection)。

Setter Injection和Constructor Injection都有自己的长处和不足。至于,是选择Setter Injection,还是选择Constructor Injection?在《Spring in Action》、《Inversion of Control Containers and the Dependency Injection pattern》和《Spring开发指南》都有比较详细的论述,这里就不多说了。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有