一、区别
1.功能不同
- BeanFactory是Spring框架的核心接口,用于管理和获取Bean对象。它是一个容器,负责创建、配置和管理应用程序中的Bean。
- FactroyBean是一个特殊的Bean,它本身也是一个BeanFactory,用于创建其他Bean。它提供了一种灵活的方式来创建和配置复杂的Bean对象。
2.返回值不同
- BeanFactory的主要功能是根据Bean的定义返回Bean对象的实例。通过调用'getBean()'方法,可以从'BeanFactory'中获取Bean实例。
- FactoryBean的主要功能是创建和返回其他Bean对象。通过调用'getObject()'方法,可以从'FactoryBean'中获取被创建的Bean对象。
3.配置方式不同
- BeanFactory通常通过XML配置文件或Java注解进行配置,定义和管理Bean对象。
- FactoryBean是一个接口,需要自定义实现该接口的类,并通过XML配置文件或者Java注解进行配置,以创建和管理其他Bean对象。
4.创建时机不同
- BeanFactory在获取Bean时动态创建Bean对象,即按需创建。
- FactoryBean在容器初始化时创建,然后将其作为一个普通的Bean管理。
二、举个栗子
下面演示下如何创建FactoryBean:
import org.springframework.beans.factory.FactoryBean;
import org.springframework.stereotype.Component;
@Component
public class MyBeanFactory implements FactoryBean<MyBean> {
@Override
public MyBean getObject() throws Exception {
// 在这里执行创建和配置 MyBean 对象的逻辑
MyBean myBean = new MyBean();
myBean.setName("Example");
myBean.setValue(123);
return myBean;
}
@Override
public Class<?> getObjectType() {
return MyBean.class;
}
@Override
public boolean isSingleton() {
return true;
}
}
在以上代码中,'MyBeanFactory'实现了'FactroyBean<MyBean>'接口,其中'MyBean'是我们自定义的Bean类型。在'getObject()'方法中,我们执行了创建和配置'MyBean'对象的逻辑,并返回该对象。'getObjectType()'方法制定了返回的对象类型,'isSingleton()'方法指定了该FactoryBean创建的对象是否为单例。
然后我们可以使用@Autowired注解将MyBean注入到其他类中:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class MyBeanConsumer {
private MyBean myBean;
@Autowired
public MyBeanConsumer(MyBean myBean) {
this.myBean = myBean;
}
// 使用 myBean 对象进行其他操作
}
在以上代码中,我们使用'@Autowired'注解将'MyBean'注入到'MyBeanConsumer'类中。Spring容器会自动检测到'MyBeanFactory'是一个'FactoryBean',并调用'getObject()'方法创建'MyBean'对象,并将其注入到'MyBeanConsumer'中。
三、小结
总结而言,BeanFactory是Spring框架的核心接口,用于管理和获取Bean对象,而FactoryBean是一个特殊的Bean,用于创建和返回其他Bean对象。BeanFactory是Soring容器的基础,而FactoryBean提供了一种扩展机制,允许在创建Bean时进行复杂的逻辑处理。