0
点赞
收藏
分享

微信扫一扫

Spring学习笔记——Spring IOC容器

是归人不是过客 2022-04-14 阅读 123
javaspring

Spring IOC容器

BeanFactory 容器

BeanFactory采用懒加载(lazy-load)所以容器启动比较快,对象在第一次调用时才会被加载,BeanFactory提供容器最基本的功能,BeanFactory也可以说是一个管理Bean的工厂,主要负责初始化各种Bean,并调用其生命周期的方法。

最常见的实现类: org.springframework.beans.factory.xml.XmlBeanFactory,使用XmlBeanFactory类的构造函数来传递Resource对象。如:

Resource resource = new ClassPathResource("applicationContext.xml");
BeanFactory factory = new XmlBeanFactory(resource);

//获取文件
File file = new File("fileSystemconfig.xml");
Resource resource = new FileSystemResource(file);
BeanFactory beanFactory = new XmlBeanFactory(resource);

BeanFactory源码

package org.springframework.beans.factory;

public interface BeanFactory {

    /**
     * 用来引用一个实例,或把它和工厂产生的Bean区分开,就是说,如果一个FactoryBean的名字为a,那么,&a会得到那个Factory
     */
    String FACTORY_BEAN_PREFIX = "&";

    /*
     * 四个不同形式的getBean方法,获取实例
     */
    Object getBean(String name) throws BeansException;

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

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

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

    boolean containsBean(String name); // 是否存在

    boolean isSingleton(String name) throws NoSuchBeanDefinitionException;// 是否为单实例

    boolean isPrototype(String name) throws NoSuchBeanDefinitionException;// 是否为原型(多实例)

    boolean isTypeMatch(String name, Class<?> targetType)
            throws NoSuchBeanDefinitionException;// 名称、类型是否匹配

    Class<?> getType(String name) throws NoSuchBeanDefinitionException; // 获取类型

    String[] getAliases(String name);// 根据实例的名字获取实例的别名
}

ApplicationContext 容器

ApplicationContext继承了BeanFactory接口,对象在启动容器时加载,在BeanFactory中许多功能要用编程方式来实现,但是ApplicationContext则可以使用注解来实现,ApplicationContext在BeanFactory的基础上增加支持了一些企业级功能

  1. MessageSource,提供国际化的消息访问

  2. ResourceLoader,资源访问,如:URL和文件

  3. 事件传播性,即支持AOP特性

  4. 载入多个有继承关系的上下文,使得每一个上下文都专注于一个特定的层次,比如应用的web层

常用获取ApplicationContext方法

FileSystemXmlApplicationContext:从文件系统或者url指定的xml配置文件创建,参数为配置文件名或文件名数组,有相对路径与绝对路径

ApplicationContext factory=new FileSystemXmlApplicationContext("src/applicationContext.xml");
ApplicationContext factory=new FileSystemXmlApplicationContext("E:/Workspaces/MyEclipse 8.5/Hello/src/applicationContext.xml");

ClassPathXmlApplicationContext:从classpath的xml配置文件创建,可以从jar包中读取配置文件。ClassPathXmlApplicationContext 编译路径总有三种方式:

ApplicationContext factory = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
ApplicationContext factory = new ClassPathXmlApplicationContext("applicationContext.xml"); 
ApplicationContext factory = new ClassPathXmlApplicationContext("file:E:/Workspaces/MyEclipse 8.5/Hello/src/applicationContext.xml");

二者的共同点

都是通过XML配置文件来加载Bean的。

二者的不同点

  1. BeanFactory采用的是延迟加载(懒加载)形式来注入Bean的,即只有在使用到某个Bean时(即调用Bean时),才会对该Bean进行加载,这样的加载形式不能忘发现一些存在Spring中的配置错误。而ApplicationContext则是在容器启动时,一次性创建所有的Bean,这样的加载形式可以在容器启动时就发现Spring存在的配置错误。而不足点在于比较占用内存空间,当配置Bean较多时,程序启动较慢。

  2. BeanFactory和ApplicationContext都支持BeanPostProcessor(后置处理器)、BeanFactoryPostProcessor的使用,但两者之间的区别是:BeanFactory需要手动注册,而ApplicationContext则是自动注册。(Applicationcontext比 BeanFactory 加入了一些更好使用的功能。而且 BeanFactory 的许多功能需要通过编程实现而 Applicationcontext 可以通过配置实现。比如后处理 Bean , Applicationcontext 直接配置在配置文件即可而 BeanFactory 这要在代码中显示的写出来才可以被容器识别。 )

    BeanPostProcessor和BeanFactoryPostProcessor的区别参考网址:Spring的BeanFactoryPostProcessor和BeanPostProcessor_江南好风景的博客-CSDN博客_beanpostprocess

  3. BeanFactory主要是面对与 spring 框架的基础设施,面对 spring 自己。而 Applicationcontex 主要面对与 spring 使用的开发者。所以基本都会使用 Applicationcontex 。

举报

相关推荐

0 条评论