Spring的工厂方法

IoC通过工厂模式创建bean的方式有两种:

  • 静态工厂方法。

创建User类

package com.exambner.ioc;

public class User {

    private long id;

    private String name;

    private int age;

    private String sex;

    public User() {
        System.out.println("创建了User对象");
    }

    public User(long id, String name, int age, String sex) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.sex = sex;
    }

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                ", sex='" + sex + '\'' +
                '}';
    }
}

构建User静态工厂

package com.exambner.ioc;

import java.util.HashMap;
import java.util.Map;

/**
 * @Author: wangwang
 * @Date: 2023-01-05-0:11
 * @Description:
 */
public class StaticUserFoctory {
    //定义一个map去存储创建的User信息
    private static Map<Long, User> map;

    /**
     * 静态代码块中的代码在类被加载时就会执行
     */
    static {
        //在类加载时为map初始化。
        map = new HashMap<>();
        //添加用户对象信息
        map.put(1L, new User(1L, "小明", 18, "男"));
        map.put(2L, new User(2L, "小红", 19, "女"));
    }

    /**
     * 对外提供的获取对象的方法
     *
     * @param id
     * @return
     */
    public static User getUser(Long id) {
        return map.get(id);
    }
}

调用静态工厂创建bean对象。

public static void main(String[] args) {
        User user = StaticUserFoctory.getUser(1L);
        System.out.println(user);
    }
User{id=1, name='小明', age=18, sex='男'}

这个时候我么创建的工厂类是在类加载时创建的bean,那么如何交给IoC管理呢?

<!-- 配置静态工厂 创建User -->
<bean id="student" class="com.exambner.ioc.StaticUserFoctory" factory-method="getUser">
    <constructor-arg value="1"></constructor-arg>
</bean>

这里我们需要指定对应的工厂类StaticUserFoctory,然后使用 factory-method 调用工厂类的静态方法创建bean,并使用constructor-tag 传入方法参数。

然后通过IoC获取bean。

public static void main(String[] args) {
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");
        User user = (User) applicationContext.getBean("user");
        System.out.println(user);
    }
User{id=1, name='小明', age=18, sex='男'}

 

 

  • 实例工厂方法。

创建实例工厂类:

package com.exambner.ioc;

import java.util.HashMap;
import java.util.Map;

public class InstanceUserFactory {
    //定义一个map去存储创建的User信息
    private Map<Long, User> map;

    //通过构造方法来实例化map,并且添加map对象
    public InstanceUserFactory() {
        this.map = new HashMap<>();
        //向map中添加用户对象信息
        map.put(1L, new User(1L, "小明", 18, "男"));
        map.put(2L, new User(2L, "小红", 19, "女"));
    }

    /**
     * 获取对象的方法
     *
     * @param id
     * @return
     */
    public User getUser(Long id) {
        return map.get(id);
    }
}

传统方式通过实例工厂获取bean对象。

public static void main(String[] args) {
        InstanceUserFactory instanceUserFactory=new InstanceUserFactory();
        User user = instanceUserFactory.getUser(2L);
        System.out.println(user);
    }
User{id=2, name='小红', age=19, sex='女'}

 

通过Ioc管理实例工厂创建bean:

<!-- 配置实例工厂 创建bean -->
<bean id="instanceUserFactory" class="com.exambner.ioc.InstanceUserFactory"></bean>

<bean id="user" factory-bean="instanceUserFactory" factory-method="getUser">
        <constructor-arg value="1"></constructor-arg>
</bean>

实例工厂需要创建2个bean,因为实例工厂本身就需要被实例化。

在bean user中,通过factory-bean指定工厂bean,通过factory-method指定创建bean的方法,使用 constructor-tag标签去给方法传参。

然后通过Ioc去获取User对象。

ApplicationContext applicationContext=new ClassPathXmlApplicationContext("spring.xml");
Object user = applicationContext.getBean("user");
System.out.println(user);
User{id=2, name='小红', age=19, sex='女'}

 

posted @ 2023-01-05 01:07  Amireux-126  阅读(48)  评论(0)    收藏  举报