b04-4 spring中BeanFactory和ApplicationContext讲解(精通Spring 4.x)

  • Bean工厂是Spring框架最和谐的接口,提供了IOC的机制。BeanFactory使管理不同类型的java对象成为可能,应用上下文建立在BeanFactory基础上提供了更多面向应用的功能,提供了国际支持和框架事件体系。
  • BeanFactory称为IOC容器,ApplicationContext称为应用上下文。
用途划分:
  • 1、BeanFactory是Spring框架的基础设施面向Spring本身。
  • 2、ApplicationContext面向使用Spring框架的开发者,几乎所有的场合都可以使用。

一、BeanFactory介绍:

  • BeanFactory是类的工厂类,可以创建并管理各种对象。Spring中的bean比javaBean更宽泛,所有被Spring容器实例化并管理的java类都可以称为Bean。

1.1、BeanFactory的类体系

1、BeanFactory接口主要的方法是:
  • getBean(String beanName):此方法从容器中返回特定名称的Bean
2、ListableBeanFactory:
  • 此接口定义了访问容器中Bean基本信息的方法如:查看bean的个数,获取某一类型Bean的配置名,查看容器中是否包含某一bean
3、hierarchicalBeanFactory:
  • 父子级联Ioc容器的接口,子容器可以通过接口方法访问父容器
4、ConfigurableBeanFactory:
  • 一个主要的接口,增强了Ioc容器的可定制性。定义了设置类装载器、属性编辑器,容器初始化后置处理器等方法。
5、AutowireCapableBeanFactory:
  • 定义了容器中的Bean按照某种规则进行自动装配方法
6、SingleBeanRegistry:
  • 定义了允许在运行期向容器注册实例Bean的方法
7、BeanDefinitionRegistry:
  • 用于描述Bean的配置信息:Spring配置文件中的每一个节点元素在Spring容器里都通过一个BeanDefinition对象表示。
  • 接口提供了想容器手工注册BeanDefinition对象的方法

1.2、初始化BeanFactory

1、BeanFactory初始化:
  • 创建Spring 的配置文件配置Bean的配置信息,通过BeanFactory装载配置文件启动SpringIoc容器。
2、XmlBeanDefinitionReader
  • 通过Resource装载配置信息并启动IOC容器,就可以通过BeanFactory#getBean(beanName)从容器获取Ben啊

二、ApplicationContext

  • ApplicationContext是由BeanFactory派生出来,提供了更多面向实际应用的功能。
    在BeanFactory中很多功能需要采代码方式实现,在ApplicationContext中可以通过配置方式实现

2.1、ApplicationContext类体系结构

  • 主要实现类是:ClassPathXmlApplicationContext和FileSystemXmlApplicationContext
  • 一个从类路径加载配置文件,一个从文件系统中加载配置文件。
public interface ApplicationContext extends EnvironmentCapable, ListableBeanFactory, HierarchicalBeanFactory, MessageSource, ApplicationEventPublisher, ResourcePatternResolver {
    String getId();
​
    String getApplicationName();
​
    String getDisplayName();
​
    long getStartupDate();
​
    ApplicationContext getParent();
​
    AutowireCapableBeanFactory getAutowireCapableBeanFactory() throws IllegalStateException;
}
  • ApplicationContex 继承了HierarchicalBeanFactory和ListableBeanFactory接口,并通过其他接口扩展了BeanFactory功能,如下接口
1、ApplicationEventPublisher:
  • 1、让容器拥有发布应用上下文事件的功能,包括容器启动事件,关闭事件。、
  • 2、实现了ApplicationListener事件监听接口的Bean可以接受容器事件,并对事件进行响应处理。
  • 3、在ApplicationContext查询实现类AbstractApplicationContext中操作一个ApplicationEventMulticater,负责保存所有的监听,以便在容器产生上下文事件通知这些事件监听者。
public interface ApplicationEventPublisher {
    void publishEvent(ApplicationEvent var1);
​
    void publishEvent(Object var1);
}
2、MessageSource:为应用提供il8n国际化消息访问功能
public interface MessageSource {
    String getMessage(String var1, Object[] var2, String var3, Locale var4);
​
    String getMessage(String var1, Object[] var2, Locale var3) throws NoSuchMessageException;
​
    String getMessage(MessageSourceResolvable var1, Locale var2) throws NoSuchMessageException;
}
3、ResourcePatternResolver:
  • 所有ApplicationContext实现类都实现了类似于PathMatchingResourcePatternResolver的功能,可以通过带前缀的Ant发个的资源文件路径装载Spring的配置文件。
