# IoC
# 什么是 IoC
IoC
(Inversion of control )控制反转。它是一种思想并不是一个技术实现。描述的是Java
开发领域对象的创建以及管理的问题。
例如:现有类A
依赖于类B
- 传统的开发方式 :往往是在类
A
中手动通过new
关键字来new
一个B
的对象出来 - 使用
IoC
思想的开发方式 :不通过new
关键字来创建对象,而是通过IoC
容器(Spring
框架) 来帮助我们实例化对象。我们需要哪个对象,直接从IoC
容器里面过去即可。
从以上两种开发方式的对比来看:我们 “丧失了一个权力” (创建、管理对象的权力),从而也得到了一个好处(不用再考虑对象的创建、管理等一系列的事情)。
IoC
解决了什么问题/有什么好处?- 对象之间的耦合度或者说依赖程度降低;
- 资源变的容易管理;
IoC
和DI
的区别?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
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
的一各更高级的容器,提供了更多的有用的功能;- 与
Spring
的AOP
功能轻松集成 - 消息资源处理(用于国际化)
- 活动发布
- 应用层特定的上下文,例如
WebApplicationContext
用于Web应用程序中的
- 与