Spring基础-007-Bean的实例化方法

248 阅读3分钟

Spring为Bean提供了多种实例化方式:

  • 第一种:通过构造方法实例化
  • 第二种:通过简单工厂模式实例化
  • 第三种:通过factory-bean实例化
  • 第四种:通过FactoryBean接口实例化

7.1构造方法实例化

也就是之前一直默认使用的方法

7.2通过简单工厂模式实例化

第一: 定义一个Bean对象

package com.bean;

/**
 * @author 动力节点
 **/
public class Vip {
}

第二步:编写简单工厂模式中的工厂类

package com.bean;

/**
 * @author 动力节点
 **/
public class VipFactory {
    public static Vip get(){
        return new Vip();
    }
}

第三步: 在Spring配置文件中 beans.xml 中指定创建改Bean的方法:(使用factory-method属性指定)

<bean id="vipBean" class="com.powernode.spring6.bean.VipFactory" factory-method="get"/>

第四步:测试

7.3 通过factory-bean实例化

本质通过工厂方法模式进行实例化

第一步: 定义一个Bean

package com.spirng6.bean;

public class Order {
}

第二步: 定义具体工厂类,在工厂类中定义实例方法

package com.spring6.bean;


public class OrderFactory {
    public Order get(){
        return new Order();
    }
}

第三步: 在Spring配置文件中指定factory-bean 以及 factory-method

<bean id="orderFactory" class="com.powernode.spring6.bean.OrderFactory"/>
<bean id="orderBean" factory-bean="orderFactory" factory-method="get"/>

第四步:测试

7.4 通过FactoryBean 接口实例化

以上三种方式中, factory-bean和factory-method是自己定义的

在Spring中, 当类实现FactoryBean接口的时候,factory-bean不需要指定了,factory-method也不需要指定了

factory-bean 会自动指向实现FactoryBean接口的类,factory-method 会自动指向 **getObject()**方法

步骤:

第一步:定义一个Bean对象

package com.spring6.bean;

public class Person {
}

第二步 : 编写一个类事项FactoryBean接口

package com.spring6.bean;

import org.springframework.beans.factory.FactoryBean;

public class PersonFactoryBean implements FactoryBean<Person> {

    @Override
    public Person getObject() throws Exception {
        return new Person();
    }

    @Override
    public Class<?> getObjectType() {
        return null;
    }

    @Override
    public boolean isSingleton() {
        // true表示单例
        // false表示原型
        return true;
    }
}

第三步: 在Spring配置文件中配置FactoryBean

<bean id="personBean" class="com.spring6.bean.PersonFactoryBean"/>

第四步:测试

FactoryBean在Spring中是一个接口, 被称为"工厂Bean"(用于协助Spring框架创建其他的Bean对象).

7.5 BeanFactory 和 FactoryBean

7.5.1 BeanFactory

SpringIoC的顶级对象, 负责创建Bean对象

所以==BeanFactory是一个工厂==

7.5.2 FactoryBean

首先FactoryBean是一个Bean对象,是Spring中用来辅助实例化其他Bean对象的一个Bean.

Spring中,Bean分两类

  1. 普通Bean
  2. 工厂Bean

7.6 注入自定义Date

java.util.Date 在Spring中被当做简单类型,简单类型在注入的时候可以直接使用value属性或者value标签来完成.

对于Date类型来说,采用value属性或者value标签赋值的时候,对日期字符串的格式要求较为严格

package com.spring6.bean;

import java.util.Date;

public class Student {
    private Date birth;

    public void setBirth(Date birth) {
        this.birth = birth;
    }

    @Override
    public String toString() {
        return "Student{" +
                "birth=" + birth +
                '}';
    }
}

<bean id="studentBean" class="com.powernode.spring6.bean.Student">
  <property name="birth" value="Mon Oct 10 14:30:26 CST 2002"/>
</bean>
@Test
public void testDate(){
    ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");
    Student studentBean = applicationContext.getBean("studentBean", Student.class);
    System.out.println(studentBean);
}

执行结果: ![[007-Bean的实例化方式-20250208161718658.png]]

如果把日期格式修改一下:

<bean id="studentBean" class="com.powernode.spring6.bean.Student">
  <property name="birth" value="2002-10-10"/>
</bean>

执行结果: ![[007-Bean的实例化方式-20250208161920599.png]]

这时可以使用FactoryBean来解决:

写一个DateFactoryBean来实现FactoryBean接口:

package com.spring6.bean;

import org.springframework.beans.factory.FactoryBean;

import java.text.SimpleDateFormat;
import java.util.Date;

public class DateFactoryBean implements FactoryBean<Date> {

    // 定义属性接收日期字符串
    private String date;

    // 通过构造方法给日期字符串属性赋值
    public DateFactoryBean(String date) {
        this.date = date;
    }

    @Override
    public Date getObject() throws Exception {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        return sdf.parse(this.date);
    }

    @Override
    public Class<?> getObjectType() {
        return null;
    }
}

编写Spring配置文件:

<bean id="dateBean" class="com.powernode.spring6.bean.DateFactoryBean">
  <constructor-arg name="date" value="1999-10-11"/>
</bean>

<bean id="studentBean" class="com.powernode.spring6.bean.Student">
  <property name="birth" ref="dateBean"/>
</bean>