1.BeanFactory和ApplicationContext之间的区别:
BeanFactory是Spring框架中IoC容器的顶层接⼝,它只是⽤来定义⼀些基础功能,定义⼀些基础规范,⽽ApplicationContext是它的⼀个⼦接⼝,所以ApplicationContext是具备BeanFactory提供的全部功能的。
通常,我们称BeanFactory为SpringIOC的基础容器,ApplicationContext是容器的⾼级接⼝,⽐BeanFactory要拥有更多的功能,⽐如说国际化⽀持和资源访问(xml,java配置类)等等。
BeanFactory主要API介绍:
- getBean(String name): Spring容器中获取对应Bean对象的方法,如存在,则返回该对象
- containsBean(String name):Spring容器中是否存在该对象
- isSingleton(String name):通过beanName是否为单例对象
- isPrototype(String name):判断bean对象是否为多例对象
- isTypeMatch(String name, ResolvableType typeToMatch):判断name值获取出来的bean与typeToMath是否匹配
- getType(String name):获取Bean的Class类型
- getAliases(String name):获取name所对应的所有的别名
FactoryBean:
BeanFactory接⼝是容器的顶级接⼝,定义了容器的⼀些基础⾏为,负责⽣产和管理Bean的⼀个⼯⼚,具体使⽤它下⾯的⼦接⼝类型,⽐如ApplicationContext;此处我们重点分析FactoryBean。
Spring中Bean有两种,⼀种是普通Bean,⼀种是⼯⼚bean(FactoryBean),FactoryBean可以⽣成某⼀个类型的Bean实例(返回给我们),也就是说我们可以借助于它⾃定义Bean的创建过程。Bean创建的三种⽅式中的静态⽅法和实例化⽅法和FactoryBean作⽤类似,FactoryBean使⽤较多,尤其在Spring框架⼀些组件中会使⽤,还有其他框架和Spring框架整合时使⽤
FactoryBean使用案例:
定义一个Company实体类
定义一个CompanyFactoryBean来创建Company这个bean,该类实现FactoryBean接口,重写getObject方法。
在xml配置文件声明这个创建Company的工厂bean,然后对companyInfo赋值,这样我们在创建Company这个bean的细节就可以控制在自己手里。
写一个测试类getBean看下效果
2.Aware接口以及后置处理器
先附一张spring生命周期的流程图,在该图的第一步之前还涉及到BeanDefinition对象,该对象就是将一个一个在xml配置文件配置的bean标签封装成为一个个beanDefinition对象。(类名、scope、属性、构造函数参数列表、依赖的bean、是否是单例类、是否是懒加载等),Spring容器启动的过程中,会将Bean解析成Spring内部的BeanDefinition结构,其实就是将Bean的定义信息存储到这个BeanDefinition相应的属性中,后⾯对Bean的操作就直接对BeanDefinition进⾏,例如拿到这个BeanDefinition后,可以根据⾥⾯的类名、构造函数、构造函数参数,使⽤反射进⾏对象创建。
BeanDefinition主要api介绍:
2.1 Aware接口:
Aware英文意思是发现的意思,该接口下很有多高级接口xxxAware,实现这些高级接口能获取到相应的Aware前缀xxx的spring组件的xxx对象。例如:
BeanNameAware: 可以拿到注册Result为bean时定义的bean id
BeanFactoryAware: 获取工厂类的信息
ApplicationContextAware: 可以获取更高级的一个容器接口ApplicationContext
2.2后置处理器BeanPostProcessor和BeanFactoryPostProcessor
Spring提供了两种后处理bean的扩展接⼝,分别为 BeanPostProcessor 和
BeanFactoryPostProcessor,两者在使⽤上是有所区别的。⼯⼚初始(BeanFactory)—> Bean对象在BeanFactory初始化之后可以使⽤BeanFactoryPostProcessor进⾏后置处理做⼀些事情在Bean对象实例化(并不是Bean的整个⽣命周期完成)之后可以使⽤BeanPostProcessor进⾏后置处理做⼀些事情
注意:对象不⼀定是springbean,⽽springbean⼀定是个对象
BeanPostProcessor:
只要是体现在bean生命周期图中的第6步和第9步
BeanFactoryPostProcessor:
BeanFactory级别的处理,是针对整个Bean的⼯⼚进⾏处理,典型应
⽤:PropertyPlaceholderConfigurer此接⼝只提供了⼀个⽅法,⽅法参数为ConfifigurableListableBeanFactory。BeanFactoryPostProcessor该参数类型定义了⼀些⽅法
其中有个⽅法名为getBeanDefifinition的⽅法,我们可以根据此⽅法,找到我们定义bean 的
BeanDefifinition对象。然后我们可以对定义的属性进⾏修改。
注意:调⽤ BeanFactoryPostProcessor的postProcessBeanFactory⽅法时,这时候bean还没有实例化,此时bean刚被解析成BeanDefifinition对象。由此我们可以知道BeanFactoryPostProcessor的工作时机是在完成BeanDefifintion对象创建的时候。