BeanFactory和ObjectFactory的区别

6次阅读

共计 3082 个字符,预计需要花费 8 分钟才能阅读完成。

BeanFactory

package org.springframework.beans.factory;
import org.springframework.beans.BeansException;
import org.springframework.core.ResolvableType;
import org.springframework.lang.Nullable;
public interface BeanFactory {

    String FACTORY_BEAN_PREFIX = "&";
    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;
    <T> ObjectProvider<T> getBeanProvider(Class<T> requiredType);
    <T> ObjectProvider<T> getBeanProvider(ResolvableType requiredType);
    boolean containsBean(String name);
    boolean isSingleton(String name) throws NoSuchBeanDefinitionException;
    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;
    @Nullable
    Class<?> getType(String name, boolean allowFactoryBeanInit) throws NoSuchBeanDefinitionException;
    String[] getAliases(String name);

}
  1. String FACTORY_BEAN_PREFIX = “&”;

String FACTORY_BEAN_PREFIX = “&”; 这句代码定义在 BeanFactory 这个最顶级的接口中。他的作用是如果在应用 beanName 获取 Bean 时,在 BeanName 前增加这个前缀,那么应用这个 BeanName 取得的 Bean 实例是其所在 FactoryBean 的实例,也就是实现 FactoryBean 接口的那个类的 Bean 实例。

  1. Object getBean(String name) throws BeansException;

通过 Bean 名称获取 Bean

  1. <T> T getBean(String name, Class<T> requiredType) throws BeansException;

依据名称和类型获取 Bean

  1. Object getBean(String name, Object… args) throws BeansException;

通过 name 和对象参数获取 Bean

  1. <T> T getBean(Class<T> requiredType) throws BeansException;

通过类型获取 Bean

  1. <T> T getBean(Class<T> requiredType, Object… args) throws BeansException;

通过类型和参数获取 Bean

  1. <T> ObjectProvider<T> getBeanProvider(Class<T> requiredType);

返回指定 ObjectProvider,提供提早加载性能

  1. <T> ObjectProvider<T> getBeanProvider(ResolvableType requiredType);

Class,Field,Method 类型的提早加载性能

  1. boolean containsBean(String name);

容器中是否蕴含名字为 name 的 Bean

  1. boolean isSingleton(String name) throws NoSuchBeanDefinitionException;

Bean 是否是单例

  1. boolean isPrototype(String name) throws NoSuchBeanDefinitionException;

判断 bean 是不是原型

  1. boolean isTypeMatch(String name, ResolvableType typeToMatch) throws NoSuchBeanDefinitionException;

查看具备给定名称的 bean 是否与指定的类型 (Class,Field,Method 类型) 匹配。

  1. boolean isTypeMatch(String name, Class<?> typeToMatch) throws NoSuchBeanDefinitionException;

查看具备给定名称的 bean 是否与指定的类型匹配。

  1. Class<?> getType(String name) throws NoSuchBeanDefinitionException;

确定具备给定名称的 bean 的类型

  1. Class<?> getType(String name, boolean allowFactoryBeanInit) throws NoSuchBeanDefinitionException;

确定具备给定名称的 bean 的类型

  1. String[] getAliases(String name);

返回给定 bean 名称的别名

ObjectFactory


package javax.naming.spi;

import java.util.Hashtable;

import javax.naming.*;


public interface ObjectFactory {
    // 为指定对象和环境创立一个对象实例
    public Object getObjectInstance(Object obj, Name name, Context nameCtx,
                                    Hashtable<?,?> environment)
        throws Exception;
}

相同点

BeanFactory 和 ObjectFactory 都提供依赖查找的能力

区别

  • BeanFactory 实现了 ObjectFactory 接口
  • ObjectFactory 仅仅关注一个或者一种类型 Bean 的查找, 并且本身不具备依赖查找的能力.
  • BeanFactory 则提供繁多类型, 汇合类型和层次性的依赖查找能力.

原文: https://rumenz.com/rumenbiji/Spring-BeanFactory-ObjectFactory.html

正文完
 0