h

hitechr

V1

2022/08/02阅读:34主题:极客黑

【一知半解】spring核心接口

核心接口

BeanDefinition

表示bean的定义,用于spring生成bean对象,好比生成java对象,需要对应的class对象,class中需要记录,有哪些方法、有哪些字段、有哪些构造函数等,而BeanDefinition就好比是class,在BeanDefinition中有生成bean相关的一些参数,是否是原型的scope、是否延迟加载的lazy、是否允许实例化的abstractFlag,初始化要执行的方法initMethodName ,bean的类型beanClass的信息,同时还会记录依赖bean的dependsOn、是否允许作为候选bean的autowireCandidate等与其它bean相关联的信息。

实现类

BeanDefinition是一个接口,有众多的接口实现类,如AnnotatedGenericBeanDefinition、GenericBeanDefinition、RootBeanDefinition、ScannedGenericBeanDefinition

定义bean的方式

  1. 在xml文件 中 标签
  2. 通过@Component(@Service,@Controller)
  3. 通过@Bean
  4. 通过编程式定义Bean
BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(Object.class);
AbstractBeanDefinition beanDefinition = beanDefinitionBuilder.getBeanDefinition();

BeanDefinition的继承

spring容器中的大部分bean都是通过BeanDefinition来生成的,但并不是每个BeanDefinition都会生成bean,因为在BeanDefinition中有这样一个方法,判断当前BeanDefinition是否为抽象的,不生成实例化对象。

public interface BeanDefinition{
    boolean isAbstract();//返回此 bean 是否是“抽象的”,即不打算实例化。
}

可以利用此特性来让其它的一些bean来继承这个BeanDefinition

<bean id="abPerson" abstract="true" scope="prototype"><!--这个bean不需要实例化-->
    <property name="age" value="18"></property>
</bean>
<bean id="sam" class="org.example.beans.Person" parent="abPerson"><!--继承abPerson-->
    <property name="name" value="Sam"></property>
</bean>

BeanDefinitionRegistry

有了bean的定义BeanDefinition,但是这些BeanDefinition该如何管理呢?于是BeanDefinitionRegistry就诞生了,相当于一个注册表的功能,spring创建bean使用的BeanDefinition要经过这个注册表来注册。

public interface BeanDefinitionRegistry extends AliasRegistry {
    //注册一个BeanDefinition到内存中
    void registerBeanDefinition(String beanName, BeanDefinition beanDefinition)
            throws BeanDefinitionStoreException
;
    //从内存中移除beanName的BeanDefintion
    void removeBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;
    //根据名称获取一个BeanDefinition
    BeanDefinition getBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;
    //判断是否存在
    boolean containsBeanDefinition(String beanName);
    //获取所有的
    String[] getBeanDefinitionNames();
    //获取BeanDefinition的个数
    int getBeanDefinitionCount();
    //bean的名称是否已经使用了
    boolean isBeanNameInUse(String beanName);
}

BeanFactory

表示Bean的工厂,负责创建Bean对象,并提供获取Bean、判断bean是否存在相关API

public interface BeanFactory {
    String FACTORY_BEAN_PREFIX = "&";
    Object getBean(String name) throws BeansException;
    <T> getBean(String name, Class<T> requiredType) throws BeansException;
    <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);
}

继承关系图

  1. HierarchialBeanFactory 拥有获取父BeanFactory的功能
  2. ListableBeanFactory 拥有获取beanNames的功能

HierarchicalBeanFactory

public interface HierarchicalBeanFactory extends BeanFactory {

 /**
  * 返回父 bean 工厂,如果没有,则返回 null
  */

 BeanFactory getParentBeanFactory();
 boolean containsLocalBean(String name);

}

ListableBeanFactory

public interface ListableBeanFactory extends BeanFactory {
    boolean containsBeanDefinition(String beanName);//容器中是否有BeanDefinition的定义
    int getBeanDefinitionCount();//容器中BeanDefinition的个数
    String[] getBeanDefinitionNames();//返回容器中所有的BeanDefinition的名称
    String[] getBeanNamesForType(Class<?> type);//按类型获取容器中的BeanDefinition的名称
    String[] getBeanNamesForType(Class<?> type, boolean includeNonSingletons, boolean allowEagerInit);//按类型获取容器中的BeanDefinition的名称
    .....
}

ApplicationContext

ApplicationContext是一个接口,它实现了BeanFactory接口,拥有BeanFactory的所有功能,同时又继承了运行时环境的EnvironmentCapable、事件发布功能的ApplicationEventPublisher、国际化的MessageSource、获取父工厂的HierarchicalBeanFactory 、获取beanNames的ListableBeanFactory 、资源加载的ResourcePatternResolver

常用的实现类有AnnotationConfigApplicationContext、ClassPathXmlApplicationContext 、

与BeanFactory的区别

ApplicationContext继承了BeanFactory的功能,拥有创建Bean、获取Bean、获取BeanDefinition等的功能,同时又继续了事件发布、资源加载、国际化、获取环境变量等的功能

BeanFactoryPostProcessor

BeanFactory的后置处理器,干涉Bean的创建。BeanFactoryPostProcessor会在BeanDefinition创建好后,在实例化Bean前会调用其中的唯一的方法postProcessorBeanFactory,可能通过方法中的参数ConfigurableListableBeanFactory对象,对容器中的BeanDefintion进行修改或添加。整个过程就是在创建好BeanDefinition后,实例化Bean前进行的一个处理操作。

public interface BeanFactoryPostProcessor {
 void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException;
}

BeanDefinitionRegistryPostProcessor

public interface BeanDefinitionRegistryPostProcessor extends BeanFactoryPostProcessor {
 void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException;
}

BeanPostProcessor

bean的后置处理器,可以在bean实例化完后,在初始化前,及初始化后调用的方法,用于对bean的增强。

public interface BeanPostProcessor {
    //初始化前调用的
    Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException;
    //初始化后调用的
    Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException;
}

分类:

后端

标签:

后端

作者介绍

h
hitechr
V1