Spring有两种类型Bean,一种是普通Bean,另一种为工厂Bean
普通Bean:
在配置文件定义的类型就是返回类型
工厂Bean:
在配置文件中定义的类型可以和返回的类型不一样。
与普通的 Bean 不同,工厂 Bean 本身并不是一个普通的 Java 类,而是一个实现了 Spring 的 FactoryBean 接口的类。
工厂 Bean 的类型可以是任何 Java 类型,它不一定是被创建的 Bean 类型的子类或实现类。
如何创建和使用工厂 Bean:
首先创建一个工厂类,实现 org.springframework.beans.factory.FactoryBean 接口:
public class MyFactoryBean implements FactoryBean<MyBean> {
@Override
public MyBean getObject() throws Exception {
// 在这里可以实现自定义的 Bean 创建逻辑
return new MyBean();
}
@Override
public Class<?> getObjectType() {
return MyBean.class;
}
@Override
public boolean isSingleton() {
return true; // 返回 true 表示创建的 Bean 是单例
}
}
方法1:在 Spring 配置文件中配置工厂 Bean
<bean id="myFactoryBean" class="com.example.MyFactoryBean" />
<bean id="myCreatedBean" factorybean="myFactoryBean" factorymethod="getObject" />
在上述示例中:
MyFactoryBean 类实现了 FactoryBean 接口,并重写了接口中的方法,其中 getObject 方法用于创建 Bean 实例。
在 Spring 配置文件中,通过 <bean> 标签配置了 myFactoryBean 工厂 Bean。
myCreatedBean 是通过 myFactoryBean 工厂 Bean 创建的 Bean。
方法2:用注解方式
@Configuration
public class MyConfig {
@Bean
public MyFactoryBean myFactoryBean() {
return new MyFactoryBean();
}
@Bean
public MyBean myCreatedBean() throws Exception {
return myFactoryBean().getObject();
}
}
在上述示例中:
@Configuration 注解表示这是一个配置类。
@Bean 注解用于声明工厂方法,其中方法名就是 Bean 的名称。在 myFactoryBean() 方法中,返回了一个自定义的工厂 Bean MyFactoryBean 的实例。
在 myCreatedBean() 方法中,通过调用 myFactoryBean().getObject() 方法来创建一个新的 Bean 实例。