5.1 依赖注入详解_第1页
5.1 依赖注入详解_第2页
5.1 依赖注入详解_第3页
5.1 依赖注入详解_第4页
5.1 依赖注入详解_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

5.1依赖注入5.1依赖注入详解01知识目标理解依赖注入的核心作用(解耦组件依赖关系)掌握3种注入实现方式(构造器/Setter/字段注入)区分各注入方式的适用场景与局限性02能力目标编写符合阿里巴巴开发规范的注入代码诊断并解决常见注入失败问题设计可维护的依赖注入结构03本节定位前置知识:4.2SpringIoC容器基础后续内容:5.2注解实现IoC高级配置学习目标与知识地图传统开发困境publicclassOrderService{//硬编码依赖导致紧耦合privateUserDaouserDao=newUserDaoImpl();privateLogServicelogService=newLogServi}-修改实现类需重构代码,违背开闭原则!依赖注入解决方案控制反转:对象创建权移交IoC容器依赖注入:容器通过预设方式自动注入依赖对象解耦效果:组件间通过接口交互,实现“面向接口编程”生活类比如同点餐时只需告知需求(声明依赖),厨师(容器)负责食材准备(对象创建)和送餐(注入),食客无需关心烹饪过程!依赖注入概念与价值三种注入方式核心对比注入方式实现方式优点缺点适用场景构造器注入类构造方法参数强制依赖(不可变)支持final字段便于单元测试多个依赖时参数冗长核心服务(如支付服务)Setter注入setXxx()方法可选依赖支持支持重新注入无法注入final字段依赖状态可变非核心可选组件字段注入@Autowired直接标注字段代码简洁开发效率高隐藏依赖关系无法注入final字段简单Demo或原型开发Spring官方建议:构造器注入为首要选择,Setter注入用于可选依赖,字段注入谨慎使用!IoC容器注入流程图依赖注入核心流程01定位阶段(Locate):扫描@ComponentScan指定路径,识别@Service标注的Bean类。02加载阶段(Load):将Bean定义解析为BeanDefinition,存储到BeanDefinitionRegistry。03注入阶段(Inject):创建目标Bean实例,根据注入方式(构造器/Setter)注入依赖,完成初始化并放入容器。关键类DefaultListableBeanFactory

负责注入逻辑,AutowiredAnnotationBeanPostProcessor

处理@Autowired注解解析。01完整代码文件结构com.example├─service│├─UserService.java//用戶服务类(含构造器注入)│└─LogService.java//日志服务类(被依赖组件)├─config│└─AppConfig.java//IoC容器配置类└─Main.java//应用启动类02依赖说明UserService依赖LogService(通过构造器注入)所有类位于com.example包下,符合Spring组件扫描规范需引入SpringContext6.1.0依赖(Maven/Gradle配置略)实例项目结构树构造器注入代码实现LogService.java完整代码packagecom.example.service;importorg.springframework.stereotype.Service;@Service

//标记为Spring管理的BeanpublicclassLogService{

publicvoidlog(Stringmessage){System.out.println("[系统⽇志]"+message);}}UserService.java构造器注入实现packagecom.example.service;importorg.springframework.stereotype.Service;@ServicepublicclassUserService{

privatefinalLogServicelogService;//final字段确保不可变

//构造器注⼊(Spring6.x可省略@Autowired)

publicUserService(LogServicelogService){

this.logService=logService;System.out.println("UserService构造器执⾏,注⼊LogService}

publicvoidcreateUser(Stringusername){logService.log("⽤⼾创建:"+username);//使⽤注⼊的依赖Setter注入与字段注入代码实现UserService.javaSetter注入改造packagecom.example.service;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.stereotype.Service;@ServicepublicclassUserService{privateLogServicelogService;//⾮final字段@Autowired(required=false)//可选依赖publicvoidsetLogService(LogServicelogService){this.logService=logService;System.out.println("Setter注⼊执⾏");}publicvoidcreateUser(Stringusername){if(logService!=null){logService.log("⽤⼾创建:"+username);}else{System.out.println("未注⼊⽇志服务...");}UserService.java字段注入实现packagecom.example.service;importorg.springframework.beans.factory.annotation.importorg.springframework.stereotype.Service;@ServicepublicclassUserService{@AutowiredprivateLogServicelogService;publicvoidcreateUser(Stringusername){logService.log("⽤⼾创建:"+username);}}使用警告:无法注入final字段单元测试需通过Spring容器隐藏依赖关系阿里巴巴开发手册:禁止在业务代码中使用字段注入!配置类与运行主类代码实现AppConfig.java配置类packagecom.example.config;importorg.springframework.context.annotation.ComponentScan;importorg.springframework.context.annotation.Configuration;@Configuration

//标记为Spring配置类@ComponentScan(basePackages="com.example.service")//扫描service包下的所有@Component注解类public

class

AppConfig{

//⽆需额外配置,IoC容器会⾃动发现并管理Bean}Main.java启动类packagecom.example;importcom.example.config.AppConfig;importcom.example.service.UserService;importorg.springframework.context.annotation.Annotatipublic

class

Main{

public

static

void

main(String[]args){

//1.初始化IoC容器(基于注解配置)

try(AnnotationConfigApplicationContextcontex

new

AnnotationConfigApplicationContext

System.out.println("IoC容器初始化完成,Bean数

//2.从容器获取UserServiceBean

UserServiceuserService=context.getBean(

//3.调⽤业务⽅法userService.createUser("张三");}

//4.try-with-resources⾃动关闭容器关键API:AnnotationConfigApplicationContext是注解配置的IoC容器实现类运行结果、最佳实践与总结运行结果IoC容器初始化完成,Bean数量:2UserService构造器执⾏,注⼊LogService[系统⽇志]⽤⼾创建:张三常见异常排查NoSuchBeanDefinitionException:检查@ComponentScan路径或@Service注解N

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论