Spring之BeanFactory和FactoryBean

  1. BeanFactory

BeanFactory是访问Spring bean容器的根接口,负责Spring中bean的创建、管理、实例化、定位、建立依赖,其他用于特定场景的bean容器接口都是直接或者间接的继承该接口。BeanFactory中持有配置文件中所有的bean的实例,每个实例是用一个字符串名称标识,如果是单例,则在第一次创建该实例就会被缓存到一个Map中,以后用到直接在该Map中获取,如果是多例,那么实例创建之后不会被缓存,每次使用都会重新创建。下面看一下这个接口中的声明的方法:

    /**
	 *这个符号是用来区分bean和factoryBean的 
	 */
	String FACTORY_BEAN_PREFIX = "&";


	/**
	 * 根据名称返回对应的实例,返回的实例需要进行强制类型转换
	 */
	Object getBean(String name) throws BeansException;

	/**
	 *根据名称和指定的类型返回实例
	 */
	<T> T getBean(String name, @Nullable 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;


	/**
	 * 检查容器中是否含有指定名称的实例
	 */
	boolean containsBean(String name);

	/**
	 * 检查某个bean定义是否是单例
	 */
	boolean isSingleton(String name) throws NoSuchBeanDefinitionException;

	/**
	 * 检查某个bean定义是否是多例
	 */
	boolean isPrototype(String name) throws NoSuchBeanDefinitionException;

	/**
	 * 根据名称指定的bean是否是指定的类型
	 */
	boolean isTypeMatch(String name, ResolvableType typeToMatch) throws NoSuchBeanDefinitionException;

	boolean isTypeMatch(String name, @Nullable Class<?> typeToMatch) throws NoSuchBeanDefinitionException;

	/**
	 * 返回指定名称bean的类型
	 */
	@Nullable
	Class<?> getType(String name) throws NoSuchBeanDefinitionException;

	/**
	 * 返回指定名称bean的所有别名
	 */
	String[] getAliases(String name);
  1. FactoryBean
    FactoryBean是一个bean,但他不是普通的bean,是实现了FactoryBean接口的bean,用来管理一个对象,可以对该对象中的所有方法做拦截,也可以直接返回这个对象。在AOP中发挥了很大的作用,也对循环依赖的解决提供了很好的方法。看一下这个接口中声明的方法:

	/**
	 * 得到这个工厂所管理的实例
	 */
	@Nullable
	T getObject() throws Exception;

	/**
	 * 返回这个工厂所创建的bean的类型
	 */
	@Nullable
	Class<?> getObjectType();

	/**
	 * 这个工厂所管理的bean是否是单例
	 */
	default boolean isSingleton() {
		return true;
	}
  1. 比较
    这两者之间是没有什么可比性的,BeanFactory是个Factory,也就是IOC容器或对象工厂,FactoryBean是个Bean。在Spring中,所有的Bean都是由BeanFactory(也就是IOC容器)来进行管理的。但对FactoryBean而言,这个Bean不是简单的Bean,而是一个能生产或者修饰对象生成的工厂Bean,它的实现与设计模式中的工厂模式和修饰器模式类似。

猜你喜欢

转载自blog.csdn.net/m0_37343985/article/details/82819074