面试问烂的Spring IoC、BeanFactory、Application
IoC(Inverse of Control 控制反转)这个概念其实有点羞涩。
IoC 是Spring容器的核心思想,AOP、声明式事务等功能都是在此基础上开花结果的(了解AOP原理的对这句话理解会更好一点)。IoC包含很多内涵,它涉及代码解耦、设计模式、代码优化等问题的考量。
下面看一下IoC方式与咱们不用IoC的代码区别。
传统方式
Spring IoC方式
从代码中能够看出来非IoC 方式woman类的创建是由自己负责创建new的,而IoC的方式则是交给了Spring进行创建的,ioc方法仅仅负责调用即可。
IoC容器负责woman类的创建管理。将控制权反转给了Spring,这也就是IoC的核心含义。
因为IoC含义确实不够开门见山,后来业界泰斗Martin Fowler 提出DI(Dependence Injection 依赖注入)的概念来代替IoC。即调用类对某一接口实现类的依赖关系由第三方注入,来移除对某一接口实现类的依赖。
Spring IoC 的注入类型
1、构造函数注入
2、属性注入
3、接口注入
BeanFactory与Application区别
BeanFactory是Spring框架的基础设施,面向Spring本身;ApplicationContext面向使用Spring框架的开发者,几乎所有的应用场合都可以直接使用ApplicationContext而非底层的BeanFactory。
BeanFactory
BeanFactory结构
Spring容器最基本的接口就是BeanFactory。BeanFactory负责配置、创建、管理Bean,它有一个子接口ApplicationContext,也被称为Spring上下文,容器同时还管理着Bean和Bean之间的依赖关系。
Spring IoC容器的实现,从根源上是BeanFactory,但真正可以作为一个可以独立使用的IoC容器还是DefaultListableBeanFactory,因此可以这么说,DefaultListableBeanFactory 是整个Spring IoC的始祖。
BeanFactory里面的主要方法是getBean(String beanName),该方法从容器中返回特定名称Bean。
1.BeanFactory接口:
是Spring bean容器的根接口,提供获取bean,是否包含bean,是否单例与原型,获取bean类型,bean 别名的方法 。它最主要的方法就是getBean(String beanName)。
2.BeanFactory的三个子接口:
* HierarchicalBeanFactory:提供父容器的访问功能
* ListableBeanFactory:提供了批量获取Bean的方法
* AutowireCapableBeanFactory:在BeanFactory基础上实现对已存在实例的管理
3.ConfigurableBeanFactory:
主要单例bean的注册,生成实例,以及统计单例bean
4.ConfigurableListableBeanFactory:
继承了上述的所有接口,增加了其他功能:比如类加载器,类型转化,属性编辑器,BeanPostProcessor,作用域,bean定义,处理bean依赖关系, bean如何销毁…
5.实现类DefaultListableBeanFactory详细介绍:
实现了ConfigurableListableBeanFactory,实现上述BeanFactory所有功能。它还可以注册BeanDefinition
ApplicationContext
ApplicationContext中的方法
ApplicationContext常用实现类 作用 AnnotationConfigApplicationContext 从一个或多个基于java的配置类中加载上下文定义,适用于java注解的方式。
ClassPathXmlApplicationContext 从类路径下的一个或多个xml配置文件中加载上下文定义,适用于xml配置的方式。
FileSystemXmlApplicationContext 从文件系统下的一个或多个xml配置文件中加载上下文定义,也就是说系统盘符中加载xml配置文件。
AnnotationConfigWebApplicationContext 专门为web应用准备的,适用于注解方式。XmlWebApplicationContext 从web应用下的一个或多个xml配置文件加载上下文定义,适用于xml配置方式。