http://mynote.iteye.com/admin/blogs/1174520
先看看上面这个简单工厂的例子:
spring的IOC类似于简单工厂,为客户端生成实例:将上面的简单工厂改为spring实现,如下:
Person接口
package com.test; public interface Person { public String sayHello(String name); public String sayGoodbye(String name); }
Chinese
package com.test; public class Chinese implements Person { public String sayGoodbye(String name) { return "再见! "+name; } public String sayHello(String name) { return "你好! "+name; } }
American
package com.test; public class American implements Person { public String sayGoodbye(String name) { return "GoodBye! "+name; } public String sayHello(String name) { return "Hello! "+name; } }
applicationContext.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="com.test.Chinese"/> <bean id="american" class="com.test.American"/> </beans>
测试类
package com.test; import org.springframework.beans.factory.xml.XmlBeanFactory; import org.springframework.core.io.ClassPathResource; public class Client { public static void main(String[] args) { ClassPathResource cpr = new ClassPathResource("applicationContext.xml"); XmlBeanFactory factory = new XmlBeanFactory(cpr); Chinese chinese = (Chinese) factory.getBean("chinese"); System.out.println(chinese.sayHello("lisi")); System.out.println(chinese.sayGoodbye("lisi")); } }
结果打印出:你好! lisi
再见! lisi
再看一个例子:
Person接口
package com.test; public interface Person { public void doWork(); }
Tool接口
package com.test; public interface Tool { public void doRealWork(); }
具体类:Chinese
package com.test; public class Chinese implements Person { private Tool tool; public void doWork() { tool.doRealWork(); } public Tool getTool() { return tool; } public void setTool(Tool tool) { this.tool = tool; } }
具体工具A
package com.test; public class ConcreteToolA implements Tool { public void doRealWork() { System.out.println("do concrete tool a"); } }
spring配置文件,可以看到在chinese的bean中引用了ConcreteToolA的实例
<bean id="toolA" class="com.test.ConcreteToolA"/> <bean id="chinese" class="com.test.Chinese"> <property name="tool" ref="toolA"/> </bean>
测试类
package com.test; import org.springframework.beans.factory.xml.XmlBeanFactory; import org.springframework.core.io.ClassPathResource; public class Client { public static void main(String[] args) { ClassPathResource cpr = new ClassPathResource("applicationContext.xml"); XmlBeanFactory factory = new XmlBeanFactory(cpr); Person person = (Person) factory.getBean("chinese"); person.doWork(); } }
打印结果:do concrete tool a
再看一个例子:可以spring配置文件中设置属性的值
GreetingService接口
package com.springinaction.chapter01; public interface GreetingService { public void sayGreeting(); }
具体实现类
package com.springinaction.chapter01; public class GreetingServiceImpl implements GreetingService { private String greeting; public void sayGreeting() { System.out.println(this.greeting); } public void setGreeting(String greeting) { this.greeting = greeting; } }
spring配置文件
<bean id="greetingService" class="com.springinaction.chapter01.GreetingServiceImpl"> <property name="greeting"> <value>lisi</value> </property> </bean>
测试类
package com.springinaction.chapter01; import org.springframework.context.ApplicationContext; import org.springframework.context.support.FileSystemXmlApplicationContext; public class HelloApp { public static void main(String[] args) { ApplicationContext context = new FileSystemXmlApplicationContext("applicationContext.xml"); GreetingService greetingService = (GreetingService) context.getBean("greetingService"); greetingService.sayGreeting(); } }
如果类中的属性是数组类型的该如何处理?看下例:
接口类
package com.test; public interface Person { public void test(); }
具体类Person,定义了很多集合类型
package com.test; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Properties; import java.util.Set; public class Chinese implements Person { private List schools = new ArrayList(); private Map score = new HashMap(); private Properties health = new Properties(); private Set tools = new HashSet(); public Map getScore() { return score; } public void setScore(Map score) { this.score = score; } public Properties getHealth() { return health; } public void setHealth(Properties health) { this.health = health; } public Set getTools() { return tools; } public void setTools(Set tools) { this.tools = tools; } public List getSchools() { return schools; } public void setSchools(List schools) { this.schools = schools; } public void test() { System.out.println(schools); System.out.println(score); System.out.println(health); System.out.println(tools); } }
在spring配置文件中赋值
<?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="toolA" class="com.test.ConcreteToolA"/> <bean id="chinese" class="com.test.Chinese"> <property name="schools"> <list> <value>小学</value> <value>中学</value> <value>大学</value> </list> </property> <property name="score"> <map> <entry key="数学"> <value>81</value> </entry> <entry key="英语"> <value>89</value> </entry> <entry key="语文"> <value>82</value> </entry> </map> </property> <property name="health"> <props> <prop key="血压">正常</prop> <prop key="身高">175</prop> </props> </property> <property name="tools"> <set> <value>字符串工具</value> <bean class="com.test.ConcreteToolA"></bean> <ref local="toolA"/> </set> </property> </bean> </beans>
测试类Client
package com.test; import org.springframework.beans.factory.xml.XmlBeanFactory; import org.springframework.core.io.ClassPathResource; public class Client { public static void main(String[] args) { ClassPathResource cpr = new ClassPathResource("applicationContext.xml"); XmlBeanFactory factory = new XmlBeanFactory(cpr); Person person = (Person) factory.getBean("chinese"); person.test(); } }
打印出的结果
[小学, 中学, 大学] {数学=81, 英语=89, 语文=82} {血压=正常, 身高=175} [字符串工具, com.test.ConcreteToolA@a1807c, com.test.ConcreteToolA@fa7e74]