IoC ( inversion of control )

IoC (inversion of control )

IoC ( 控制反转 ) 通过将控制权交给第三方来达到解耦. 相当于手动挡变成了自动挡,而无需自己 new 对象.

对于IoC有两种实现方式,分别为依赖查找 ( DL ) 和依赖注入 ( DI ). 通常采用后者,也是spring的核心.

依赖注入 ( Dependency injection )

spring中,通过IoC容器,动态的将某个依赖关系注入到组件之中,减少对象之间的紧耦合性并提高可重用性.

spring IoC 容器

Spring 提供了两种 IoC 容器,BeanFactoryApplicationContext.

BeanFactory

是最为基础的IoC容器,BeanFactory 就是一个管理 Bean 的工厂,它主要负责初始化各种 Bean,并调用它们的生命周期方法.

ApplicationContext

ApplicationContextBeanFactory 的子接口,由 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 属性时,只有当对应的名称不存在对应的 beanBeanDefinition,才会通过 byType 找到唯一的一个类型匹配的 bean

只指定了 name 属性,会执行 getBean 方法,根据指定的 name 来获取 bean

既指定了 name 属性,又指定了 type 属性,会先根据 name 查找对应的 bean,然后进行 type 类型比较.

@Autowired

byType 优先,Qualifier 其后,然后是 byName.