Java/Spring/Constructor Injection
Содержание
Call Constructor
<source lang="java">
File: context.xml <?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:util="http://www.springframework.org/schema/util" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd"> <bean id="encyclopedia" name="knowitall" class="ConfigurableEncyclopedia"> <constructor-arg> <util:map> <entry key="AgeOfUniverse" value="13700000000"/> <entry key="ConstantOfLife" value="326190476"/> </util:map> </constructor-arg> </bean> <bean id="oracle" class="BookwormOracle"> <property name="encyclopedia" ref="knowitall"/> </bean>
</beans>
File: Main.java import java.util.Map; import org.springframework.beans.factory.xml.XmlBeanFactory; import org.springframework.core.io.ClassPathResource; import org.springframework.util.Assert; public class Main {
public static void main(String[] a) { XmlBeanFactory bf = new XmlBeanFactory(new ClassPathResource("context.xml")); Oracle oracle = (Oracle) bf.getBean("oracle"); System.out.println("Meaning of life is " + oracle.defineMeaningOfLife()); }
} interface Oracle {
String defineMeaningOfLife();
} interface Encyclopedia {
Long findLong(String entry);
} class BookwormOracle implements Oracle {
private Encyclopedia encyclopedia; public String defineMeaningOfLife() { Long ageOfUniverse = this.encyclopedia.findLong("AgeOfUniverse"); Long constantOfLife = this.encyclopedia.findLong("ConstantOfLife"); return String.valueOf(ageOfUniverse / constantOfLife); } public void setEncyclopedia(Encyclopedia encyclopedia) { this.encyclopedia = encyclopedia; }
} class ConfigurableEncyclopedia implements Encyclopedia {
private Map<String, Long> entries; public ConfigurableEncyclopedia(Map<String, Long> entries) { Assert.notNull(entries, "The "entries" argument cannot be null."); this.entries = entries; } public Long findLong(String entry) { return this.entries.get(entry); }
}
</source>
Constructor Argument And Local Reference
<source lang="java">
File: context.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="RangeService" class="RangeServiceImpl"> <constructor-arg> <ref local="RangeDao"/> </constructor-arg> </bean> <bean id="RangeDao" class="StaticDataRangeDaoImpl"> </bean>
</beans>
File: Main.java import java.util.Date; import java.util.GregorianCalendar; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; class Main {
public static void main(String args[]) throws Exception { ApplicationContext ctx = new ClassPathXmlApplicationContext("context.xml"); RangeService ws = (RangeService) ctx.getBean("RangeService"); Double high = ws.getHistoricalHigh(new GregorianCalendar(2004, 0, 1).getTime()); System.out.println("High was: " + high); }
} interface RangeService {
Double getHistoricalHigh(Date date);
} class RangeServiceImpl implements RangeService {
RangeDao RangeDao; public RangeServiceImpl(RangeDao RangeDao) { this.RangeDao = RangeDao; } public Double getHistoricalHigh(Date date) { RangeData wd = RangeDao.find(date); if (wd != null) return new Double(wd.getHigh()); return null; }
} class RangeData {
Date date; double low; double high; public Date getDate() { return date; } public void setDate(Date date) { this.date = date; } public double getLow() { return low; } public void setLow(double low) { this.low = low; } public double getHigh() { return high; } public void setHigh(double high) { this.high = high; }
} interface RangeDao {
RangeData find(Date date); RangeData save(Date date); RangeData update(Date date);
} class StaticDataRangeDaoImpl implements RangeDao {
public RangeData find(Date date) { RangeData wd = new RangeData(); wd.setDate((Date) date.clone()); wd.setLow(5); wd.setHigh(15); return wd; } public RangeData save(Date date) { return null; } public RangeData update(Date date) { return null; }
}
</source>
ConstructorCaller In ContextConfig
<source lang="java">
File: context.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="testBean" class="ConstructorTestBean"> <constructor-arg value="Steven Devijver"/>
<constructor-arg value="1" type="java.lang.Integer"/> </bean>
</beans>
File: Main.java import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.xml.XmlBeanFactory; import org.springframework.core.io.ClassPathResource; public class Main {
public static void main(String[] args) throws Exception { BeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource("context.xml")); ConstructorTestBean testBean = (ConstructorTestBean) beanFactory.getBean("testBean"); System.out.println(testBean.isConstructor1Used()); System.out.println(testBean.isConstructor2Used()); }
} class ConstructorTestBean {
private boolean constructor1Used = false; private boolean constructor2Used = false; public ConstructorTestBean(String name, Integer id) { this.constructor1Used = true; } public ConstructorTestBean(String firstName, String lastName) { this.constructor2Used = true; } public boolean isConstructor1Used() { return this.constructor1Used; } public boolean isConstructor2Used() { return this.constructor2Used; }
}
</source>
Constructor Confusion Demo
<source lang="java">
File: context.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="constructorConfusion" class="ConstructorConfusionDemo"> <constructor-arg value="1" type="int"/> </bean>
</beans>
File: Main.java import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.xml.XmlBeanFactory; import org.springframework.core.io.ClassPathResource; public class Main {
public static void main(String[] args) { BeanFactory factory = new XmlBeanFactory(new ClassPathResource( "context.xml")); ConstructorConfusionDemo cc = (ConstructorConfusionDemo) factory .getBean("constructorConfusion"); System.out.println(cc); }
} class ConstructorConfusionDemo {
private String someValue; public ConstructorConfusionDemo(String someValue) { System.out.println("ConstructorConfusionDemo(String) called"); this.someValue = someValue; } public ConstructorConfusionDemo(int someValue) { System.out.println("ConstructorConfusionDemo(int) called"); this.someValue = "Number: " + Integer.toString(someValue); } public String toString() { return someValue; }
}
</source>
SingletonScope And PrototypeScope
<source lang="java">
File: context.xml <?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:util="http://www.springframework.org/schema/util" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd"> <bean id="singleMe" class="java.lang.String" scope="singleton"> <constructor-arg type="java.lang.String" value="Singleton"/> </bean> <bean id="prototypeMe" class="java.lang.String" scope="prototype"> <constructor-arg type="java.lang.String" value="Prototype"/> </bean>
</beans>
File: Main.java import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.xml.XmlBeanFactory; import org.springframework.core.io.ClassPathResource; public class Main {
private static void compare(final BeanFactory factory, final String beanName) { String b1 = (String)factory.getBean(beanName); String b2 = (String)factory.getBean(beanName); System.out.println("Bean b1=" + b1 + ", b2=" + b2); System.out.println("Same? " + (b1 == b2)); System.out.println("Equal? " + (b1.equals(b2)));
} public static void main(String[] args) {
BeanFactory factory = new XmlBeanFactory( new ClassPathResource("context.xml")); compare(factory, "singleMe"); compare(factory, "prototypeMe"); compare(factory, "requestMe");
} }
</source>