啥IOC???干嘛用的,为啥Java有那么多的闹眼子的词。今天带您来看看这个是个啥……
IOC Inverse Of Control 控制反转
反转是中思想,将类的实例化和管理交给Spring(包括关系处理垃圾回收等),我们只需要去Spring这个容器中取即可
传统与反转的区别
传统的
图片来源网络
反转
控制反转在Spring中是如何做到的?
控制反转是一种通过描述(在 Java 中可以是 XML 或者注解)并通过第三方(Spring)去产生或获取特定对象的方式。
Spring IOC容器
spring将class注册进入(称为bean),然后通过xml描述的方式完成依赖等配置关系,然后我们可以从Spring中以描述
的方式获取到bean
IOC容器的组成
容器主要有两个主要成员(均为interface)
BeanFactory
ApplicationContext
其中ApplcationContext是BeanFactory的子接口,BeanFactory的子类
由于是BeanFactory的扩展,因此我们通常使用ApplicationCOntext来作为IOC的容器
下面列举一些beanfactory的方法
Application的常见实现
1.ClassPathXmlApplicationContext:
这个是读取classpath中资源文件,因此可以使用资源文件的名称来读取
ApplicationContext ctx =newClassPathXmlApplicationContext("applicationContext.xml");
2:FileSystemXmlApplicationContext:-
基于文件路径的
ApplicationContext ac =newFileSystemXmlApplicationContext("c:/applicationContext.xml");
3 web环境下的
XmlWebApplicationContext ac = new XmlWebApplicationContext(); // 这时并没有初始化容器ac.setServletContext(servletContext); // 需要指定ServletContext对象ac.setConfigLocation("/WEB-INF/applicationContext.xml"); // 指定配置文件路径,开头的斜线表示Web应用的根目录ac.refresh(); // 初始化容器
BeanFactory 和 ApplicationContext 的区别:
BeanFactory:是Spring中最底层的接口,只提供了最简单的IoC功能,负责配置,创建和管理bean。
在应用中,一般不使用 BeanFactory,而推荐使用ApplicationContext(应用上下文),原因如下。
ApplicationContext:
1.继承了 BeanFactory,拥有了基本的 IoC 功能;
2.除此之外,ApplicationContext 还提供了以下功能:
支持国际化;
支持消息机制;
支持统一的资源加载;
支持AOP功能;
注意:Bean 的定义和初始化在 Spring IoC 容器是两大步骤,它是先定义,然后初始化和依赖注入的。
Bean 的定义分为 3 步:
1.Resource 定位
Spring IoC 容器先根据开发者的配置,进行资源的定位,在 Spring 的开发中,通过 XML 或者注解都是十分常见的方式,定位的内容是由开发者提供的。
2.BeanDefinition 的载入
这个时候只是将 Resource 定位到的信息,保存到 Bean 定义(BeanDefinition)中,此时并不会创建 Bean 的实例
3.BeanDefinition 的注册
这个过程就是将 BeanDefinition 的信息发布到 Spring IoC 容器中
注意:此时仍然没有对应的 Bean 的实例。
做完了以上 3 步,Bean 就在 Spring IoC 容器中被定义了,而没有被初始化,更没有完成依赖注入,也就是没有注入其配置的资源给 Bean,那么它还不能完全使用。
对于初始化和依赖注入,Spring Bean 还有一个配置选项——【lazy-init】,其含义就是是否初始化 Spring Bean。在没有任何配置的情况下,它的默认值为 default,实际值为 false,也就是Spring IoC 默认会自动初始化 Bean。如果将其设置为 true,那么只有当我们使用 Spring IoC 容器的 getBean 方法获取它时,它才会进行 Bean 的初始化,完成依赖注入。
领取专属 10元无门槛券
私享最新 技术干货