# 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应用程序中的
- 与