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='女'}

浙公网安备 33010602011771号