5.2 注解实现 IoC 详解_第1页
5.2 注解实现 IoC 详解_第2页
5.2 注解实现 IoC 详解_第3页
5.2 注解实现 IoC 详解_第4页
5.2 注解实现 IoC 详解_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

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

文档简介

5.2注解实现IoC欢迎进入Spring注解开发实战模块,本节将聚焦如何通过注解简化IoC容器配置,摆脱XML配置的繁琐,学习核心注解的使用方法、组件扫描机制及最佳实践。学习目标与知识图谱知识目标掌握IoC核心注解分类及使用场景、理解@ComponentScan扫描机制、区分@Bean与@Component适用场景、对比@Autowired与@Resource差异。能力目标独立使用纯注解配置IoC容器、管理Bean生命周期、诊断解决常见异常。本节定位前置基础为5.1依赖注入,核心内容是注解驱动IoC配置,后续延伸至5.3注解实现AOP。注解配置vsXML配置传统XML配置痛点:文件冗长、维护成本高、易出错、开发效率低。注解配置优势:开发效率高(自动扫描)、可读性强(代码与配置结合)、维护成本低(支持部分热部署)。维度XML配置注解配置开发效率低(手动编写)高(自动扫描)可读性低(配置与代码分离)高(配置与代码结合)维护成本高(修改需重启)低(支持部分热部署)适用场景复杂基础设施(数据源)日常Bean定义与依赖注入Spring官方趋势:纯注解配置已成主流,SpringBoot自动配置进一步简化IoC容器配置。核心IoC注解分类表组件注解@Component(通用组件)、@Service(服务层)、@Repository(DAO层)、@Controller(Web层),应用于类级别,被@ComponentScan扫描注册。配置注解@Configuration(标记配置类)、@ComponentScan(指定扫描路径)、@Bean(自定义Bean创建方法)。依赖注解@Autowired(Spring提供,按类型注入)、@Qualifier(配合@Autowired指定名称)、@Resource(JDK内置,按名称后按类型注入)。@ComponentScan扫描机制路径定位默认扫描@Configuration类所在包,可通过basePackages自定义路径,如@ComponentScan(basePackages={"com.example.service","com.example.dao"})。过滤规则通过includeFilters/excludeFilters自定义,支持ANNOTATION(按注解)、ASSIGNABLE_TYPE(按类/接口)、REGEX(按正则)等FilterType。Bean注册扫描到的组件自动注册为Bean,默认名称为首字母小写类名,可通过@Component("customName")指定。01项目结构概览项目结构包含config

包(配置类AppConfig)、service包(业务服务类UserService、OrderService等)、以及Main

启动类。02核心包职责config

包存放核心配置类,定义组件扫描和Bean;service

包存放@Service标记的业务组件,实现依赖注入;Main

类初始化IoC容器并验证配置。03架构优势此结构遵循分层架构,通过注解驱动开发,消除了传统的XML配置文件,使得项目整体更加简洁、高效,易于维护和扩展。实例项目结构@Configuration配置类@Configuration注解标记配置类,替代XML配置文件,相当于<beans>标签。@ComponentScan指定扫描路径,basePackages属性接收包路径数组,默认扫描配置类所在包及其子包。示例代码@Configuration@ComponentScan(basePackages="com.example.service")public

class

AppConfig

{}配置类优势:类型安全、支持复杂逻辑、IDE自动补全与编译时检查。常见问题:扫描路径错误导致Bean无法注册,抛出NoSuchBeanDefinitionException。@Service组件类@Service

注解用于标记服务层(ServiceLayer)组件,使代码的语义化更强,便于Spring框架进行AOP切面定向,实现事务管理、日志记录等横切关注点。UserService示例:@ServicepublicclassUserService{privatefinalOrderServiceorderService;

//构造器注入(Spring6.x可省略@Autowired)publicUserService(OrderServiceorderService){this.orderService=orderService;}}OrderService示例:@Service("orderService")publicclassOrderService{publicintgetOrderCount(LonguserId){

//...业务逻辑...}}构造器注入优势:确保依赖在对象创建时就被正确初始化,避免了使用`null`的风险;通过`final`关键字保证依赖不可变;同时,这种方式也更便@Bean自定义Bean@Bean注解用于在配置类中自定义Bean的创建方法,特别适用于实例化第三方组件或需要进行复杂初始化逻辑的对象。示例代码@Bean(initMethod="init",destroyMethod="destroy")public

DateService

dateService(){DateServicedateService=newDateService();dateService.setFormat("yyyy-MM-ddHH:mm:ss");returndateService;}@Bean(name={"sysTime","systemTime"})publicDatesystemTime(){returnnewDate();}

Bean生命周期管理通过`initMethod`指定的方法会在Bean初始化完成后被调用;通过`destroyMethod`指定的方法会在Spring容器关闭时被调用(此特性仅对单例Bean有效)。启动类与容器初始化Main类使用AnnotationConfigApplicationContext加载配置类,从而完成IoC容器的初始化工作。代码示例try(AnnotationConfigApplicationContextcontext=newAnnotationConfigApplicationContext(AppConfig.class)){System.out.println("Bean总数:"

+context.getBeanDefinitionCount());UserServiceuserService=context.getBean(UserService.class);}预期Bean:AppConfig、UserService、OrderService、dateService、systemTime(共5个)。try-with-resources确保容器在使用后自动关闭,从而触发Bean的销毁方法。组件扫描高级配置@ComponentScan高级属性:basePackages指定扫描根路径,includeFilters/excludeFilters自定义规则,useDefaultFilters禁用默认规则。FilterType类型:ANNOTATION(按注解)、ASSIGNABLE_TYPE(按类/接口)、REGEX(按正则)、ASPECTJ(按AspectJ表达式)、CUSTOM(自定义TypeFilter)。示例代码@ComponentScan(basePackages="com.example",includeFilters={@Filter(type=ANNOTATION,classes=Service.class),@Filter(type=ASSIGNABLE_TYPE,classes=UserDao.class)},excludeFilters=@Filter(type=REGEX,pattern=".*Test.*"),useDefaultFilters=false)@Autowired与@Resource对比特性@Autowired@Resource来源Spring特有JDK内置(JSR-250)默认注入方式按类型(byType)按名称(byName)后按类型注解位置支持字段、构造器、方法字段、方法(不支持构造器)依赖required特性有(默认true)无最佳实践纯Spring项目用@Autowired+@Qualifier,跨框架项目用@Resource,构造器注入优先。运行结果与解析预期控制台输出DateService初始化,格式:yyyy-MM-ddHH:mm:ss容器初始化完成,Bean总数:5User_1001,OrderCount:42系统时间:MonOct0220:51:38CST2025DateService销毁结果解析验证组件扫描、@Bean注册、依赖注入、生命周期管理均正常工作。异常排查启示Bean总数不符检查扫描路径,NPE检查依赖注入,初始化失败检查@Bean方法。常见问题与解决方案NoSuchBeanDefinitionException:组件未标注注解、扫描路径错误、@Bean定义错误→检查注解、验证扫描路径、修正@Bean方法。NoUniqueBeanDefinitionException:同类型多Bean未指定→@Qualifier或@Resource(name)。NullPointerException:依赖注入失败→确保依赖存在、使用构造器注入、处理null情况。BeanCreationException:@Bean方法异常→检查初始化逻辑、添加异常处理。构造器循环依赖:A依赖B且B依赖A→@Lazy或Se

温馨提示

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

评论

0/150

提交评论