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

本文深入探讨了Spring框架中的依赖注入(DI),包括setter、构造器、字段和方法注入,以及自动绑定模式和手动配置方式。详细阐述了@Autowired注解的工作原理,介绍了基本类型、集合类型和限定注入的处理。同时,讨论了延迟注入和各种回调接口的使用。最后,总结了DI的选择策略,并提供了面试题精选,涵盖了DI的不同方面。

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注入用于可选依赖
      • 构造器注入可以避免线程安全问题,因为构造器的创建是线程安全的。
  • 依赖注入的来源有哪些?

基于遗传算法的新的异构分布式系统任务调度算法研究(Matlab代码实现)内容概要:本文档围绕基于遗传算法的异构分布式系统任务调度算法展开研究,重点介绍了一种结合遗传算法的新颖优化方法,并通过Matlab代码实现验证其在复杂调度问题中的有效性。文中还涵盖了多种智能优化算法在生产调度、经济调度、车间调度、无人机路径规划、微电网优化等领域的应用案例,展示了从理论建模到仿真实现的完整流程。此外,文档系统梳理了智能优化、机器学习、路径规划、电力系统管理等多个科研方向的技术体系与实际应用场景,强调“借力”工具与创新思维在科研中的重要性。; 适合人群:具备一定Matlab编程基础,从事智能优化、自动化、电力系统、控制工程等相关领域研究的研究生及科研人员,尤其适合正在开展调度优化、路径规划或算法改进类课题的研究者; 使用场景及目标:①学习遗传算法及其他智能优化算法(如粒子群、蜣螂优化、NSGA等)在任务调度中的设计与实现;②掌握Matlab/Simulink在科研仿真中的综合应用;③获取多领域(如微电网、无人机、车间调度)的算法复现与创新思路; 阅读建议:建议按目录顺序系统浏览,重点关注算法原理与代码实现的对应关系,结合提供的网盘资源下载完整代码进行调试与复现,同时注重从已有案例中提炼可迁移的科研方法与创新路径。
【微电网】【创新点】基于非支配排序的蜣螂优化算法NSDBO求解微电网多目标优化调度研究(Matlab代码实现)内容概要:本文提出了一种基于非支配排序的蜣螂优化算法(NSDBO),用于求解微电网多目标优化调度问题。该方法结合非支配排序机制,提升了传统蜣螂优化算法在处理多目标问题时的收敛性和分布性,有效解决了微电网调度中经济成本、碳排放、能源利用率等多个相互冲突目标的优化难题。研究构建了包含风、光、储能等多种分布式能源的微电网模型,并通过Matlab代码实现算法仿真,验证了NSDBO在寻找帕累托最优解集方面的优越性能,相较于其他多目标优化算法表现出更强的搜索能力和稳定性。; 适合人群:具备一定电力系统或优化算法基础,从事新能源、微电网、智能优化等相关领域研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①应用于微电网能量管理系统的多目标优化调度设计;②作为新型智能优化算法的研究与改进基础,用于解决复杂的多目标工程优化问题;③帮助理解非支配排序机制在进化算法中的集成方法及其在实际系统中的仿真实现。; 阅读建议:建议读者结合Matlab代码深入理解算法实现细节,重点关注非支配排序、拥挤度计算和蜣螂行为模拟的结合方式,并可通过替换目标函数或系统参数进行扩展实验,以掌握算法的适应性与调参技巧。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值