# IoC

# 什么是 IoC

IoC (Inversion of control )控制反转。它是一种思想并不是一个技术实现。描述的是Java开发领域对象的创建以及管理的问题。

例如:现有类A依赖于类B

  • 传统的开发方式 :往往是在类A中手动通过new关键字来new一个B的对象出来
  • 使用IoC思想的开发方式 :不通过new关键字来创建对象,而是通过IoC容器(Spring框架) 来帮助我们实例化对象。我们需要哪个对象,直接从IoC容器里面过去即可。

从以上两种开发方式的对比来看:我们 “丧失了一个权力” (创建、管理对象的权力),从而也得到了一个好处(不用再考虑对象的创建、管理等一系列的事情)。

  • IoC 解决了什么问题/有什么好处?

    • 对象之间的耦合度或者说依赖程度降低;
    • 资源变的容易管理;
  • IoCDI 的区别?

    IoC最常见以及最合理的实现方式叫做依赖注入(Dependency Injection,简称 DI)并且,老马(Martin Fowler)在一篇文章中提到将IoC改名为DI原文地址 (opens new window)

    DI的主要两种方式,分别为:

    • 基于构造函数的依赖注入
    • 基于Setter的依赖注入

# IoC 容器

  • org.springframework.beans.factory.BeanFactory: 是Spring里面最低层的接口,提供了最简单的容器的功能,只提供了实例化对象和获取对象的功能。
public interface BeanFactory {

	String FACTORY_BEAN_PREFIX = "&";

	Object getBean(String name) throws BeansException;

	<T> T getBean(String name, Class<T> requiredType) throws BeansException;

	Object getBean(String name, Object... args) throws BeansException;

	<T> T getBean(Class<T> requiredType) throws BeansException;

	<T> T getBean(Class<T> requiredType, Object... args) throws BeansException;

	<T> ObjectProvider<T> getBeanProvider(Class<T> requiredType);

	<T> ObjectProvider<T> getBeanProvider(ResolvableType requiredType);

	boolean containsBean(String name);

	boolean isSingleton(String name) throws NoSuchBeanDefinitionException;

	boolean isPrototype(String name) throws NoSuchBeanDefinitionException;

	boolean isTypeMatch(String name, ResolvableType typeToMatch) throws NoSuchBeanDefinitionException;

	boolean isTypeMatch(String name, Class<?> typeToMatch) throws NoSuchBeanDefinitionException;

	@Nullable
	Class<?> getType(String name) throws NoSuchBeanDefinitionException;

	String[] getAliases(String name);

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
  • org.springframework.context.ApplicationContext: 应用上下文,继承BeanFactory接口,它是Spring的一各更高级的容器,提供了更多的有用的功能;
    • SpringAOP功能轻松集成
    • 消息资源处理(用于国际化)
    • 活动发布
    • 应用层特定的上下文,例如WebApplicationContext用于Web应用程序中的
Last Updated: 3 years ago