hitechr
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的方式
-
在xml文件 中 标签 -
通过@Component(@Service,@Controller) -
通过@Bean -
通过编程式定义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> 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);
}
继承关系图

-
HierarchialBeanFactory 拥有获取父BeanFactory的功能 -
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;
}
作者介绍