首页 > 其他分享 >IOC类图

IOC类图

时间:2023-05-11 11:44:31浏览次数:38  
标签:String beanFactory void 类图 接口 bean IOC throws

BeanFactory系列

DefaultListableBeanFactory

描述

BeanFactory

定义容器接口。
核心方法:

//从容器中获取bean
Object getBean(String name) throws BeansException;

HierarchicalBeanFactory

扩展容器的层次结构。
核心方法:

//获取父容器
BeanFactory getParentBeanFactory();

ListableBeanFactory

扩展容器的遍历功能,BeanFatory只能使用名称获取bean,ListableBeanFactory可以遍历容器中的bean。
核心方法:

//返回此类(包括子类)的bean,如果type为空,返回所有bean。
<T> Map<String, T> getBeansOfType(@Nullable Class<T> type) throws BeansException;
//返回此类(包括子类)的bean名称。
String[] getBeanNamesForType(@Nullable Class<?> type);

AutowireCapableBeanFactory

扩展自动装配功能,不过此接口一般不在应用中直接使用,也不太常用

SingletonBeanRegistry

该接口定义了共享单例bean实例的注册中心,提供注册单例bean到容器和从容器中获取单例bean的功能,BeanFactory的子类来做实现。
方法:

//注册单例Bean
void registerSingleton(String beanName, Object singletonObject);
//获取单例Bean
Object getSingleton(String beanName);

DefaultSingletonBeanRegistry

核心类,实现了SingletonBeanRegistry接口。实现注册bean,获取bean。
字段:各种map,存放bean

/** Cache of singleton objects: bean name to bean instance. */  
private final Map<String, Object> singletonObjects = new ConcurrentHashMap<>(256);  
  
/** Cache of singleton factories: bean name to ObjectFactory. */  
private final Map<String, ObjectFactory<?>> singletonFactories = new HashMap<>(16);  
  
/** Cache of early singleton objects: bean name to bean instance. */  
private final Map<String, Object> earlySingletonObjects = new HashMap<>(16);  
  
/** Set of registered singletons, containing the bean names in registration order. */  
private final Set<String> registeredSingletons = new LinkedHashSet<>(256);

FactoryBeanRegistrySupport

抽象类,继承DefaultSingletonBeanRegistry,提供FactoryBean的注册。
方法:

//获取FactoryBean创建的Object,不是FactoryBean本身对象
//最终调用object = factory.getObject();使用factory创建对象
protected Object getObjectFromFactoryBean(FactoryBean<?> factory, String beanName, boolean shouldPostProcess);

字段:存储factoryBean创建的对象,缓存的原因未知,具体使用场景未知

private final Map<String, Object> factoryBeanObjectCache = new ConcurrentHashMap<>(16);

ConfigurableBeanFactory

接口,继承HierarchicalBeanFactory, SingletonBeanRegistry接口。扩展对BeanFactory配置的功能,内部使用,不在应用程序中使用,应用中应该使用BeanFactory和ListableBeanFactory
核心方法:

void setParentBeanFactory(BeanFactory parentBeanFactory) throws IllegalStateException;
void addBeanPostProcessor(BeanPostProcessor beanPostProcessor);

ConfigurableListableBeanFactory

接口,继承ListableBeanFactory, AutowireCapableBeanFactory, ConfigurableBeanFactory接口,就当它是一个聚合接口吧,内部使用,使用场景未知。
方法:

BeanDefinition getBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;

AbstractAutowireCapableBeanFactory

核心类,抽象类,继承AbstractBeanFactory,实现AutowireCapableBeanFactory。实现了容器的基本功能,主要功能为创建bean。
核心方法:

public <T> T createBean(Class<T> beanClass) throws BeansException;
public Object initializeBean(Object existingBean, String beanName);

BeanDefinitionRegistry

接口,bean定义的注册。

void registerBeanDefinition(String beanName, BeanDefinition beanDefinition)  
throws BeanDefinitionStoreException;
void removeBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;
BeanDefinition getBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;

DefaultListableBeanFactory

核心类,继承AbstractAutowireCapableBeanFactory,实现ConfigurableListableBeanFactory, BeanDefinitionRegistry接口,实现一个较完善的BeanFacotry。

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

ApplicationContext系列

ClassPathXmlApplicationContext

ResourceLoader

加载资源相关

ApplicationContext

核心接口,继承ListableBeanFactory,拥有访问BeanFactory的功能,继承ResourceLoader,拥有加载资源的能力。
方法:

ApplicationContext getParent();
// 暴露AutowireCapableBeanFactory
AutowireCapableBeanFactory getAutowireCapableBeanFactory() throws IllegalStateException;

Lifecycle

生命周明接口

void start();
void stop();
boolean isRunning();

ConfigurableApplicationContext

接口,提供配置ApplicationContext的功能。接口注释中提到此接口是SPI接口,不太懂。
方法:

