解决构选不确定问题,使用spring3注解
更多文章
package com.mcnz.spring;
public class GameSummary {
?
? private String clientChoice, serverChoice, result;
?private java.util.Date date = null;
?
? String[] choices = {"rock", "paper", "scissors"};
?String[] results = {"win", "lose", "tie"};
?
? public GameSummary(){}
?
? public String getClientChoice() { return clientChoice; }
?public void setClientChoice(String clientChoice) {
?? this.clientChoice = clientChoice;?
?}
?public String getServerChoice() { return serverChoice; }?
?public void setServerChoice(String serverChoice) {
?? this.serverChoice = serverChoice;
?
? }
?public String getResult() { return result; }
?
? public void setResult(String result) {
?? this.result = result;
?}?
?public java.util.Date getDate() { return date; }
?public void setDate(java.util.Date date) {
?? this.date = date;
?}
?public String toString() {
?? return clientChoice +????????????????????????????????????
???? ":" + serverChoice +
?????? ":" + result + ":" + date;
?}
}
package com.mcnz.spring;
import org.springframework.context.annotation.*;
@Configuration
public class SummaryConfig {?
?@Bean
?public GameSummary clientWinsWithPaper() {
?? GameSummary gs = new GameSummary();
?
??? gs.setClientChoice("paper");
??? gs.setServerChoice("rock");
??? gs.setResult("win");
?
??? return gs;
?}
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
?<bean id="clientWinsWithPaper" >
???<property name="clientChoice" value="paper"/>
???<property name="serverChoice" value="rock"/>
???<property name="result" value="win"/>
???</bean>
</beans>
如果您的环境设置正确,你可以运行这两个例子,即弹簧使用XML,春天,在相同的XML没有独立的应用程序。它看起来像这样:
?
package com.mcnz.spring;
?
?import org.springframework.beans.factory.BeanFactory;
?
?import org.springframework.beans.factory.xml.XmlBeanFactory;
?
?import org.springframework.context.annotation.AnnotationConfigApplicationContext;
?
?import org.springframework.core.io.*;
?
?public class SumRunner {
?
?public static void main(String args[]){
?
?/* Spring IoC Without XML */
?
?AnnotationConfigApplicationContext context
?
?= new AnnotationConfigApplicationContext(SummaryConfig.class);
?
?GameSummary gsA
?
?= context.getBean("clientWinsWithPaper", GameSummary.class);
?
?/* Spring IoC with XML */
?
?Resource resource = new ClassPathResource("summary.xml");
?
?BeanFactory beanFactory = new XmlBeanFactory(resource);
?
?GameSummary gsX
?
?= (GameSummary)beanFactory.getBean("clientWinsWithPaper");
?
?System.out.println(gsA);
?
?System.out.println(gsX);
?
?}
?
?}
?
?public GameSummary(String c, String s){
?
?clientChoice = c;
?
?serverChoice = s;
?
?/* result = ???; */
?
?}
?
使等效构造函数调用使用XML,您需要使用元素,并通过在constructor - arg你初始化数据通过value属性。你实际上并不需要指定参数类型,春天会去找到一个最佳匹配的构造函数,参数提供。这是它的样子:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<bean id="clientWinsWithPaper" >
<constructor-arg value="rock"/>
<constructor-arg value="paper"/>
</bean>
</beans>
虽然配置细节在Spring容器已经改变,客户端代码引用不会,所以你可以继续并重新运行SumRunner类。这一次,输出将反映事实和serverGesture clientGesture都被初始化为非空值。?
paper:rock:null:null
String[] results = { "win", "lose", "tie" };
public GameSummary(int c, int r) {
?clientChoice = choices[c];
?result = results[c];
}
与构造函数代码,我将添加一个新的方法@ configuration类,给出一种GameSummary实例,表明客户端获得对选择“摇滚。“真的,代码为这个新clientWinsWithRock方法不能更简单
@Bean
public GameSummary clientWinsWithRock() {
GameSummary gs = new GameSummary(0, 1);
return gs ;
}
然而,事情变得更复杂的XML文件。如果有人仅仅添加以下进入他们的Spring配置文件,您最终将得到一些非常有bug的代码:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<bean id="clientWinsWithPaper" >
<constructor-arg value="rock"/>
<constructor-arg value="paper"/>
</bean>
<bean id="clientWinsWithRock" >
<constructor-arg value="0"/>
<constructor-arg value="1"/>
</bean>
</beans>
如果你调整你的SumRunner把clientWithRock实例的两个注释和XML配置Spring容器,然后跑你的代码,你可能会得到以下错误的结果:
rock:null:win:null
0:1:null:null
现在,有一个简单的解决这个问题。所有您需要做的就是进入你的XML文件并添加类型属性的constructor - arg元素。当然,这是简单的如果你完全理解问题,是一个专家在春天,总是知道去哪里在XML配置文件,它推动超过一千豆条目。注意,这不是一个错误,要么在编译时间或在运行时。这只是一个普通的旧bug,它不是一个缺陷在春天。这是一个错误
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<bean id="clientWinsWithPaper" >
<constructor-arg?type="java.lang.String"?value="rock"/>
<constructor-arg?type="java.lang.String"?value="paper"/>
</bean>
<bean id="clientWinsWithRock" >
<constructor-arg?type="int"?value="0" />
<constructor-arg?type="int"?value="1"/>
</bean>
</beans>
rock:null:win:null
rock:null:win:null
现在,有一件事来强调这是是多么简单写一些Java代码调用适当的构造函数,而不是bug拉登路径使用XML。当然,我们的错误是由于缺乏了解的问题域,都是如何工作的,所以我们真的春天都怨不得别人,只能怪自己。当然,我们解决了这个问题,但仍然,想象这是一个大项目。要多长时间重新编译您的工作区,重新运行您的测试套件,文档bug,然后res吗
?
?
?
?