Java/Spring/XML Bean
Содержание
- 1 Alias Bean Demo
- 2 Autowiring
- 3 Bean Lifecycle DisposableBean
- 4 Bean Lifecycle Initializing
- 5 Component Filter Assignable
- 6 component scan
- 7 Component Scan and scope
- 8 Custom InitializationMethod
- 9 dependency check Demo
- 10 destroy method
- 11 Filtered By Annotation
- 12 HierarchicalBeanFactory Demo
- 13 implements BeanNameAware
- 14 Inheritance Demo
- 15 Link With DataSource
- 16 Local Reference
- 17 Non Static Factory
- 18 Properties File Based Spring Bean
- 19 Reference another bean and set property
- 20 Serach By Base Package
- 21 Static Factory
- 22 throw RequiredPropertyNotSetException
- 23 XML Bean Injection
Alias Bean 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="name1" name="name2,name3,name4" class="java.lang.String"/> <alias name="name1" alias="namex1"/> <alias name="name1" alias="namex2"/>
</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[] a) { BeanFactory factory = new XmlBeanFactory(new ClassPathResource("context.xml")); String s1 = (String) factory.getBean("name1"); String s2 = (String) factory.getBean("name2"); String s3 = (String) factory.getBean("name3"); String s4 = (String) factory.getBean("name4"); String s5 = (String) factory.getBean("namex1"); String s6 = (String) factory.getBean("namex2"); System.out.println((s1 == s2)); System.out.println((s2 == s3)); System.out.println((s3 == s4)); System.out.println((s4 == s5)); System.out.println((s5 == s6)); }
}
</source>
Autowiring
<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="a" class="A"/> <bean id="b" class="B"/> <bean id="byName" autowire="byName" class="MyClass"/> <bean id="byType" autowire="byType" class="MyClass"/> <bean id="constructor" autowire="constructor" class="MyClass"/> <bean id="autodetect" autowire="autodetect" class="MyClass"/>
</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) { XmlBeanFactory bf = new XmlBeanFactory(new ClassPathResource("context.xml")); System.out.println("byName:"); System.out.println(bf.getBean("byName")); System.out.println("byType:"); System.out.println(bf.getBean("byType")); System.out.println("constructor:"); System.out.println(bf.getBean("constructor")); System.out.println("autodetect:"); System.out.println(bf.getBean("autodetect")); }
} class A {
@Override public String toString() { return getClass().getName(); }
} class B {
@Override public String toString() { return getClass().getName(); }
} class MyClass {
private B B; private B B2; private A A; public MyClass() { System.out.println("MyClass()"); } public MyClass(B B) { System.out.println("MyClass(B)"); this.B = B; } public MyClass(B B, A A) { System.out.println("MyClass(B, A)"); this.B = B; this.A = A; } public void setDependency(A A) { System.out.println("MyClass.setDependency(A)"); this.A = A; } public void setB(B B) { System.out.println("MyClass.setB(B)"); this.B = B; } public void setB2(B B2) { System.out.println("MyClass.setB2(B)"); this.B2 = B2; } public void setA(A A) { System.out.println("MyClass.setA(A)"); this.A = A; } @Override public String toString() { final StringBuilder sb = new StringBuilder(); sb.append("MyClass"); sb.append("{B=").append(B); sb.append(", B2=").append(B2); sb.append(", A=").append(A); sb.append("}"); return sb.toString(); }
}
</source>
Bean Lifecycle DisposableBean
<source lang="java">
File: Main.java import org.springframework.beans.factory.DisposableBean; import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; 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[] args) throws Exception { XmlBeanFactory factory = new XmlBeanFactory(new ClassPathResource("context.xml")); Runtime.getRuntime().addShutdownHook(new Thread(new ShutdownHook(factory))); }
} class ShutdownHook implements Runnable {
private ConfigurableListableBeanFactory beanFactory; public ShutdownHook(ConfigurableListableBeanFactory beanFactory) { Assert.notNull(beanFactory, "The "beanFactory" argument must not be null."); this.beanFactory = beanFactory; } public void run() { this.beanFactory.destroySingletons(); }
} class DestructiveBeanI implements InitializingBean, DisposableBean {
public void afterPropertiesSet() throws Exception { } public void destroy() { System.out.println("Destroying Bean"); } @Override public String toString() { final StringBuilder sb = new StringBuilder(); sb.append("DestructiveBean"); return sb.toString(); }
}
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="destructive" class="DestructiveBeanI"> <property name="filePath" value="/tmp"/> </bean>
</beans>
</source>
Bean Lifecycle Initializing
<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>
Component Filter Assignable
<source lang="java">
File: context.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context" 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 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <context:component-scan base-package="bean"> <context:include-filter type="annotation" expression="bean.Magic"/> <context:include-filter type="assignable" expression="bean.ruponentMarker"/> <context:include-filter type="aspectj" expression="* void bean.*Service*(..)"/> </context:component-scan>
</beans>
File: Main.java import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class Main {
public static void main(String[] args) throws Exception { ApplicationContext ac = new ClassPathXmlApplicationContext( "context.xml"); String[] beanNames = ac.getBeanDefinitionNames(); for (String beanName : beanNames) { System.out.println(beanName + ": " + ac.getBean(beanName)); } }
} File: Magic.java package bean;
public @interface Magic { }
File: MarkedBean.java package bean;
public class MarkedBean implements ComponentMarker {
@Override public String toString() { final StringBuilder sb = new StringBuilder(); sb.append("MarkedBean"); sb.append("{}"); return sb.toString(); }
}
File: SimpleBean.java package bean; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.ruponent; import org.springframework.util.ObjectUtils; /**
* @author janm */
@Magic class SimpleBean {
private Dependency dependency; @Autowired(required = true) public void setDependency(Dependency dependency) { this.dependency = dependency; } @Override public String toString() { final StringBuilder sb = new StringBuilder(); sb.append("SimpleBean"); sb.append(ObjectUtils.identityToString(this)); sb.append("{dependency=").append(dependency); sb.append("}"); return sb.toString(); }
} @Component class Dependency {
@Override public String toString() { final StringBuilder sb = new StringBuilder(); sb.append("Dependency"); sb.append(ObjectUtils.identityToString(this)); sb.append("{}"); return sb.toString(); }
}
File: ComponentMarker.java package bean;
public interface ComponentMarker { }
</source>
component scan
<source lang="java">
File: context.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" 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 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"> <aop:aspectj-autoproxy /> <context:component-scan base-package="bean"> <context:include-filter type="annotation" expression="org.aspectj.lang.annotation.Aspect"/> </context:component-scan>
</beans>
File: Main.java import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import bean.Helper; import bean.HelperDemo; public class Main {
public static void main(String[] args) throws Exception { ApplicationContext ac = new ClassPathXmlApplicationContext( "context.xml"); HelperDemo hd1 = (HelperDemo) ac.getBean("helperDemo"); hd1.someOperation(); System.out.println(hd1); HelperDemo hd2 = (HelperDemo) ac.getBean("helperDemo"); hd2.someOperation(); System.out.println(hd2); Helper helper = (Helper) ac.getBean("helper"); System.out.println(helper); }
} File: Helper.java package bean; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.ruponent; @Component("helper") @Scope(BeanDefinition.SCOPE_PROTOTYPE) public class Helper {
private int count; public void work() { this.count++; } @Override public String toString() { final StringBuilder sb = new StringBuilder(); sb.append("Helper"); sb.append("{count=").append(count); sb.append("}"); return sb.toString(); }
}
File: HelperDemo.java package bean;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.ruponent; @Component @Scope(BeanDefinition.SCOPE_PROTOTYPE) public class HelperDemo {
@Autowired private Helper helper; public void setHelper(Helper helper) { this.helper = helper; } public void someOperation() { this.helper.work(); } @Override public String toString() { final StringBuilder sb = new StringBuilder(); sb.append("HelperDemo"); sb.append("{helper=").append(helper); sb.append("}"); return sb.toString(); }
}
</source>
Component Scan and scope
<source lang="java">
File: context.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" 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 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"> <aop:aspectj-autoproxy /> <context:component-scan base-package="bean"> <context:include-filter type="annotation" expression="org.aspectj.lang.annotation.Aspect"/> </context:component-scan>
</beans>
File: Main.java import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import bean.Helper; import bean.HelperDemo; public class Main {
public static void main(String[] args) throws Exception { ApplicationContext ac = new ClassPathXmlApplicationContext( "context.xml"); HelperDemo hd1 = (HelperDemo) ac.getBean("helperDemo"); hd1.someOperation(); System.out.println(hd1); HelperDemo hd2 = (HelperDemo) ac.getBean("helperDemo"); hd2.someOperation(); System.out.println(hd2); Helper helper = (Helper) ac.getBean("helper"); System.out.println(helper); }
} File: Helper.java package bean; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.ruponent; @Component("helper") @Scope(BeanDefinition.SCOPE_PROTOTYPE) public class Helper {
private int count; public void work() { this.count++; } @Override public String toString() { final StringBuilder sb = new StringBuilder(); sb.append("Helper"); sb.append("{count=").append(count); sb.append("}"); return sb.toString(); }
}
File: HelperDemo.java package bean;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.ruponent; @Component @Scope(BeanDefinition.SCOPE_PROTOTYPE) public class HelperDemo {
@Autowired private Helper helper; public void setHelper(Helper helper) { this.helper = helper; } public void someOperation() { this.helper.work(); } @Override public String toString() { final StringBuilder sb = new StringBuilder(); sb.append("HelperDemo"); sb.append("{helper=").append(helper); sb.append("}"); return sb.toString(); }
}
</source>
Custom InitializationMethod
<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="numberClass" class="CustomInitializationMethodNumberClass" init-method="initialize"/>
</beans>
File: Main.java import java.util.ArrayList; import java.util.List; 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")); CustomInitializationMethodNumberClass bean = (CustomInitializationMethodNumberClass)beanFactory.getBean("numberClass"); System.out.println(bean.getNumbers()); }
} class CustomInitializationMethodNumberClass {
private List<String> numbers = new ArrayList<String>(); public List<String> getNumbers() { return this.numbers; } public void initialize() throws Exception { if (this.numbers.size() < 3) { numbers.add("one"); numbers.add("two"); numbers.add("three"); } }
}
</source>
dependency check 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="target1" class="SimpleBean" dependency-check="simple"> <property name="someInt" value="1"/> </bean> <bean id="target2" class="SimpleBean" dependency-check="objects"> <property name="nestedSimpleBean" ref="nestedSimpleBean"/> </bean> <bean id="target3" class="SimpleBean" dependency-check="all"> <property name="nestedSimpleBean" ref="nestedSimpleBean"/> <property name="someInt" value="1"/> </bean> <bean id="nestedSimpleBean" class="SimpleBean"/>
</beans>
File: Main.java import org.springframework.beans.factory.xml.XmlBeanFactory; import org.springframework.core.io.ClassPathResource; public class Main {
public static void main(String[] args) { XmlBeanFactory bf = new XmlBeanFactory(new ClassPathResource("context.xml")); System.out.println(bf.getBean("target1")); System.out.println(bf.getBean("target2")); System.out.println(bf.getBean("target3")); }
} class SimpleBean {
private int someInt; private SimpleBean nestedSimpleBean; public void setSomeInt(int someInt) { this.someInt = someInt; } public void setNestedSimpleBean(SimpleBean nestedSimpleBean) { this.nestedSimpleBean = nestedSimpleBean; } @Override public String toString() { final StringBuilder sb = new StringBuilder(); sb.append("SimpleBean"); sb.append("{someInt=").append(someInt); sb.append(", nestedSimpleBean=").append(nestedSimpleBean); sb.append("}"); return sb.toString(); }
}
</source>
destroy 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="numberClass" class="CustomDestroyMethodNumberClass" destroy-method="close"/>
</beans>
File: Main.java import java.util.ArrayList; import java.util.List; 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")); CustomDestroyMethodNumberClass numberClass = (CustomDestroyMethodNumberClass) beanFactory .getBean("numberClass"); beanFactory.destroySingletons(); System.out.println(numberClass.getNumbers()); }
} class CustomDestroyMethodNumberClass {
private List<String> numbers = new ArrayList<String>(); public CustomDestroyMethodNumberClass() { this.numbers.add("one"); this.numbers.add("two"); this.numbers.add("three"); } public List<String> getNumbers() { return this.numbers; } public void close() throws Exception { System.out.println("closing"); this.numbers = null; }
}
</source>
Filtered By Annotation
<source lang="java">
File: context.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context" 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 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <context:component-scan base-package="bean"> <context:include-filter type="annotation" expression="bean.Magic"/> <context:include-filter type="assignable" expression="bean.ruponentMarker"/> <context:include-filter type="aspectj" expression="* void bean.*Service*(..)"/> </context:component-scan>
</beans>
File: Main.java import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class Main {
public static void main(String[] args) throws Exception { ApplicationContext ac = new ClassPathXmlApplicationContext( "context.xml"); String[] beanNames = ac.getBeanDefinitionNames(); for (String beanName : beanNames) { System.out.println(beanName + ": " + ac.getBean(beanName)); } }
} File: ComponentMarker.java package bean;
public interface ComponentMarker { }
File: Magic.java package bean;
public @interface Magic { }
File: MarkedBean.java package bean;
public class MarkedBean implements ComponentMarker {
@Override public String toString() { final StringBuilder sb = new StringBuilder(); sb.append("MarkedBean"); sb.append("{}"); return sb.toString(); }
}
File: SimpleBean.java package bean; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.ruponent; import org.springframework.util.ObjectUtils; /**
* @author janm */
@Magic class SimpleBean {
private Dependency dependency; @Autowired(required = true) public void setDependency(Dependency dependency) { this.dependency = dependency; } @Override public String toString() { final StringBuilder sb = new StringBuilder(); sb.append("SimpleBean"); sb.append(ObjectUtils.identityToString(this)); sb.append("{dependency=").append(dependency); sb.append("}"); return sb.toString(); }
} @Component class Dependency {
@Override public String toString() { final StringBuilder sb = new StringBuilder(); sb.append("Dependency"); sb.append(ObjectUtils.identityToString(this)); sb.append("{}"); return sb.toString(); }
}
</source>
HierarchicalBeanFactory Demo
<source lang="java">
File: injectdemo2-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="name" class="java.lang.String"> <constructor-arg value="My Value 1"/> </bean> <bean id="injectSimpleParent" class="InjectSimpleDemo"> <property name="name" ref="name"/> <property name="age" value="2"/> <property name="height" value="0.8"/> <property name="isProgrammer" value="false"/> <property name="ageInSeconds" value="63072000"/> </bean>
</beans>
File: injectdemo3-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="name" class="java.lang.String"> <constructor-arg value="My value"/> </bean> <bean id="injectSimpleChild" class="InjectSimpleDemo"> <property name="name" ref="name"/> <property name="age" value="2"/> <property name="height" value="0.8"/> <property name="isProgrammer" value="false"/> <property name="ageInSeconds" value="63072000"/> </bean> <bean id="injectSimpleChild2" class="InjectSimpleDemo"> <property name="name"> <ref parent="name"/> </property> <property name="age" value="2"/> <property name="height" value="0.8"/> <property name="isProgrammer" value="false"/> <property name="ageInSeconds" value="63072000"/> </bean>
</beans>
File: Main.java import org.springframework.beans.factory.xml.XmlBeanFactory; import org.springframework.core.io.ClassPathResource; public class Main {
public static void main(String[] args) { XmlBeanFactory parent = new XmlBeanFactory(new ClassPathResource("injectdemo2-context.xml")); XmlBeanFactory child = new XmlBeanFactory(new ClassPathResource("injectdemo3-context.xml"), parent); System.out.println(parent.getBean("injectSimpleParent")); System.out.println(child.getBean("injectSimpleChild")); System.out.println(child.getBean("injectSimpleChild2")); }
} class InjectSimpleDemo {
private String name; private int age; private float height; private boolean isProgrammer; private Long ageInSeconds; public void setAgeInSeconds(Long ageInSeconds) { this.ageInSeconds = ageInSeconds; } public void setIsProgrammer(boolean isProgrammer) { this.isProgrammer = isProgrammer; } public void setAge(int age) { this.age = age; } public void setHeight(float height) { this.height = height; } public void setName(String name) { this.name = name; } @Override public String toString() { return String.format("Name: %s\nAge: %d\nAge in Seconds: %d\nHeight: %g\nIs Programmer?: %b", this.name, this.age, this.ageInSeconds, this.height, this.isProgrammer); }
}
</source>
implements BeanNameAware
<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"/>
</beans>
File: Main.java import org.springframework.beans.factory.BeanNameAware; 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")); 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 + ""."); }
}
</source>
Inheritance 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="parent" class="SimpleBean" abstract="true"> <property name="name" value="Name 1"/> </bean> <bean id="bean1" class="SimpleBean" parent="parent"> <property name="age" value="28"/> </bean> <bean id="bean2" class="SimpleBean" parent="parent"/>
</beans>
File: Main.java import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.springframework.beans.factory.xml.XmlBeanFactory; import org.springframework.core.io.ClassPathResource; import org.springframework.stereotype.ruponent; public class Main {
public static void main(String[] args) throws Exception { XmlBeanFactory bf = new XmlBeanFactory(new ClassPathResource("context.xml")); System.out.println(bf.getBean("bean1")); System.out.println(bf.getBean("bean2")); }
} class SimpleBean {
private String name; private int age; public void setName(String name) { this.name = name; } public void setAge(int age) { this.age = age; } @Override public String toString() { final StringBuilder sb = new StringBuilder(); sb.append("SimpleBean"); sb.append("{name="").append(name).append("\""); sb.append(", age=").append(age); sb.append("}"); return sb.toString(); }
}
</source>
Link With DataSource
<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="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName"> <value>sun.jdbc.odbc.JdbcOdbcDriver</value> </property> <property name="url"> <value>jdbc:odbc:test</value> </property> <property name="username"> <value>root</value> </property> <property name="password"> <value>sql</value> </property> </bean> <bean id="datacon" class="Dataconimpl"> <property name="dataSource"><ref local="dataSource"/></property> </bean>
</beans>
File: Main.java import javax.sql.DataSource; 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 factory = new XmlBeanFactory(new ClassPathResource("context.xml")); Dataconimpl bean1 = (Dataconimpl) factory.getBean("datacon"); }
} class Dataconimpl implements Datacon {
private DataSource dataSource; public void setDataSource(DataSource ds) { dataSource = ds; } public DataSource dbcon() { return dataSource; }
} interface Datacon {
public DataSource dbcon();
}
</source>
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="weatherService" class="WeatherServiceImpl"> <property name="weatherDao"> <ref local="weatherDao"/> </property> </bean> <bean id="weatherDao" class="StaticDataWeatherDaoImpl"> </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"); WeatherService ws = (WeatherService) ctx.getBean("weatherService"); Double high = ws.getHistoricalHigh(new GregorianCalendar(2004, 0, 1).getTime()); System.out.println("High was: " + high); }
} class StaticDataWeatherDaoImpl implements WeatherDao {
public WeatherData find(Date date) { WeatherData wd = new WeatherData(); wd.setDate((Date) date.clone()); return wd; } public WeatherData save(Date date) { System.out.println("save"); return null; } public WeatherData update(Date date) { System.out.println("update"); return null; }
} interface WeatherService {
Double getHistoricalHigh(Date date);
} class WeatherServiceImpl implements WeatherService {
private WeatherDao weatherDao; public void setWeatherDao(WeatherDao weatherDao) { this.weatherDao = weatherDao; } public Double getHistoricalHigh(Date date) { return null; }
} interface WeatherDao {
WeatherData find(Date date); WeatherData save(Date date); WeatherData update(Date date);
} class WeatherData {
Date date;
public Date getDate() { return date; } public void setDate(Date date) { this.date = date; }
}
</source>
Non Static Factory
<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="nonStaticFactory" class="NonStaticFactory"/> <bean id="testBeanObtainedViaNonStaticFactory" factory-bean="nonStaticFactory" factory-method="getTestBeanInstance"/>
</beans>
File: Main.java 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"); TestBean testBeanObtainedViaStaticFactory = (TestBean) ctx .getBean("testBeanObtainedViaNonStaticFactory"); }
} class NonStaticFactory {
public TestBean getTestBeanInstance() { return new TestBean(); }
}
class TestBean {
}
</source>
Properties File Based Spring Bean
<source lang="java">
File: helloworld-context.properties source.(class)=SimpleMessageData destination.(class)=StdoutMessageReporter
File: Main.java import org.springframework.beans.factory.support.BeanDefinitionReader; import org.springframework.beans.factory.support.DefaultListableBeanFactory; import org.springframework.beans.factory.support.PropertiesBeanDefinitionReader; import org.springframework.core.io.ClassPathResource; public class Main {
public static void main(String[] a) { DefaultListableBeanFactory bf = new DefaultListableBeanFactory(); BeanDefinitionReader reader = new PropertiesBeanDefinitionReader(bf); reader.loadBeanDefinitions(new ClassPathResource("helloworld-context.properties")); MessageData source = (MessageData) bf.getBean("source"); MessageReporter destination = (MessageReporter) bf.getBean("destination"); destination.write(source.getMessage()); }
} interface MessageService {
void execute();
} class DefaultMessageService implements MessageService {
private MessageData source; private MessageReporter destination; public void execute() { this.destination.write(this.source.getMessage()); } public void setSource(MessageData source) { this.source = source; } public void setDestination(MessageReporter destination) { this.destination = destination; }
} interface MessageReporter {
void write(String message);
} interface MessageData {
String getMessage();
} class StdoutMessageReporter implements MessageReporter {
public void write(String message) { System.out.println(message); }
} class SimpleMessageData implements MessageData {
private final String message; public SimpleMessageData() { this("Hello, world"); } public SimpleMessageData(String message) { this.message = message; } public String getMessage() { return this.message; }
}
</source>
Reference another bean and set property
<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" class="HardcodedEncyclopedia"/> <bean id="oracle" class="BookwormOracle"> <property name="encyclopedia" ref="encyclopedia"/> </bean>
</beans>
File: Main.java import java.util.HashMap; import java.util.Map; import org.springframework.beans.factory.xml.XmlBeanFactory; import org.springframework.core.io.ClassPathResource; 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 HardcodedEncyclopedia implements Encyclopedia {
private Map<String, Long> entryValues = new HashMap<String, Long>(); public HardcodedEncyclopedia() { this.entryValues.put("AgeOfUniverse", 13700000000L); this.entryValues.put("ConstantOfLife", 326190476L); } public Long findLong(String entry) { return this.entryValues.get(entry); }
}
</source>
Serach By Base Package
<source lang="java">
File: context.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context" 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 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <context:component-scan base-package="bean"/>
</beans>
File: Main.java import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class Main {
public static void main(String[] args) throws Exception { ApplicationContext ac = new ClassPathXmlApplicationContext("context.xml"); System.out.println(ac.getBean("simplestBean")); }
} File: Magic.java package bean;
public @interface Magic { }
File: MarkedBean.java package bean;
public class MarkedBean implements ComponentMarker {
@Override public String toString() { final StringBuilder sb = new StringBuilder(); sb.append("MarkedBean"); sb.append("{}"); return sb.toString(); }
}
File: SimpleBean.java package bean; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.ruponent; import org.springframework.util.ObjectUtils; /**
* @author janm */
@Magic class SimpleBean {
private Dependency dependency; @Autowired(required = true) public void setDependency(Dependency dependency) { this.dependency = dependency; } @Override public String toString() { final StringBuilder sb = new StringBuilder(); sb.append("SimpleBean"); sb.append(ObjectUtils.identityToString(this)); sb.append("{dependency=").append(dependency); sb.append("}"); return sb.toString(); }
} @Component class Dependency {
@Override public String toString() { final StringBuilder sb = new StringBuilder(); sb.append("Dependency"); sb.append(ObjectUtils.identityToString(this)); sb.append("{}"); return sb.toString(); }
}
File: SimplestBean.java package bean; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.ruponent; /**
* @author janm */
@Component("simplestBean") @Scope("prototype") public class SimplestBean {
@Override public String toString() { final StringBuilder sb = new StringBuilder(); sb.append("SimplestBean"); sb.append("{}"); return sb.toString(); }
}
File: ComponentMarker.java package bean;
public interface ComponentMarker { }
</source>
Static Factory
<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="testBeanObtainedViaStaticFactory" class="StaticFactory" factory-method="getTestBeanInstance"/>
</beans>
File: Main.java 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"); TestBean testBeanObtainedViaStaticFactory = (TestBean) ctx .getBean("testBeanObtainedViaStaticFactory"); }
} class StaticFactory {
public static TestBean getTestBeanInstance() { return new TestBean(); }
} class TestBean {
}
</source>
throw RequiredPropertyNotSetException
<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>
XML Bean Injection
<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:p="http://www.springframework.org/schema/p" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="injectSimpleDemo" class="InjectSimpleDemo" p:age="35" p:ageInSeconds="1103760000" p:height="1.79" p:isProgrammer="false"/>
</beans>
File: Main.java import org.springframework.beans.factory.xml.XmlBeanFactory; import org.springframework.core.io.ClassPathResource; public class Main {
public static void main(String[] args) { XmlBeanFactory factory = new XmlBeanFactory(new ClassPathResource( "context.xml")); InjectSimpleDemo simple = (InjectSimpleDemo) factory.getBean("injectSimpleDemo"); System.out.println(simple); }
} class InjectSimpleDemo {
private String name; private int age; private float height; private boolean isProgrammer; private Long ageInSeconds; public void setAgeInSeconds(Long ageInSeconds) { this.ageInSeconds = ageInSeconds; } public void setIsProgrammer(boolean isProgrammer) { this.isProgrammer = isProgrammer; } public void setAge(int age) { this.age = age; } public void setHeight(float height) { this.height = height; } public void setName(String name) { this.name = name; } @Override public String toString() { return String.format("Name: %s\nAge: %d\nAge in Seconds: %d\nHeight: %g\nIs Programmer?: %b", this.name, this.age, this.ageInSeconds, this.height, this.isProgrammer); }
}
</source>