通过工厂创建bean<04>

来源:互联网 发布:ps软件怎么用 编辑:程序博客网 时间:2024/06/05 19:08

1.1 静态工厂

调用静态工厂方法创建bean是将对象创建的过程封装到静态方法中。当客户端需要对象时,只需要简单地调用静态方法,而不用关心创建对象的细节。

声明通过静态方法创建的bean需要在beanclass属性里指定静态工厂类的全类名,同时在factory-method属性里指定工厂方法的名称。最后使用 <constrctor-arg>元素为该方法传递方法参数。

例子:

package com.o1;import java.util.HashMap;import java.util.Map;/** * 静态工厂:不需要创建工厂类自身的实例,只需要调用静态方法即可得到目标对象 * */public class StaticFactory {private static Map<String, Book> map;//静态代码块static{map = new HashMap<String, Book> ();map.put("book01", new Book("01", "name01"));map.put("book02", new Book("02", "name02"));map.put("book03", new Book("03", "name03"));map.put("book04", new Book("04", "name04"));map.put("book05", new Book("05", "name05"));}//通过id 获取对应的book信息public static Book getKey(String key){return map.get(key);}}
<span style="font-family: Arial, Helvetica, sans-serif;">package com.o1;</span>
public class Book {private String id;private String name;public String getId() {return id;}public void setId(String id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Book(String id, String name) {super();this.id = id;this.name = name;}public Book() {System.out.println("ioc执行之前先进行创建对象");}@Overridepublic String toString() {return "Book [id=" + id + ", name=" + name + "]";}}


<?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"xmlns:util="http://www.springframework.org/schema/util"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd">     <!-- 通过静态工厂类配置bean --><!-- 注意:bean的class是静态工厂类的全类名,但通过这个bean的配置,最终获取的却是Book的对象 --><!-- factory-method属性:用于指定在静态工厂类中,获取Book对象的静态方法 --><bean id="static" class="com.o1.StaticFactory" factory-method="getKey"><!-- 使用constructor-arg子标签给静态的工厂方法传入参数 --><constructor-arg value="book01"/></bean></beans>


package com.o1;import org.junit.Test;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class Test01 {@Testpublic void test01() {//创建IOC 容器ApplicationContext ioc=new ClassPathXmlApplicationContext("applicationContext.xml");Book book = (Book) ioc.getBean("book");System.out.println(book);/** * ioc执行之前先进行创建对象         * Book [id=01, name=哈利波特] */}@Testpublic void test02() {//创建IOC 容器ApplicationContext ioc=new ClassPathXmlApplicationContext("applicationContext.xml");Book book = (Book) ioc.getBean("static");System.out.println(book);/** *ioc执行之前先进行创建对象                 *Book [id=01, name=name01] */}}

1.2 实例工厂

实例工厂方法:将对象的创建过程封装到另外一个对象实例的方法里。当客户端需要请求对象时,只需要简单的调用该实例方法而不需要关心对象的创建细节。

实现方式

①配置工厂类实例的bean

②在factory-method属性里指定该工厂方法的名称

③使用 construtor-arg 元素为工厂方法传递方法参数

package com.o1;import java.util.HashMap;import java.util.Map;/** *实例工厂: 通过非静态的工厂方法获取指定的对象。 * 由于调用的是非静态的方法,所以必须创建当前工厂类的实例对象。 */public class InstanceFactory {private static Map<String, Book> map;{map = new HashMap<String, Book> ();map.put("book01", new Book("01", "name01"));map.put("book02", new Book("02", "name02"));map.put("book03", new Book("03", "name03"));map.put("book04", new Book("04", "name04"));map.put("book05", new Book("05", "name05"));}//通过id 获取对应的book信息public  Book getKey(String key){return map.get(key);}}


<?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"xmlns:util="http://www.springframework.org/schema/util"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd"><!-- 配置实例工厂的bean --><bean id="instance" class="com.o1.InstanceFactory"/><!-- 配置一个由实例工厂创建的对象,需要对实例工厂类的bean进行引用 --><!-- factory-bean属性:指定创建当前bean的实例工厂的对象 --><bean id="instanceBook03" factory-bean="instance" factory-method="getKey"><constructor-arg value="book03"/></bean></beans>

package com.o1;import org.junit.Test;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class Test01 {@Testpublic void test03() {//创建IOC 容器ApplicationContext ioc=new ClassPathXmlApplicationContext("applicationContext.xml");Book book = (Book) ioc.getBean("instanceBook03");System.out.println(book);/** *ioc执行之前先进行创建对象                 *Book [id=03, name=name03] */}}







1 0
原创粉丝点击