Spring中的BeanFactory与FactoryBean

本文深入探讨了Spring框架中BeanFactory与FactoryBean两个核心接口的区别与联系。BeanFactory用于创建和管理bean,而FactoryBean本身是bean,同时也能生成其他bean。文章详细解释了如何使用BeanFactory获取FactoryBean,并强调了获取FactoryBean实例时需加前缀'&'的细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

BeanFactory 与 FactoryBean 是spring中长得比较相像的两个接口。
BeanFactory的源码如下:

public interface BeanFactory {  
    /**
	 * Used to dereference a {@link FactoryBean} instance and distinguish it from
	 * beans <i>created</i> by the FactoryBean. For example, if the bean named
	 * {@code myJndiObject} is a FactoryBean, getting {@code &myJndiObject}
	 * will return the factory, not the instance returned by the factory.
	 */
    String FACTORY_BEAN_PREFIX = "&"; 
    
    //获取bean的方法:
    Object getBean(String name) throws BeansException;      
    <T> T getBean(String name, Class<T> requiredType) throws BeansException;                 Object getBean(String name, Object... args) throws BeansException;     
    <T> T getBean(Class<T> requiredType) throws BeansException;      
    <T> T getBean(Class<T> requiredType, Object... args) throws BeansException;
    
    //获取provider
    <T> ObjectProvider<T> getBeanProvider(Class<T> requiredType);     
    <T> ObjectProvider<T> getBeanProvider(ResolvableType requiredType); 
    
    //是否包含名为name的bean
    boolean containsBean(String name);  
    
    boolean isPrototype(String name) throws NoSuchBeanDefinitionException;                   boolean isTypeMatch(String name, ResolvableType typeToMatch) throws NoSuchBeanDefinitionException;     
    boolean isTypeMatch(String name, Class<?> typeToMatch) throws NoSuchBeanDefinitionException;     
    @Nullable      
    Class<?> getType(String name) throws NoSuchBeanDefinitionException;     
    String[] getAliases(String name);
}

FactoryBean的源码:

public interface FactoryBean<T> {

	//返回该工厂管理的bean实例
	@Nullable
	T getObject() throws Exception;
	
	@Nullable
	Class<?> getObjectType();

	default boolean isSingleton() {
		return true;
	}

}

从两个接口的定义上,可以清楚的看出,BeanFactory是用来产生bean的factory类;而FactoryBean是类型为factory的bean。spring中的bean一般可以分为两类:

  • 普通的bean
  • 工厂bean

工厂bean既是被spring管理的bean,也是管理别的bean的工厂bean。(这里有点像spring是一个老师,老师管理所有的学生,但是学生分为了两类,一类就是普通学生,另一个是协助老师管理班级的班干部)。

有一点需要强调的是:如果通过BeanFactory创建FactoryBean,在获取这些FactoryBean的时候,需要在bean的名称前加上前缀“&”符号。

applicationContext.getBean("book")//这样获得的bean是普通的bean
applicationContext.getBean("&book")//这样获得的bean是工厂bean
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值