Java/Spring/XmlBeanFactory
Содержание
BeanFactoryAware and BeanAware
<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="logging" class="LoggingBean"/> <bean class="ShutdownHookBean"/>
</beans>
File: Main.java import org.springframework.beans.BeansException; import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.BeanFactoryAware; import org.springframework.beans.factory.BeanNameAware; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.beans.factory.support.DefaultListableBeanFactory; import org.springframework.beans.factory.xml.XmlBeanFactory; import org.springframework.core.io.ClassPathResource; public class Main {
public static void main(String[] args) throws Exception { XmlBeanFactory factory = new XmlBeanFactory(new ClassPathResource( "context.xml")); factory.preInstantiateSingletons(); LoggingBean lb = (LoggingBean) factory.getBean("logging"); lb.run(); }
} class LoggingBean implements BeanNameAware {
private String name; public void setBeanName(String name) { this.name = name; } public void run() { System.out.println("Bean name is"" + this.name + ""."); }
} class ShutdownHookBean implements BeanFactoryAware, Runnable {
private ConfigurableListableBeanFactory beanFactory; public void setBeanFactory(BeanFactory beanFactory) throws BeansException { if (beanFactory instanceof DefaultListableBeanFactory) { this.beanFactory = (ConfigurableListableBeanFactory)beanFactory; Runtime.getRuntime().addShutdownHook(new Thread(this)); } } public void run() { if (this.beanFactory != null) { System.out.println("Destroying singletons."); this.beanFactory.destroySingletons(); } }
}
</source>
Create XmlBeanFactory from ClassPathResource
<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="nameClass" class="InitializingBeanNameClass"/>
</beans>
File: Main.java import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.InitializingBean; 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")); InitializingBeanNameClass nameClass = (InitializingBeanNameClass) beanFactory .getBean("nameClass"); System.out.println(nameClass.getFirstName()); }
} class InitializingBeanNameClass implements InitializingBean {
private String firstName; public String getFirstName() { return this.firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } public void afterPropertiesSet() throws Exception { if (this.firstName == null) { throw new Exception("firstName property is required."); } }
}
</source>
FactoryObject Integration
<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="socketFactory" class="javax.net.SocketFactory" factory-method="getDefault"> </bean> <bean id="localhost" factory-bean="socketFactory" factory-method="createSocket"> <constructor-arg value="localhost"/> <constructor-arg value="80"/> </bean> <bean id="jexp.ru" factory-bean="socketFactory" factory-method="createSocket"> <constructor-arg value="www.jexp.ru"/> <constructor-arg value="80"/> </bean>
</beans>
File: Main.java import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.beans.factory.xml.XmlBeanFactory; import org.springframework.core.io.ClassPathResource; public class Main {
public static void main(String[] args) throws Exception { ConfigurableListableBeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource( "context.xml")); java.net.Socket localhost = (java.net.Socket) beanFactory.getBean("localhost"); java.net.Socket apressDotCom = (java.net.Socket) beanFactory.getBean("jexp.ru"); System.out.println(localhost.isConnected()); System.out.println(apressDotCom.isConnected()); }
}
</source>
Spring factory method
<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="pattern" class="java.util.regex.Pattern" factory-method="compile"> <constructor-arg value="abc"/> </bean>
</beans>
File: Main.java import java.util.regex.Matcher; import java.util.regex.Pattern; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.beans.factory.xml.XmlBeanFactory; import org.springframework.core.io.ClassPathResource; public class Main {
public static void main(String[] args) throws Exception { ConfigurableListableBeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource( "context.xml")); Pattern pattern = (Pattern) beanFactory.getBean("pattern"); Matcher matcher = pattern.matcher("abc abc abc"); int matchCount = 0; while (matcher.find()) { matchCount++; } System.out.println(matchCount); }
}
</source>
XmlBeanFactory 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="simple1" class="SoutSimpleBean"> <property name="person" value="A"/> <property name="value" value="my value"/> </bean>
</beans>
File: Main.java import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.xml.XmlBeanFactory; import org.springframework.core.io.ClassPathResource; public class Main {
public static void main(String[] args) throws Exception { XmlBeanFactory factory = new XmlBeanFactory(new ClassPathResource("context.xml")); System.out.println(factory.getBean("simple1")); }
} class SoutSimpleBean extends SimpleBeanSupport {
private String person; public void setPerson(String person) { this.person = person; } @Override public String toString() { return String.format("%s : \"%s\"", this.person, getValue()); }
} abstract class SimpleBeanSupport implements InitializingBean {
private String value; public final void afterPropertiesSet() throws Exception { } public final void setValue(String value) { this.value = value; } protected final String getValue() { return this.value; }
}
</source>