void setParent(@Nullable ApplicationContext parent);
void setEnvironment(ConfigurableEnvironment environment);
//添加BeanFactoryPostProcessor
void addBeanFactoryPostProcessor(BeanFactoryPostProcessor postProcessor);
//加载或刷新配置,初始化BeanFactory
void refresh() throws BeansException, IllegalStateException;

AbstractApplicationContext

ApplicationContext的实现,使用模板模式(主要是refresh方法)。
核心方法:

public void refresh() throws BeansException, IllegalStateException {  

    synchronized (this.startupShutdownMonitor) {  
        // Prepare this context for refreshing.  
        prepareRefresh();  
        // Tell the subclass to refresh the internal bean factory.  
        ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();  
        // Prepare the bean factory for use in this context.  
        prepareBeanFactory(beanFactory);  
        try {  
            // Allows post-processing of the bean factory in context subclasses.  
            postProcessBeanFactory(beanFactory);  
            // Invoke factory processors registered as beans in the context.  
            invokeBeanFactoryPostProcessors(beanFactory);  
            // Register bean processors that intercept bean creation.  
            registerBeanPostProcessors(beanFactory);  
            // Initialize message source for this context.  
            initMessageSource();  
            // Initialize event multicaster for this context.  
            initApplicationEventMulticaster();  
            // Initialize other special beans in specific context subclasses.  
            onRefresh();  
            // Check for listener beans and register them.  
            registerListeners();  
            // Instantiate all remaining (non-lazy-init) singletons.  
            finishBeanFactoryInitialization(beanFactory);  
            // Last step: publish corresponding event.  
            finishRefresh();  
        }  
        catch (BeansException ex) {  
            if (logger.isWarnEnabled()) {  
            logger.warn("Exception encountered during context initialization - " +  
            "cancelling refresh attempt: " + ex);  
        }  
        // Destroy already created singletons to avoid dangling resources.  
        destroyBeans();  
        // Reset 'active' flag.  
        cancelRefresh(ex);  
        // Propagate exception to caller.  
        throw ex;  
        }  
        finally {  
        // Reset common introspection caches in Spring's core, since we  
        // might not ever need metadata for singleton beans anymore...  
        resetCommonCaches();  
        }  
    }  
}

refresh核心步骤

//创建BeanFactory,new一个DefaultListableBeanFactory
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();  
//执行BeanFactoryPostProcessor,对容器后置处理
//BeanFactoryPostProcessor接口只有postProcessBeanFactory,没有前置处理方法
invokeBeanFactoryPostProcessors(beanFactory);  
//注册BeanPostProcessor
//从容器中遍历BeanPostProcessor,注册到容器
registerBeanPostProcessors(beanFactory);
//完成beanFactory初始化,最重要是的实例化单例bean
//通过调用beanFactory的preInstantiateSingletons(),此方法有DefaultListableBeanFactory实现,是核心方法
finishBeanFactoryInitialization(beanFactory);

AbstractRefreshableApplicationContext

抽象类,AbstractApplicationContext的实现。
主要实现刷新(包括第一次刷新,即启动)容器的功能:

  1. 刷新BeanFatory,如果已存在,则删除重新创建BeanFactory
  2. 加载不同配置(xml,文件,等)到BeanFactory
    方法:
// 实现了父类AbstractApplicationContext中的刷新容器方法
protected final void refreshBeanFactory() throws BeansException;
// 加载bean定义到BeanFactory
protected abstract void loadBeanDefinitions(DefaultListableBeanFactory beanFactory)  
throws BeansException, IOException;

Aware

标记接口,无任何方法,只是作为标记,有时候很有用。
Aware的作用是标识bean有可以回调来从容器中获取某种信息。

BeanNameAware

从容器中获取beanName

// 并不是设置name,参数的name是容器暴露出来的,用于我们使用
void setBeanName(String name);

InitializingBean

接口,由bean来实现,在bean的属性被设置后调用,处理自定义的初始化操作

void afterPropertiesSet() throws Exception;

AbstractRefreshableConfigApplicationContext

抽象类,设置配置文件路径

public void setConfigLocation(String location);

AbstractXmlApplicationContext

抽象类,处理xml类型的配置文件加载解析

ClassPathXmlApplicationContext

提供参数为xml配置文件路径的构造方法

AnnotationConfigApplicationContext

注解AnnotationConfigApplicationContext并不是继承AbstractRefreshableApplicationContext或AbstractRefreshableConfigApplicationContext,而是继承的AbstractApplicationContext,AbstractApplicationContext中有最核心的refresh流程

GenericApplicationContext

通用ApplicationContext实现,它持有单个内部DefaultListableBeanFactory实例。ClassPathXmlApplicationContext并没有继承自此类,但是此类也可以用于读取xml配置文件做ApplicationContext。此类可用于自定义的ApplicationContext。
典型的用法是通过BeanDefinitionRegistry接口注册各种bean定义,然后调用refresh()初始化这些bean。
使用示例:

