Java/Spring/XmlBeanFactory
Содержание
BeanFactoryAware and BeanAware
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();
}
}
}
Create XmlBeanFactory from ClassPathResource
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.");
}
}
}
FactoryObject Integration
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>
<!--(1) -->
<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());
}
}
Spring factory method
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);
}
}
XmlBeanFactory Demo
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;
}
}