spring注解:@Autowired 和@Resource

简介: spring注解:@Autowired 和@Resource

刚开始接触spring的时候就接触到了注解,但那个时候是生硬的去用,去网上搜索学习也是一知半解的状态,经过多次项目中使用与时间沉淀下来的思考,才有了写有关注解博客的笔记。


关于@Autowired


1.@Autowired是spring框架自身提供的,属于org.springframework.beans.factory.annotation包


2.@Autowired默认按类型查找,有查找的优先顺序


按Type匹配(Match by Type)

按Qualifier匹配(Match by Qualifier)

按Name匹配(Match by Name)

3.默认情况下必须要求依赖对象必须存在


如果要允许null值,可以设置它的required属性为false,如:@Autowired(required=false)

若想要按名称装配,可以结合@Qualifier注解一起使用,如:@Autowired(required=false) @Qualifier("bean")

4.可以标注在字段或属性的setter方法上


5.异常


Spring上下文中存在不止一个userServiceImpl类型的bean时就会抛出BeanCreationException异常;


可以这样解决:

@Autowired   
@Qualifier("userServiceImpl")   
public IUserService userService; 

这样Spring会找到id为userServiceImpl的bean进行装配。


Spring上下文中不存在UserDao类型的bean,也会抛出BeanCreationException异常。

此时可以这样解决:

@Autowired(required = false)   
public IUserService userService  

关于@Resource


1.@Resource属于J2EE,在Java扩展包:javax.annotation.Resource

2.@Resource默认按名字查找,但是也有查找的优先顺序


按Name匹配(Match by Name)

按Type匹配(Match by Type)

按Qualifier匹配(Match by Qualifier)

3.@Resource注解和@Autowired一样,也可以标注在字段或属性的setter方法上


4.如果没有指定name属性,当注解写在字段上时,默认取字段名进行Name查找,如果注解写在setter方法上默认取属性名进行装配。当找不到与名称匹配的bean时才按照类型进行装配。但是需要注意的是,如果name属性一旦指定,就只会按照名称进行装配。


以@Resource注解为例说一下查找顺序的问题


@Resource的作用相当于@Autowired,只不过@Autowired默认按byType自动注入,而@Resource默认按 byName自动注入。


@Resource有两个属性是比较重要的,分是name和type

Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。所以如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。如果既不指定name也不指定type属性,这时将通过反射机制使用byName自动注入策略。

@Resource装配顺序

 1. 如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常

 2. 如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常

 3. 如果指定了type,则从上下文中找到类型匹配的唯一bean进行装配,找不到或者找到多个,都会抛出异常

 4. 如果既没有指定name,又没有指定type,则自动按照byName方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配;


总结:


推荐使用:@Resource注解在字段上,这样就不用写setter方法了;并且这个注解是属于J2EE的,减少了与spring的耦合。这样代码看起就比较优雅;而且考虑到效率问题的话更加建议使用。


博客有参考,但大多消化为个人理解,还将继续学习

目录
相关文章
|
2月前
|
缓存 监控 Java
SpringBoot @Scheduled 注解详解
使用`@Scheduled`注解实现方法周期性执行,支持固定间隔、延迟或Cron表达式触发,基于Spring Task,适用于日志清理、数据同步等定时任务场景。需启用`@EnableScheduling`,注意线程阻塞与分布式重复问题,推荐结合`@Async`异步处理,提升任务调度效率。
419 128
|
24天前
|
XML Java 应用服务中间件
【SpringBoot(一)】Spring的认知、容器功能讲解与自动装配原理的入门,带你熟悉Springboot中基本的注解使用
SpringBoot专栏开篇第一章,讲述认识SpringBoot、Bean容器功能的讲解、自动装配原理的入门,还有其他常用的Springboot注解!如果想要了解SpringBoot,那么就进来看看吧!
200 2
|
2月前
|
XML Java 数据格式
常用SpringBoot注解汇总与用法说明
这些注解的使用和组合是Spring Boot快速开发和微服务实现的基础,通过它们,可以有效地指导Spring容器进行类发现、自动装配、配置、代理和管理等核心功能。开发者应当根据项目实际需求,运用这些注解来优化代码结构和服务逻辑。
224 12
|
2月前
|
传感器 Java 数据库
探索Spring Boot的@Conditional注解的上下文配置
Spring Boot 的 `@Conditional` 注解可根据不同条件动态控制 Bean 的加载,提升应用的灵活性与可配置性。本文深入解析其用法与优势,并结合实例展示如何通过自定义条件类实现环境适配的智能配置。
133 0
探索Spring Boot的@Conditional注解的上下文配置
|
2月前
|
智能设计 Java 测试技术
Spring中最大化@Lazy注解,实现资源高效利用
本文深入探讨了 Spring 框架中的 `@Lazy` 注解,介绍了其在资源管理和性能优化中的作用。通过延迟初始化 Bean,`@Lazy` 可显著提升应用启动速度,合理利用系统资源,并增强对 Bean 生命周期的控制。文章还分析了 `@Lazy` 的工作机制、使用场景、最佳实践以及常见陷阱与解决方案,帮助开发者更高效地构建可扩展、高性能的 Spring 应用程序。
Spring中最大化@Lazy注解,实现资源高效利用
|
Java Spring
通过Spring Resource接口获取资源(6)
通过Spring Resource接口获取资源
1225 0
|
Java Spring 数据格式
Spring Resource接口获取资源
1.1.1. Resource简介  在Spring内部实现机制,针对于资源文件(配置的xml文件)有一个统一的接口Resource。   1.1.1.1. 接口定义的方法 1.exists():判断资源文件是否存在。
1728 0
|
Java Spring 数据格式
通过Spring Resource接口获取资源
通过Spring Resource接口获取资源 目录 1       Resource简介 2       通过ResourceLoader获取资源 3       在bean中获取Resource的方式   1       Resource简介        在Spring内部,针对于资源文件有一个统一的接口Resource表示。
1017 0
|
12天前
|
XML 前端开发 Java
一文搞懂 Spring Boot 自动配置原理
Spring Boot 自动配置原理揭秘:通过 `@EnableAutoConfiguration` 加载 `META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports` 中的配置类,结合 `@Conditional` 按条件注入 Bean,实现“开箱即用”。核心在于约定大于配置,简化开发。
235 0
|
4月前
|
Java Spring 容器
SpringBoot自动配置的原理是什么?
Spring Boot自动配置核心在于@EnableAutoConfiguration注解,它通过@Import导入配置选择器,加载META-INF/spring.factories中定义的自动配置类。这些类根据@Conditional系列注解判断是否生效。但Spring Boot 3.0后已弃用spring.factories,改用新格式的.imports文件进行配置。
802 0

热门文章

最新文章

下一篇
开通oss服务