Spring4学习回顾之路07- 通过工厂方法配置Bean
一:通过静态工厂配置Bean
建立Student.java
package com.lql.srping04; /** * @author: lql * @date: 2019.10.28 * Description: */ public class Student { private String name; private Integer age; @Override public String toString() { return "Student{" + "name='" + name + '\'' + ", age=" + age + '}'; } public Student() { } public Student(String name, Integer age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } }
建立静态工厂StaticStudentFactory.java
package com.lql.srping04; import java.util.HashMap; import java.util.Map; /** * @author: lql * @date: 2019.10.28 * Description: */ public class StaticStudentFactory { private static Map<String,Student> map = new HashMap<String, Student> (); static { map.put("张三",new Student("张三",18)); map.put("李四",new Student("李四",17)); } public static Student getStudent(String name) { return map.get(name); } }
通过静态工厂方法配置Bean
<?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="studentfactory" class="com.lql.srping04.StaticStudentFactory" factory-method="getStudent"> <constructor-arg value="李四"></constructor-arg> </bean> </beans>
注意的是:因为静态方法getStudent(String name);有个参数,则在配置的时候需要<constructor-arg>来指定value;上图标签属性的说明:class:指向静态工厂方法的全类名,factory-method:指向静态工厂方法的名字
建立测试类:
package com.lql.srping04; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; /** * @author: lql * @date: 2019.10.28 * Description: */ public class StudetnTest { public static void main(String[] args) { ApplicationContext app = new ClassPathXmlApplicationContext("spring04.xml"); Student student = app.getBean("studentfactory", Student.class); System.out.println(student); } }
测试结果:
"C:\Program Files\Java\jdk1.8.0_201\bin\java" "-javaagent:D:\Program\JetBrains\IntelliJ IDEA 2017.3.3\lib\idea_rt.jar=58238:D:\Program\JetBrains\IntelliJ IDEA 2017.3.3\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_201\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\rt.jar;F:\bdyc\SpringFramework\out\production\SpringFramework;F:\bdyc\SpringFramework\libs\c3p0-0.9.1.2.jar;F:\bdyc\SpringFramework\libs\commons-logging-1.1.1.jar;F:\bdyc\SpringFramework\libs\mysql-connector-java-5.1.7-bin.jar;F:\bdyc\SpringFramework\libs\spring-aop-4.0.0.RELEASE.jar;F:\bdyc\SpringFramework\libs\spring-beans-4.0.0.RELEASE.jar;F:\bdyc\SpringFramework\libs\spring-context-4.0.0.RELEASE.jar;F:\bdyc\SpringFramework\libs\spring-core-4.0.0.RELEASE.jar;F:\bdyc\SpringFramework\libs\spring-expression-4.0.0.RELEASE.jar" com.lql.srping04.StudetnTest
十月 28, 2019 1:49:35 下午 org.springframework.context.support.AbstractApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@37bba400: startup date [Mon Oct 28 13:49:35 GMT+08:00 2019]; root of context hierarchy
十月 28, 2019 1:49:35 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
信息: Loading XML bean definitions from class path resource [spring04.xml]
Student{name='李四', age=17}
二:通过实例工厂方法配置Bean
建立实例工厂InstanceFactory.java
package com.lql.srping04; import java.util.HashMap; import java.util.Map; /** * @author: lql * @date: 2019.10.28 * Description:实例工厂 */ public class InstanceFactory { private Map<String,Student> map = null; public InstanceFactory(){ map = new HashMap<>(); map.put("张三",new Student("张三",18)); map.put("李四",new Student("李四",17)); } public Student getStudent(String name) { return map.get(name); } }
配置:factory-bean:指定工厂实例bean.
<?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="instancefactory" class="com.lql.srping04.InstanceFactory"></bean> <!--通过实例工厂方法类来配置bean--> <bean id="student" factory-bean="instancefactory" factory-method="getStudent"> <constructor-arg value="张三"></constructor-arg> </bean> </beans>
测试:
package com.lql.srping04; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; /** * @author: lql * @date: 2019.10.28 * Description: */ public class StudetnTest { public static void main(String[] args) { ApplicationContext app = new ClassPathXmlApplicationContext("spring04.xml"); // Student student = app.getBean("studentfactory", Student.class); Student student = app.getBean("student", Student.class); System.out.println(student); } }
结果:
十月 28, 2019 2:04:25 下午 org.springframework.context.support.AbstractApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@37bba400: startup date [Mon Oct 28 14:04:25 GMT+08:00 2019]; root of context hierarchy
十月 28, 2019 2:04:25 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
信息: Loading XML bean definitions from class path resource [spring04.xml]
Student{name='张三', age=18}