【Spring编程思想】四、Spring Ioc 依赖注入

Spring IoC 依赖注入

本章节代码演示: 在dependency-injection模块

一、依赖注入的模型和类型

  • 手动模式 - 配置或者编程的方式,提前安排注入规则

    • XML资源配置元信息
    • Java注解配置元信息
    • Java API配置元信息
  • 自动模式 -实现方提供依赖自动关联的方式,按照内建的注入规则

    • Autowiring(自动绑定 )
  • 依赖注入类型

    依赖注入类型配置元数据举例
    Setter方法
    构造器
    字段@Autowired User user;
    方法@Autowired public void user(User user){…}
    回调Class MyBean implements BeanFactoryAware{…}

二、自动绑定(Autowiring)

  • 优点
    • 可以有效的减少一些属性或构造器参数的一个设定
    • 能够更新配置

三、自动绑定模式(Autowiring Mode)

  • AutowiringMode

    参考枚举:org.springframework.beans.factory.annotation.Autowire

    模式说明
    no默认值,未激活Autowiring,需要手动注入依赖
    byName根据被注入属性的名称作为Bean名称进行依赖查找,并将对象设置到该属性
    byType根据被注入属性的类型作为依赖类型查找,并将对象设置到该属性
    constructor特殊byType类型,用于构造器参数

四、自动绑定(Autowiring)限制和不足

五、Setter方法依赖注入

  • 实现方法
    • 手动模式

      • XML配置元信息

        参考代码:*com.forjson.spring.dependency.injection.XmlDependencySetterInjectionDemo

      • Java注解配置元信息

        参考代码:com.forjson.spring.dependency.injection.XmlDependencySetterInjectionDemo

      • API配置元信息

        参考代码:com.forjson.spring.dependency.injection.ApiDependencySetterInjectionDemo

    • 自动模式

      参考代码:com.forjson.spring.dependency.injection.AutowiringDependencySetterInjectionDemo

      • byName
      • byType

六、构造器依赖注入

实现方法

  • 手动模式
    • XML配置元信息

      参考代码: com.forjson.spring.dependency.injection.XmlDependencyConstructorInjectionDemo

    • Java注解配置元信息

      参考代码:com.forjson.spring.dependency.injection.AnnotationDependencySetterInjectionDemo

    • API配置元信息

      参考代码:com.forjson.spring.dependency.injection.ApiDependencySetterInjectionDemo

七、字段注入

  • @Autowire 注入模式

    参考代码:com.forjson.spring.dependency.injection.AnnotationDependencyFieldInjectionDemo

  • @Resource 注入模式

    com.forjson.spring.dependency.injection.AnnotationDependencyResourceFieldInjectionDemo

八、方法注入

参考代码: com.forjson.spring.dependency.injection.AnnotationDependencyMethodInjectionDemo

九、回调注入

参考代码演示: com.forjson.spring.dependency.injection.AwareInterfaceAnnotationDependencyInjectionDemo

  • Aware系列回调注入

    内建接口说明
    BeanFactoryAware获取IOC容器-BeanFactry
    ApplicationContextAware获取Spirng应用上下文-ApplicationContext对象
    EnvironmentAware获取Environment对象
    ResourceLoaderAware获取资源加载对象-ResourceLoader
    BeanClassLoaderAware获取当前Bean Class的ClassLoader
    BeanNameAware获取当前Bean Class的名称
    MessageSourceAware获取MessageSource对象,用于Spring国际化
    ApplicationEventPublisherAware获取ApplicationEventPublisher对象,用于Spring事件
    EmbeddedValueResolverAware获取StringValueResolver对象,用于占位符处理

十、依赖注入类型选择

  • 注入类型
    • 低依赖:构造器注入
    • 多依赖:Setter方法注入
    • 便利性:字段注入
    • 声明类:方法注入

十一、基础类型注入

参考代码演示: com.forjson.spring.dependency.injection.BasicTypeInjectionDemo

  • 基础类型:
    • 原生类型(primitive): boolean、byte、char、short、int、float、long、double
    • 标量类型(Scalar): Number、Character、Boolean、Enum、Locate、Charset、Currency、Properties、UUID
    • 常规类型(general):Object、String、TimeZone、Calendar、Optinal等
    • Spring类型: Resource、InputResource、Formatter等

十二、集合类型注入

  • 集合类型
    • 数据类型(Array):原生类型、标量类型、常规类型、 Spring类型
    • 集合类型(Collection):
      • Collection:List、Set(SortedSet、Navigable、EnumSet)
      • Map:Properties

十三、限定注入

代码演示:com.forjson.spring.dependency.injection.QualifierAnnotationDependencyInjectionDemo

  • @Qualifier限定
    • 通过Bean名称限定
    • @通过分组限定
  • 基本注解@Qualifier扩展限定

十四、延迟依赖注入

参考代码: com.forjson.spring.dependency.injection.LayAnnotationDependencyInjectionDemo

  • 使用Api BeanFactory延迟注入

    • 单一类型
    • 集合类型
  • 使用Api BeanProvier延迟注入(推荐)

    • 单一类型
    • 集合类型

十五、依赖处理过程

  • 基础知识
    • 入口 - org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#resolveDependency
    • 依赖描述符 - DependencyDescriptor
    • 自动绑定候选对象处理器 - AutowireCandidateResolver

十六、@autowired注入原理

  • @Autowired注入过程
    • 元信息描述
    • 依赖查找
    • 依赖注入(字段、方法)

十七、JSR-330 @Inject 注入原理

十八、Java 通用注解注入原理

十九、自定义依赖注入原理

参考演示代码:

com.forjson.spring.dependency.injection.CustomerAutowiredAnnotationDemo

  • 基于AutowireAnnotationBeanPostProcessor实现
  • 自定义实现
    • 生命周期处理

      • InstantiationAwareBeanProcessor
      • MergedBeanDefinitionPostProcessor
    • 元数据

      • InjectedElement
      • InjectionMetadata

二十、面试题精选

  • 有多少种依赖注入?

    • 构造器注入
    • Setter注入
    • 字段注入
    • 接口回调注入
  • 偏好构造器注入还是Setter注入

    • 两种依赖注入均可使用,如果是必须依赖的话,推荐构造器注入,Setter注入用于可选依赖
      • 构造器注入可以避免线程安全问题,因为构造器的创建是线程安全的。
  • 依赖注入的来源有哪些?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值