各位大佬光临寒舍,希望各位能赏脸给个三连,谢谢各位大佬了!!!
目录
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。它俩是各有千秋的。
制作不易,望各位大佬赏个脸,给个三连吧!!谢谢各位大佬了!!!