4、LifeCycler:
  • 该接口提供了start()和stop()两个方法,用于控制异步处理过程。具体使用时,该接口同时被ApplicationContext实现及具体Bean实现,ApplicationContext会将start/stop的信息传递给容器中所有实现了该接口的bean,达到管理和=控制JMX,任务调度等目的。
5、ConfigurableApplicationContext扩展与ApplicationContext,新增了两个主要的方法:refresh(),close()。让ApplicationContext具有启动,刷新,关闭应用上下文的能力。
  • refresh():在应用上下文关闭的情况下调用可以启动应用上下文。在启动的状态下调用则可清楚缓存并重新加载配置信息。
  • close():关闭应用上下文。

2.2、ApplicationContext初始化

  • ApplicationContext初始化也简单,可以直接使用ClassPathXmlApplicationContext实现。
ApplicationContext ctx = new ClassPathXmlApplicationContext("com/demo/bean.xml");
​
ApplicationContext ctx = new FileSystemXmlApplicationContext("com/demo/bean.xml");
说明:
  • Path路径:”com/demo/bean.xml”等于”classpath:com/demo/bean.xml”
  • File路径:”com/demo/bean.xml”等于”file:com/demo/bean.xml”
FileSystemXmlApplicationContext和ClassPathXmlApplicationContext的区别:
  • 都可以显示使用带资源类型前缀路径,区别在于如果不显示指定资源类型前缀,则分别将路径解析为文件系统和类路径。
  • 得到ApplicationContext实例后就可以像BeanFactory一样调用getBean(beanName)
ApplicationContext和BeanFactory初始化的区别:
  • BeanFactory在初始化容器没有实例化Bean,直到访问Bean时才初始化
  • ApplicationContext则在初始化按上下文时就实例化所有单例的Bean。

2.3、WebApplicationContext类体系结构

1、WebApplicationContext
  • 1、是专门为Web应用准备的,运行从先对于Web根目录的路径装载配置文件完成初始化工作。
  • 2、从WebApplicationContext中可以获得ServletContext引用,这个web引用上下文对象将作为属性放到ServletContext中。Spring可以通过WebApplicationContextUtils#getWebApplicationContext(ServletContext)获取WebApplicationContext实例

    • 3、在非web环境下,Bean只有singleton和prototype两种作用域,WebApplicationContextwebBean添加了3个作用域:Request,Session,global session
  • 4、web应用比一般的应用拥有更多的特性,WebApplicationContext扩展了ApplicationContext。

  • 5、WebApplicationContext定义了一个常量在上下文启动时将此常量作为键放在ServletContext的属性列表中,可以从web容器总获取
WebApplicationContext mac = (WebApplicationContext) servletContext.getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);
  • 6、与WebApplicationContextUtils工具类getWebApplicationContext(ServletContext sc)方法的内部实现方式。这样Spring的web应用上下web和web容器应用上下文就可以实现相互访问。
2、ConfigurableWebApplicationContext
  • 扩展了WebApplicationContext,允许通过配置的方式实例化WebApplicationContext,有两个重要方法
  • 1、setServletContext(ServletContext servletContext):为Spring设置web应用上下文
  • 2、setConfigLocations(String[ ] configLocation):设置Spring配置文件地址一般为WEB-INF文件夹下,用户可以自定义,如:classpath:com/demo/bean.xml
3、WebApplicationContext初始化
  • WebApplicationContext的初始化需要ServletContext实例,Spring分别提供了用于启动WebApplicationContext的Servlet和Web容器监听器:ContextLoaderServlet,ContextLoaderListener
    两个监听器内部都实现了启动WebApplicationContext实例的逻辑,只需要工具web容器的具体情况选择其中一个并在web.xml中配置即可。

三、Spring父子容器

  • 通过HierarchicalBeanFactory接口Spring的ioc容器可以建立父子关联的容器体系,子容器可以访问父容器中的Bean父容器不能访问子容器中的Bean。
  • 容器中Bean的id必须是唯一的,子容器可以拥有一个和父容器系统的bean。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值