zoukankan      html  css  js  c++  java
  • Spring FactoryBean和BeanFactory 区别

    1 BeanFactory 是ioc容器的底层实现接口,是ApplicationContext 顶级接口


            spring不允许我们直接操作 BeanFactory  bean工厂,所以为我们提供了ApplicationContext 这个接口 此接口集成BeanFactory 接口,ApplicationContext包含BeanFactory的所有功能,同时还进行更多的扩展。

          BeanFactory  接口又衍生出以下接口,其中我们经常用到的是ApplicationContext 接口

    ApplicationContext 继承图

    在这里插入图片描述

    CongihuableApplicationContext 中添加了一些方法:

    复制代码
    ... 其他省略
        
        //刷新ioc容器上下文
        void refresh() throws BeansException, IllegalStateException;
    
    // 关闭此应用程序上下文,释放所有资源并锁定,销毁所有缓存的单例bean。
        @Override
        void close();
    
    //确定此应用程序上下文是否处于活动状态,即,是否至少刷新一次且尚未关闭。
        boolean isActive();
    
        ... 其他省略
    复制代码

    主要作用在ioc容器进行相应的刷新,关闭等操作!

    FileSystemXmlApplicationContext 和ClassPathXmlApplicationContext 是用来读取xml文件创建bean对象
    ClassPathXmlApplicationContext  : 读取类路径下xml 创建bean
    FileSystemXmlApplicationContext :读取文件系统下xml创建bean
    AnnotationConfigApplicationContext 主要是注解开发获取ioc中的bean实例

    2 FactoryBean 是spirng提供的工厂bean的一个接口

    FactoryBean 接口提供三个方法,用来创建对象,
    FactoryBean 具体返回的对象是由getObject 方法决定的。

    复制代码
    */
    public interface FactoryBean<T> {
    
    //创建的具体bean对象的类型
        @Nullable
        T getObject() throws Exception;
    
     //工厂bean 具体创建具体对象是由此getObject()方法来返回的
        @Nullable
        Class<?> getObjectType();
        
      //是否单例
        default boolean isSingleton() {
            return true;
        }
    
    }
    复制代码

    创建一个FactoryBean 用来生产User对象

    复制代码
    @Component
    public class FactoryBeanTest implements FactoryBean<User> {
    
    
        //创建的具体bean对象的类型
        @Override
        public Class<?> getObjectType() {
            return User.class;
        }
    
    
        //是否单例
        @Override
        public boolean isSingleton() {
            return true;
        }
    
        //工厂bean 具体创建具体对象是由此getObject()方法来返回的
        @Override
        public User getObject() throws Exception {
            return new User();
        }
    }
    复制代码

    Junit测试

    复制代码
    @RunWith(SpringRunner.class)
    @SpringBootTest(classes = {FactoryBeanTest.class})
    @WebAppConfiguration
    public class SpringBootDemoApplicationTests {
        @Autowired
        private ApplicationContext applicationContext;
    
        @Test
        public void tesst() {
            FactoryBeanTest bean1 = applicationContext.getBean(FactoryBeanTest.class);
            try {
                User object = bean1.getObject();
                System.out.println(object==object);
                System.out.println(object);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    复制代码

    结果

    true
    User [id=null, name=null, age=0]

    简单的总结:

    BeanFactory是个bean 工厂,是一个工厂类(接口), 它负责生产和管理bean的一个工厂
    是ioc 容器最底层的接口,是个ioc容器,是spring用来管理和装配普通bean的ioc容器(这些bean成为普通bean)。
    FactoryBean是个bean,在IOC容器的基础上给Bean的实现加上了一个简单工厂模式和装饰模式,是一个可以生产对象和装饰对象的工厂bean,由spring管理后,
    生产的对象是由getObject()方法决定的(从容器中获取到的对象不是 “ FactoryBeanTest ” 对象)。
     
  • 相关阅读:
    316 Remove Duplicate Letters 去除重复字母
    315 Count of Smaller Numbers After Self 计算右侧小于当前元素的个数
    313 Super Ugly Number 超级丑数
    312 Burst Balloons 戳气球
    309 Best Time to Buy and Sell Stock with Cooldown 买股票的最佳时间含冷冻期
    Java 类成员的初始化顺序
    JavaScript 全局
    HTML字符实体
    Java中的toString()方法
    JavaScript 弹窗
  • 原文地址:https://www.cnblogs.com/liangmm/p/13252417.html
Copyright © 2011-2022 走看看