聊聊Spring中的@Autowired注解

大家好,今天来跟大家简单聊聊@Autowired,Autowired翻译过来为自动装配,也就是自动给Bean对象的属性赋值

@Target({ElementType.CONSTRUCTOR, ElementType.METHOD, 
         ElementType.PARAMETER, ElementType.FIELD, 
         ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Autowired {

	/**
	 * Declares whether the annotated dependency is required.
	 * <p>Defaults to {@code true}.
	 */
	boolean required() default true;

}

以上是@Autowired的定义,重点看 @Target,我们发现@Autowired可以写在:

  1. ElementType.CONSTRUCTOR:表示可以写在构造方法上
  2. ElementType.METHOD:表示可以写在普通方法上
  3. ElementType.PARAMETER:表示可以写在方法参数前
  4. ElementType.FIELD:表示可以写在属性上
  5. ElementType.ANNOTATION_TYPE:表示可以写在其他注解上

写在构造方法上

对于@Autowired写在构造方法上的情况,跟Spring选择构造方法的逻辑有关,一个类中是不是有多个构造方法,是不是加了@Autowired注解,是不是有默认构造方法,跟构造方法参数类型和个数都有关系,后面单独来介绍。

写在普通方法上

对于@Autowired写在普通方法上的情况,我们通常写的setter方法其实就是一个普通的setter方法,那非setter方法上加@Autowired会有作用吗?

比如:

@Component
public class UserService {

	@Autowired
	public void test(OrderService orderService) {
		System.out.println(orderService);
	}

}

这个test方法会被Spring自动调用到,并且能打印出OrderService对应的Bean对象。

写在方法参数前

把@Autowired写在参数前没有多大意义,只在spring-test中有去处理这种情况,源码注释原文:

Although @Autowired can technically be declared on individual method or constructor parameters since Spring Framework 5.0, most parts of the framework ignore such declarations. The only part of the core Spring Framework that actively supports autowired parameters is the JUnit Jupiter support in the spring-test module

写在属性上

这种情况不用多说了,值得注意的是,默认情况下,因为@Autowired中的required属性为true,表示强制依赖,如果更加某个属性找不到所依赖的Bean是不会赋null值的,而是会报错,如果把required属性设置为false,则会赋null值。

写在其他注解上

比如我们可以自定义要给注解:

@Autowired
@Retention(RetentionPolicy.RUNTIME)
public @interface HoellerAutowired {
}

@HoellerAutowired和@Autowired是等价的,能用@Autowired的地方都可以用@HoellerAutowired代替。

#23届找工作求助阵地##我的实习求职记录##实习,投递多份简历没人回复怎么办#
全部评论

相关推荐

想干测开的tomca...:让我来压力你!!!: 这份简历看着“技术词堆得满”,实则是“虚胖没干货”,槽点一抓一大把: 1. **项目描述是“技术名词报菜名”,没半分自己的实际价值** 不管是IntelliDoc还是人人探店,全是堆Redis、Elasticsearch、RAG这些时髦词,但你到底干了啥?“基于Redis Bitmap管理分片”是你写了核心逻辑还是只调用了API?“QPS提升至1500”是你独立压测优化的,还是团队成果你蹭着写?全程没“我负责XX模块”“解决了XX具体问题”,纯把技术文档里的术语扒下来凑字数,看着像“知道名词但没实际动手”的实习生抄的。 2. **短项目塞满超纲技术点,可信度直接***** IntelliDoc就干了5个月,又是RAG又是大模型流式响应又是RBAC权限,这堆活儿正经团队分工干都得小半年,你一个后端开发5个月能吃透这么多?明显是把能想到的技术全往里面塞,生怕别人知道你实际只做了个文件上传——这种“技术堆砌式造假”,面试官一眼就能看出水分。 3. **技能栏是“模糊词混子集合”,没半点硬核度** “熟悉HashMap底层”“了解JVM内存模型”——“熟悉”是能手写扩容逻辑?“了解”是能排查GC问题?全是模棱两可的词,既没对应项目里的实践,也没体现深度,等于白写;项目里用了Elasticsearch的KNN检索,技能栏里提都没提具体掌握程度,明显是“用过但不懂”的硬凑。 4. **教育背景和自我评价全是“无效信息垃圾”** GPA前10%这么好的牌,只列“Java程序设计”这种基础课,分布式、微服务这些后端核心课提都不提,白瞎了专业优势;自我评价那堆“积极认真、细心负责”,是从招聘网站抄的模板吧?没有任何和项目挂钩的具体事例,比如“解决过XX bug”“优化过XX性能”,纯废话,看完等于没看。 总结:这简历是“技术名词缝合怪+自我感动式凑数”,看着像“背了后端技术栈名词的应届生”,实则没干货、没重点、没可信度——面试官扫30秒就会丢一边,因为连“你能干嘛”都没说清楚。
点赞 评论 收藏
分享
评论
2
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务