GenericApplicationContext ctx = new GenericApplicationContext();
XmlBeanDefinitionReader xmlReader = new XmlBeanDefinitionReader(ctx);
xmlReader.loadBeanDefinitions(new ClassPathResource("applicationContext.xml"));
PropertiesBeanDefinitionReader propReader = new PropertiesBeanDefinitionReader(ctx);
propReader.loadBeanDefinitions(new ClassPathResource("otherBeans.properties"));
ctx.refresh();

MyBean myBean = (MyBean) ctx.getBean("myBean");

方法:

public void registerBeanDefinition(String beanName, BeanDefinition beanDefinition)  
throws BeanDefinitionStoreException;

AnnotationConfigRegistry

用于注释配置应用程序上下文的公共接口,定义注册和扫描方法。

//注册带注解的类
void register(Class<?>... annotatedClasses);
void scan(String... basePackages);

AnnotationConfigApplicationContext

注解配置ApplicationContext
方法:

// 使用时就是调用构造方法,构造方法中传入配置类,然后注册配置中的bean,refresh
//this()无参构造,会注册一个ConfigurationClassPostProcessor,来处理@Configuration,@Bean,@Import等注解,把注入的bean注册到容器中
public AnnotationConfigApplicationContext(Class<?>... annotatedClasses) {  
	this();  
	register(annotatedClasses);  
	refresh();  
}

标签:String,beanFactory,void,类图,接口,bean,IOC,throws
From: https://www.cnblogs.com/assembly--/p/17390580.html

相关文章

  • IOC容器-Autofac
    Autofac是第三方IOC容器,是当前最流行的IOC容器。1.容器创建对象//创建一个容器建造者ContainerBuildercontainerBuilder=newContainerBuilder();//注册普通类containerBuilder.RegisterType<Honer>();//build一下,得到一个容器IContainercontainer=containerBuild......
  • IoC入门案例
    跟着黑马,简单写一个小的测试程序,学习一下IoC第一步,导入Spring的坐标Spring-context,对应的版本是2.1.10.RELEASE黑马刚开篇讲的是,springframework,需要用到这个maven依赖<dependency><groupId>org.springframework</groupId><artifactId>spring-conte......
  • 【SSH】SSH框架(三)——Spring IOC和AOP的容器框架
    一、前言      在上一篇博客《【SSH】SSH框架(二)——Struts2框架的简单认识》中小编向大家简单的介绍了SSH框架中的第一个S,也就是Struct2。接下来小编将会向大家分享第二个S——Spring。二、Spring是干什么用的?      其实在小编以前做过的项目中也使用过Spring,那个时候......
  • 将第三方的bean交给spring的IOC容器管理
    示例:比如要使用一个第三方的雪花算法1.先导入需要的依赖<dependency><groupId>wiki.xsx</groupId><artifactId>snowflake-spring-boot-starter</artifactId><version>1.2.2</version></depe......
  • UML类图——类之间的关系
    关联关系(实线箭头)是一种结构化关系,表示一类对象与另一类对象之间有联系。Java,c++,c#等编程语言在实现关联关系时,通常将一个类的对象作为另一个类的属性-双向关联-单向关联-自关联-多重性关联聚合关系(带空心菱形的实线箭头)表示一个整体与部分之间的关系,在聚合关......
  • Spring 的 IoC(控制反转)
    IoC是InversionofControl的简写,译为“控制反转”,它不是一门技术,而是一种设计思想,也是一个概念,同时是一个重要的面向对象编程法则,能够指导我们如何设计出松耦合、更优良的程序。在这里说IoC之前,你需要完全理解一个概念DI(依赖注入)。 当你理解依赖注入以后,对控制反转就非常简......
  • UML图之类图
    https://www.jianshu.com/p/a237f96e2292 最近在学习领域驱动设计,重新温习了一下UML图。定义:UML是一种面向对象系统的产品进行说明、可视化和编制文档的一种标准语言,是非专利的第三代建模和规约语言,UML使用面向对象的建模工具,但独立于任何程序设计语言UML绘图规范: im......
  • IOCP
    本文主要探讨一下windows平台上的完成端口开发及其与之相关的几个重要的技术概念,这些概念都是与基于IOCP的开发密切相关的,对开发人员来讲,又不得不给予足够重视的几个概念:1)基于IOCP实现的服务吞吐量2)IOCP模式下的线程切换3)基于IOCP实现的消息的乱序问题。 一、IOCP简介 ......
  • 4.Spring中IOC创建对象的两种方式和创建时机
    https://blog.csdn.net/jike11231/article/details/116357864 创建时机1:默认的在Spring容器启动的时候2:在getBean的时候创建对象(就是拿到配置文件中的标识符的时候创建对象)在Spring的配置文件bean中有一个属性lazy-init=“default/true/false”(1)如果lazy-init为"default/f......
  • spring IoC和DI
    IoC控制反转IoC是InversionofControl的缩写。他是一种软件设计原则,用于减少代码之间的耦合度。在IoC中,对象不在负责管理和创建他们依赖的对象,而是将这些任务交给外部容器,来完成。这样做可以使代码更加松散耦合,更容易扩展和维护。控制反转的主要思想是将对象的创建和管理交给Io......