一、BeanFactory和FactoryBean的区别

BeanFactory和FactoryBean的区别

一、BeanFactory

1、简介

BeanFactory是SpringIoc最基本的根容器,提供了IOC的基础功能,是Bean的顶层工厂,包括我们常用的ClassPathXmlApplicationContext以及Web环境需要的WebApplicationContext等等都是BeanFactory的子孙类。负责创建对象、管理对象。

2、核心源码

package org.springframework.beans.factory;

import org.springframework.beans.BeansException;

public interface BeanFactory {

	/**
	 * 获取FactoryBean本身的特殊符号
	 */
	String FACTORY_BEAN_PREFIX = "&";

	/**
	 * 从SpringIOC的工厂中获取指定名称的Bean
	 */
	Object getBean(String name) throws BeansException;

	/**
	 * 从SpringIOC的工厂中获取指定名称指定类型的Bean
	 */
	<T> T getBean(String name, Class<T> requiredType) throws BeansException;

	/**
	 * 是否包含bean
	 */
	boolean containsBean(String name);
    
    // ......

}

3、继承关系

在这里插入图片描述

二、FactoryBean

1、简介

Spring有两种类型的Bean,一种是普通Bean,一种是工厂Bean既FactoryBean。FactoryBean跟普通Bean不同,FactoryBean返回的对象不是指定类的一个实例,而是由FactoryBean的getObject()方法所返回的对象。

FactoryBean本身存活在BeanFactory当中,他本身也是一个工厂,这个工厂作用用于获取由FactoryBean所能创建出来的那个对象(getObject方法),在创建出来对象的时候,可以在这个对象方法的前面或者后面可以额外的执行一些操作,他是实现AOP的一个重要的基石。

2、核心源码

package org.springframework.beans.factory;

public interface FactoryBean<T> {

	/**
	 * 核心!!!返回对象,每次返回的不是FactoryBean本身,而是返回的getObject方法所返回的对象
	 * 这是和普通Bean最大、最直观的区别。他不返回自己,他返回由自己所创建出来的bean。
	 */
	T getObject() throws Exception;

	/**
     * 返回对象的类型
	 */
	Class<?> getObjectType();

	/**
	 * 是否单例,true:永远返回同一个对象,单例模式,false:每次都创建新对象,原型模式。
	 */
	boolean isSingleton();

}

三、搞懂&符号

1、简介

&的作用是获取FactoryBean本身,而不是由FactoryBean创建出来的那个对象(getObject方法返回的对象)。因为若是FactoryBean,则返回的不是FactoryBean本身,而是由FactoryBean的getObject()方法所返回的对象。那我们如何获取FactoryBean本身呢?就是在getBean方法里加上&符号。

2、Demo

<bean id="person" class="com.ctw.spring.Person">    
    <property name="name" value="chentongwei" />    
</bean>
<bean id="personFactoryBean" class="com.ctw.spring.PersonFactoryBean">  
</bean>
public class Person {  
    private String name;
    
	// getter/setter
}
import org.springframework.beans.factory.FactoryBean;  

public class PersonFactoryBean implements FactoryBean {   
  
    @Override  
    public Object getObject() throws Exception {
		return new Person();
    }  
  
    @Override  
    public Class getObjectType() {  
        return Person.class;  
    }  
  
    @Override  
    public boolean isSingleton() {  
        return true;  
    } 
}
import org.springframework.context.support.ClassPathXmlApplicationContext;  

public class FactoryBeanTest {  
    public static void main(String[] args){  
        String url = "com/ctw/spring/config.xml";  
        ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext(url);  
        Object person = ac.getBean("personFactoryBean");
        PersonFactoryBean personFactoryBean = (PersonFactoryBean) ac.getBean("&personFactoryBean");
        
        System.out.println(person.getClass().getName());  
        System.out.println(personFactoryBean.getClass().getName());  
    }  
} 

输出结果

com.ctw.spring.Person
com.ctw.spring.PersonFactoryBean 

不难发现不加&的情况返回的是FactoryBean里的getObject方法所返回的对象,加上&则返回FactoryBean本身。

四、广告

QQ群:458430385
微信公众号
在这里插å¥å›¾ç‰‡æè¿°

发布了28 篇原创文章 · 获赞 33 · 访问量 8313

猜你喜欢

转载自blog.csdn.net/ctwctw/article/details/101735661