首页 > 技术文章 > Spring中一些概念的总结

lanqingzhou 2020-08-31 21:56 原文

 

Spring中一些概念的总结

对象和Bean的区别?

 

个人观点:所谓的bean也是一个java对象,只不过这个对象是通过spring定义的,而一开始就是通过<bean>标签定义的,所以叫做bean。

 

普通对象和Bean对象还有其他区别,因为Bean对象是由Spring生成的,Spring在生成Bean对象的过程中,会历经很多其他步骤,比如属性注入,aop,new实例,调用初始化方法。

 

如何理解BeanDefinition?

顾名思义,BeanDefinition是用来描述一个Bean的,Spring会根据BeanDefinition来生成一个Bean。

 

BeanFactory和FactoryBean的区别

 

BeanFactory

BeanFactory是Spring IOC容器的顶级接口,其实现类有XMLBeanFactory,DefaultListableBeanFactory以及AnnotationConfigApplicationContext等。BeanFactory为Spring管理Bean提供了一套通用的规范。接口中提供的一些方法如下:

boolean containsBean(String beanName)

Object getBean(String)

Object getBean(String, Class)

Class getType(String name)

boolean isSingleton(String)

String[] getAliases(String name)

 

可以通过BeanFactory获得Bean。

 

FactoryBean

FactoryBean首先也是一个Bean,但不是简单的Bean,而是一个能生产对象的工厂Bean,可以通过定义FactoryBean中的getObject()方法来创建生成过程比较复杂的Bean。

 

如何理解BeanFactoryPostProcessor?

BeanFactoryPostProcessor也叫做BeanFactory后置处理器。这里包括两个概念,一个是BeanFactory,一个是后置处理器。

 

BeanFactory表示Bean工厂,可以基于BeanDefinition来生成Bean对象,所以在BeanFactory中存在所有的BeanDefinition。

后置处理器可以理解为:当某物品生产好了以后,可以进一步通过后置处理器来对此物品进行处理。

 

所以BeanFactoryPostProcessor可以理解为,可以得到BeanFactory对象并对它进行处理,比如修改它其中的某个BeanDefinition,或者直接向BeanFactory中添加某个对象作为bean。

 

如何理解BeanDefinitionRegistryPostProcessor?

BeanDefinitionRegistryPostProcessor是一个接口,继承了BeanFactoryPostProcessor,所以它也是一个BeanFactory后置处理器,所以它可以操作BeanFactory。

 

它特殊的地方在于,它拥有的功能比BeanFactoryPostProcessor多,比如BeanFactoryPostProcessor是不能向BeanFactory中添加BeanDefinition的(只能添加Bean对象),但是BeanDefinitionRegistryPostProcessor是可以向BeanFactory中添加BeanDefinition的。

 

如何理解@Import与ImportBeanDefinitionRegistrar?

Import注解

@Import首先是一个注解,在Spring中是用来向Spring容器中导入Bean的。换个角度理解,就是我们一般都是通过在某个类上加上@Component注解来标志一个bean的,但如果我们希望以一种更灵活的方式去定义bean的话,就可以利用@Import注解。

 

@Import注解所指定的类,在Spring启动过程中会对指定的类进行判断,判断当前类是不是实现了比较特殊的接口,比如ImportBeanDefinitionRegistrar,如果存在特殊的接口就执行特殊的逻辑,如果没有则生成该类对应的BeanDefinition并放入BeanFactory中。

 

ImportBeanDefinitionRegistrar

通过Import注解可以注册bean,虽然它也支持同时注册多个bean,但是不方便,特别是当我们想通过实现一些复杂逻辑来注册bean的话,仅仅通过Import注解是不方便的,这时就可以使用ImportBeanDefinitionRegistrar这个接口来动态的注册bean了,我这里说的注册bean指的是:通过生成BeanDefinition,并且把BeanDefinition放入BeanFactory中。

 

 

如何理解BeanDefinitionRegistry和BeanFactory?

 

BeanFactory表示Bean工厂,可以利用BeanFactory来生成bean。

BeanDefinitionRegistry表示BeanDefinition的注册表,可以用来添加或移除BeanDefinition。

 

 

 

推荐阅读