IoC ( inversion of control )

IoC ( inversion of control )
sparkle520IoC (inversion of control )
IoC ( 控制反转 ) 通过将控制权交给第三方来达到解耦.
相当于手动挡变成了自动挡,而无需自己 new
对象.
对于IoC有两种实现方式,分别为依赖查找 ( DL ) 和依赖注入 ( DI ). 通常采用后者,也是spring的核心.
依赖注入 ( Dependency injection )
在spring中,通过IoC容器,动态的将某个依赖关系注入到组件之中,减少对象之间的紧耦合性并提高可重用性.
spring IoC 容器
Spring 提供了两种 IoC 容器,BeanFactory
和
ApplicationContext
.
BeanFactory
是最为基础的IoC容器,BeanFactory
就是一个管理
Bean
的工厂,它主要负责初始化各种
Bean
,并调用它们的生命周期方法.
ApplicationContext
ApplicationContext
是 BeanFactory
的子接口,由 BeanFactory
派生而来,通常成为Spring上下文,具有 BeanFactory
的基本功能,同时拓展了功能.
- 消息源 ( MessageSource ) :用于实现国际化和消息查找
- 资源加载 ( ResourceLoader ) :可以从多种资源位置如文件系统、类路径加载资源
- 事件传播 ( ApplicationEventPublisher ) :支持发布和监听应用事件
- 自动装配 ( AutowiredAnnotationBeanPostProcessor ) :支持基于注解的自动装配
BeanFactory 和 ApplicationContext 区别
beanFactory
在初始化容器时,并未实例化
Bean
,直到第一次访问某个Bean
时才实例化目标
Bean
. 如果 Bean
的某一个属性没有注入,直至第一次调用 getBean
方法才会抛出异常.
而 ApplicationContext
则在初始化应用上下文时就实例化所有单实例的 Bean
.
sping IoC 容器注册 bean
spring IoC 容器注册 bean 的方式有xml ( 不推荐
)、@Configuration
+ @Bean
( 配置类方法 )
、@Component
、 @Controller
、@Service
、 @Repository
、
@Resource
、@Import
.
spring IoC 容器自动装配 bean
spring IoC 容器自动装配 方式有 xml ( 不推荐 ),注解 ( 常用 ).
注解自动装配 bean
@Resouce
默认情况下 @Resource
按照 name
属性注入,如果没有显式声明则按照字段名或setter方法setXXX中XXX作为 bean
name.
当 @Resource
不设置任何值时,isDefaultName
会为 true
,当对应字段名称的 bean
或者BeanDefinition
已存在时会走 byName
的形式,否则走 byType
的形式;
只指定了 type
属性时,只有当对应的名称不存在对应的
bean
或 BeanDefinition
,才会通过
byType
找到唯一的一个类型匹配的 bean
;
只指定了 name
属性,会执行 getBean
方法,根据指定的 name
来获取 bean
;
既指定了 name
属性,又指定了 type
属性,会先根据 name
查找对应的 bean
,然后进行
type
类型比较.
@Autowired
byType
优先,Qualifier
其后,然后是
byName
.