Spring IoC
引言
要明白 Spring IoC 容器的作用,就必须先弄明白 IoC(控制反转) 和 DI(依赖注入) 这两个概念。
IoC 概念
IoC(控制反转)就是应用本身不负责依赖对象的创建及维护,依赖对象的创建及维护是由外部容器负责,这样控制权就由应用转移到了外部容器,控制权的转移就是所谓的反转。控制权转移带来的好处就是降低了业务对象之间的依赖程度(低耦合、高内聚)。
这里所说的外部容器指的就是 Spring IoC 容器,IoC 控制反转就是由 IoC 容器负责实例化对象,也就是说有了 IoC 容器就不用自己 new 对象了啦。
DI 概念
DI(Dependency Injection,依赖注入)可以向某个对象动态的注入它所依赖的其他对象的引用。
有了 DI(依赖注入),IoC 容器就可以把实例化的对象注入给应用本身,这样开发者就可以不用自己去 new 对象以及建立对象之间的依赖关系,只需要使用对象就可以了。
依赖注入的方式:
-
构造器注入
-
方法注入
-
接口注入
Spring IoC 容器支持构造器注入和方法注入
从上图可以看到,通过使用 Spring IoC 容器可以达到三层架构降低耦合度的效果,让三层之间不存在依赖之间,它们都依赖于 IoC 容器。
Spring IoC 容器
Spring IoC 容器是指实现 IoC (控制反转)和 DI(依赖注入)概念的一个 Spring 组件,开发者使用 IoC 容器可以获得 IoC/DI 带来的降低耦合度和简化开发的特性。
-
Bean
Spring 中使用 Bean 来表示应用组件,一个 Bean 组件可以是任何形式的简单 Java 类实例,Spring 中使用 IoC 容器来管理 Bean 的生命周期(Bean 的创建和销毁)
-
BeanFactory(Bean 工厂)
BeanFactory 是 Spring 框架最核心的接口,它提供了高级 IoC 的配置机制;BeanFactory 使管理不同类型的 Java 对象成为可能。
BeanFactory 是 Spring 框架的基础设施,属于底层封装组件,专供 Spring 框架内部使用
-
ApplicationContext ( 应用上下文 )
ApplicationContex 是建立在 BeanFactory 基础之上,提供了更多面向应用的功能。一般称BeanFactory为IoC容器,而称ApplicationContext 为应用上下文。ApplicationContext 面向 Spring 框架的开发者,属于上层封装组件,专供开发者使用。通过 ApplicationContext 应用上下文实例调用其 getBean() 方法从 IoC 容器中即可获取 Bean 对象实例
启动 IoC 容器
Spring 有三种启动 IoC 容器的方式,如下:
-
ClassPathXmlApplicationContext(相对路径)
从类路径下的 XML 配置文件中加载上下文定义,把应用上下文定义文件当做类资源
ApplicationContext ctx = new ClassPathXmlApplicationContext(“包路径/beans.xml”)
-
FileSystemXmlApplicationContext(绝对路径)
读取文件系统下的 XML 配置文件并加载上下文定义
ApplicationContext ctx = new FileSystemtXmlApplicationContext(“文件路径/beans.xml”)
- XmlWebApplicationContext(web 配置路径)
读取 Web 应用下的 XML 配置文件并加载上下文定义
装配 Bean
装配 Bean 是指在 Spring IoC 容器中创建 Bean 组件和建立 Bean 组件之间的依赖关系的过程,即实现 IoC(控制反转)和 DI(依赖注入)。
Spring 支持三种装配 Bean 的方式:
-
基于 XML 配置装配 Bean
-
基于注解装配 Bean
-
基于 Java 类装配 Bean
注解装配 Bean
开启注解
<!--Spring IoC 容器需要在 Spring 配置中开启注解(默认禁用注解)-->
<context:annotation-config />
<!--Spring IoC 容器需要自动检测 Bean(扫描 Java 类中 Bean 组件) -->
<context:component-scan packages=“包路径”/>
IoC 注解
-
@Component:标识 Java 类为 Spring Bean 组件(通用注解)
-
@Controller:标识三层架构中表现层的 Java 类为 Spring Bean 组件
-
@Service:标识三层架构中业务逻辑层的 Java 类为 Spring Bean 组件
-
@Repository:标识三层架构中业务持久层的 Java 类为 Spring Bean 组件
DI 注解
-
@Autowired:依赖注入
-
@Resource:使用与 @Autowired 注解相同
-
@Qualifer:明确指定需要自动装配的 Bean 组件
总结
Spring IoC 容器的作用就是实现了 IoC(控制反转)和 DI(依赖注入),对于已经在容器里面的则使用依赖注入,例如@Autowired、@Resourse等。如果没有在容器里面则需要使用@Component等注解来放进IOC容器。