漫谈ApplicationContext和BeanFactory的区别

各位大佬光临寒舍,希望各位能赏脸给个三连,谢谢各位大佬了!!! 

目录

    1.背景介绍    

2.细述ApplicationContext和BeanFactory

3.总结


    1.背景介绍    

        当我们使用SpringBoot创建项目的时候会看到一串代码:

@SpringBootApplication
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}

这串代码就是SpringBoot的启动类,使用@SpringBootApplication修饰。其中

SpringApplication.run(DemoApplication.class, args);

这串代码会让Spring Boot自动扫描并加载所有带有特定注解的类,并自动配置应用程序所需的各种组件。这也就是Spring Boot应用程序的入口,就类似于我们平时写的main入口或者是多线程写的run方法的入口,都算是回调函数。

而这行代码的返回值的类型就是ConfigurableApplicationContext,我们可以用ApplicationContext(ConfigurableApplicationContext的父类)来接收,属于是向上转型,有利于实现低耦合,并且ApplicationContext更加轻量。

2.细述ApplicationContext和BeanFactory

在源码中我们能看到ApplicationContext继承了BeanFactory接口,所以ApplicationContext拥有BeanFactory所有的功能。

那BeanFactory拥有什么功能呢?以下是源码部分:

public interface BeanFactory {
    String FACTORY_BEAN_PREFIX = "&";

    Object getBean(String var1) throws BeansException;

    <T> T getBean(String var1, Class<T> var2) throws BeansException;

    Object getBean(String var1, Object... var2) throws BeansException;

    <T> T getBean(Class<T> var1) throws BeansException;

    <T> T getBean(Class<T> var1, Object... var2) throws BeansException;

    <T> ObjectProvider<T> getBeanProvider(Class<T> var1);

    <T> ObjectProvider<T> getBeanProvider(ResolvableType var1);

    boolean containsBean(String var1);

    boolean isSingleton(String var1) throws NoSuchBeanDefinitionException;

    boolean isPrototype(String var1) throws NoSuchBeanDefinitionException;

    boolean isTypeMatch(String var1, ResolvableType var2) throws NoSuchBeanDefinitionException;

    boolean isTypeMatch(String var1, Class<?> var2) throws NoSuchBeanDefinitionException;

    @Nullable
    Class<?> getType(String var1) throws NoSuchBeanDefinitionException;

    @Nullable
    Class<?> getType(String var1, boolean var2) throws NoSuchBeanDefinitionException;

    String[] getAliases(String var1);
}

 我们可以看到,在BeanFactory中基本都是对Bean的一些获取属性的一类操作。所以ApplicationContext拥有上面看到的所有内容。并且加入了很多额外的功能,我们看源码可知:

public interface ApplicationContext extends EnvironmentCapable, ListableBeanFactory, HierarchicalBeanFactory, MessageSource, ApplicationEventPublisher, ResourcePatternResolver 

其中加入了MessageSource(国际化的消息访问),ApplicationEventPublisher(事件传递),ResourcePatternResolver(资源加载)。并且BeanFactory和ApplicationContext的最大区别就是ApplicationContext采用的是预加载,它在启动时就把所有的Bean都进行加载,所以启动时间久,但是之后的运行就迅速,不再需要加载Bean,类似于线程池。而BeanFactory采用的是懒加载,它会在使用Bean的时候再加载Bean,这会使运行过程中第一次遇到Bean时会有所卡顿。因为现在的硬盘不值钱了,内存也越来越大,所以现在基本使用的都是ApplicationContext的预加载。

3.总结

总的来说ApplicationContext的功能更加强大更符合当今需求,相比于ConfigurableApplicationContext又更加轻量,所以在当今时代来讲,ApplicationContext是优于BeanFactory的,但是并不是绝对,因为有些场景我们需要启动的快些,不看重运行时的绝对流畅就可以使用BeanFactory。它俩是各有千秋的。

制作不易,望各位大佬赏个脸,给个三连吧!!谢谢各位大佬了!!!

  • 45
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值