【spring】@Autowired注解学习

news2024/11/24 13:35:53

@Autowired介绍

Spring框架是Java领域中一个非常重要的企业级应用开发框架,它提供了全面的编程和配置模型,旨在帮助开发者更快速、更简单地创建应用程序。在Spring框架中,@Autowired是一个非常重要的注解,它用于实现依赖注入(Dependency Injection, DI)的功能。

@Autowired注解是Spring框架提供的一种自动装配(autowiring)的方式。当一个bean需要注入一个或多个依赖时,Spring容器会自动寻找匹配的bean并注入。这个过程是基于类型(byType)的,默认情况下,Spring会寻找类型匹配的唯一bean来完成注入。如果找到多个同类型的bean,则需要通过其他方式指定具体注入哪一个。

什么是依赖注入?

依赖注入是一种设计模式,用于减少代码之间的耦合度。在这个模式中,对象不需要自己创建它所依赖的对象,而是通过外部注入这些依赖对象。这样可以提高代码的灵活性和可测试性,因为依赖的对象可以被轻松替换或修改。

@Autowired源码

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

	boolean required() default true;

}
源代码截图

@Autowired属性介绍

  • required:表示是否必须注入成功,取值为true或false。默认值是true,表示必须注入成功。当取值为true时,注入不成功会报错,否则,注入不成功不会报错。如果设置为false,则允许注入的依赖为null。从Spring 4.3开始,@Autowired可以用于final字段,但这种情况下不能设置required属性为false。如果需要自定义注入逻辑,可以通过实现@Autowired注解的@AutowiredAnnotationBeanPostProcessor类来实现。

@Autowired注解使用场景

  1. 构造函数注入:当 @Autowired 注解应用于构造函数时,Spring 容器会在创建 bean 时自动调用该构造函数,并注入所有需要的依赖。

  2. 方法注入:当 @Autowired 注解应用于方法时,Spring 容器会在创建 bean 后调用该方法,并注入所有需要的依赖。

  3. 字段注入:当 @Autowired 注解应用于字段时,Spring 容器会在创建 bean 时自动注入该字段。

  4. 属性 setter 方法注入:当 @Autowired 注解应用于 setter 方法时,Spring 容器会在创建 bean 后调用该 setter 方法,并注入所有需要的依赖。

  5. 当有多个Bean符合注入条件时,可以使用@Qualifier注解与@Autowired结合使用,来指定具体要注入的Bean。这样可以解决自动装配时的歧义问题。

@Autowired测试示例代码

示例代码 一
AutowiredDemoService类
package com.yang.SpringTest.annotation.autowiredLearn;

import org.springframework.stereotype.Service;

/**
 * <p>Service类</p>
 *
 * @author By: chengxuyuanshitang
 * Package com.yang.SpringTest.annotation.autowiredLearn
 * Ceate Time 2024-03-28 13:53
 */
@Service
public class AutowiredDemoService {
    public void test () {
        System.out.println ("this is AutowiredDemoService test");
    }
}

AutowiredDemoController类
package com.yang.SpringTest.annotation.autowiredLearn;

import lombok.ToString;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;

/**
 * <p>Controller类</p>
 *
 * @author By: chengxuyuanshitang
 * Package com.yang.SpringTest.annotation.autowiredLearn
 * Ceate Time 2024-03-28 13:53
 */
@ToString
@Controller
public class AutowiredDemoController {

    @Autowired
    private AutowiredDemoService autowiredDemoService;

    public void test () {
        System.out.println ("AutowiredDemoController.test");
        autowiredDemoService.test ();
    }

}

AutowiredDemoConfig配置类
package com.yang.SpringTest.annotation.autowiredLearn;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

/**
 * <p>AutowiredDemoConfig配置类</p>
 *
 * @author By: chengxuyuanshitang
 * Package com.yang.SpringTest.annotation.autowiredLearn
 * Ceate Time 2024-03-28 13:56
 */
@Configuration
@ComponentScan(value = {"com.yang.SpringTest.annotation.autowiredLearn"})
public class AutowiredDemoConfig {
}

AutowiredDemoTest测试类
package com.yang.SpringTest.annotation.autowiredLearn;

import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

/**
 * <p>AutowiredDemoTest测试类</p>
 *
 * @author By: chengxuyuanshitang
 * Package com.yang.SpringTest.annotation.autowiredLearn
 * Ceate Time 2024-03-28 13:57
 */
@Slf4j
public class AutowiredDemoTest {
    public static void main (String[] args) {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext (AutowiredDemoConfig.class);
        AutowiredDemoService autowiredDemoService = context.getBean (AutowiredDemoService.class);
        log.info ("autowiredDemoService is : [ {} ]", autowiredDemoService);
        AutowiredDemoController autowiredDemoController = context.getBean (AutowiredDemoController.class);
        log.info ("autowiredDemoController is : [ {} ]", autowiredDemoController);
        autowiredDemoController.test ();
    }
}

运行结果




本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1550896.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

保研线性代数机器学习基础复习1

1.什么是代数&#xff08;algebra&#xff09;? 为了形式化一个概念&#xff0c;构建出有关这个概念的符号以及操作符号的公式。 2.什么是线性代数&#xff08;linear algebra&#xff09;&#xff1f; 一项关于向量以及操作向量的公式的研究。 3.举一些向量的例子&#x…

我的编程之路:从非计算机专业到Java开发工程师的成长之路 | 学习路线 | Java | 零基础 | 学习资源 | 自学

小伙伴们好&#xff0c;我是「 行走的程序喵」&#xff0c;感谢您阅读本文&#xff0c;欢迎三连~ &#x1f63b; 【Java基础】专栏&#xff0c;Java基础知识全面详解&#xff1a;&#x1f449;点击直达 &#x1f431; 【Mybatis框架】专栏&#xff0c;入门到基于XML的配置、以…

C语言运算符和表达式——赋值运算符

目录 变量的定义 赋值运算符 赋值表达式 如何给变量赋值 变量的定义 声明变量的名字和类型 变量的类型决定了 *占用内存空间的大小 *数据的存储形式 *合法的表数范围 *可参与的运算种类 *变量名标识了内存中的一个存储单元 问题&#xff1a;未被初始化的变量的值是什么&a…

yolov8 pose keypoint解读

yolov8进行关键点检测的代码如下&#xff1a; from ultralytics import YOLO# Load a model model YOLO(yolov8n.pt) # pretrained YOLOv8n model# Run batched inference on a list of images results model([im1.jpg, im2.jpg]) # return a list of Results objects# Pr…

PCL拟合并绘制平面(二)

使用RANSAC拟合点云平面 1、C实现2、效果图 普通的点云平面拟合方式在一般情况下可以得到较好的平面拟合效果&#xff0c;但是容易出现平面拟合错误或是拟合的平面不是最优的情况。此时就需要根据自己的实际使用情况&#xff0c;调整平面拟合的迭代次数以及收敛条件。 使用RAN…

浏览器工作原理与实践--调用栈:为什么JavaScript代码会出现栈溢出

在上篇文章中&#xff0c;我们讲到了&#xff0c;当一段代码被执行时&#xff0c;JavaScript引擎先会对其进行编译&#xff0c;并创建执行上下文。但是并没有明确说明到底什么样的代码才算符合规范。 那么接下来我们就来明确下&#xff0c;哪些情况下代码才算是“一段”代码&am…

TheMoon 恶意软件短时间感染 6,000 台华硕路由器以获取代理服务

文章目录 针对华硕路由器Faceless代理服务预防措施 一种名为"TheMoon"的新变种恶意软件僵尸网络已经被发现正在侵入全球88个国家数千台过时的小型办公室与家庭办公室(SOHO)路由器以及物联网设备。 "TheMoon"与“Faceless”代理服务有关联&#xff0c;该服务…

46秒AI生成真人视频爆火,遭在线打假「换口型、声音」

ChatGPT狂飙160天&#xff0c;世界已经不是之前的样子。 新建了人工智能中文站 每天给大家更新可用的国内可用chatGPT资源 更多资源欢迎关注 是炒作还是真正的 AI 视频能力进化&#xff1f; AI 生成视频已经发展到这个程度了吗&#xff1f; 前段时间&#xff0c;英国王室凯特…

每天能提醒自己做事的app有哪个?

在忙碌的日常生活和工作中&#xff0c;我们时常面临各种任务和琐事。一旦处理不及时&#xff0c;很容易导致遗忘&#xff0c;进而给自己带来不必要的麻烦和损失。因此&#xff0c;拥有一款能够高效提醒我们做事的提醒app显得尤为重要。 敬业签就是这样一款实用的提醒软件。它不…

零基础10 天入门 Web3之第1天

10 天入门 Web3 Web3 是互联网的下一代&#xff0c;它将使人们拥有自己的数据并控制自己的在线体验。Web3 基于区块链技术&#xff0c;该技术为安全、透明和可信的交易提供支持。我准备做一个 10 天的学习计划&#xff0c;可帮助大家入门 Web3&#xff1a; 想要一起探讨学习的…

【氮化镓】位错对氮化镓(GaN)电子能量损失谱(EEL)的影响

本文献《Influence of dislocations on electron energy-loss spectra in gallium nitride》由C. J. Fall等人撰写&#xff0c;发表于2002年。研究团队通过第一性原理计算&#xff0c;探讨了位错对氮化镓&#xff08;GaN&#xff09;电子能量损失谱&#xff08;EEL&#xff09;…

python——修改注册表

如图&#xff1a;想要修改Public的值为2.2.1.1 import winreg# 定义要修改的键和新值 key_path rSOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList key_name Public new_name 2.2.1.1# 打开指定的键 # 注意此处是注册表路径拼接&#xff0c;此处是HKEY_LOCAL_MACH…

docker部署ubuntu

仓库&#xff1a; https://hub.docker.com/search?qUbuntu 拉一个Ubuntu镜像 docker pull ubuntu:18.04 查看本地镜像&#xff1a; docker images 运行容器 docker run -itd --name ubuntu-18-001 ubuntu:18.04 通过ps命令可以查看正在运行的容器信息 docker ps 进入容器 最…

Obsidian插件:增加目录栏 flating toc

一、插件介绍 增加目录栏 插件市场搜索 flating toc安装即可 二、使用 写文档时候可以看到左边默认出现目录 可以自己配置一些相关设置 最后也可以安装一下插件样式设置插件&#xff0c;自己按照自己喜好调整

leetcode —— 5.最长回文子串

题目&#xff1a; 给你一个字符串 s&#xff0c;找到 s 中最长的回文子串。 如果字符串的反序与原始字符串相同&#xff0c;则该字符串称为回文字符串。 示例 1&#xff1a; 输入&#xff1a;s "babad" 输出&#xff1a;"bab" 解释&#xff1a;"…

基础数据结构(蓝桥杯Python组)

链表 基础概念 链表可以快速插入、删除元素&#xff0c;用于存储数据。 每个节点维护两个部分:数据域和指针域数据域就是节点所存储的数据&#xff0c;指针其实就是下标&#xff08;next&#xff0c;节点的下一个节点在哪&#xff09;链表维护head和tail&#xff0c;每次从ta…

学浪视频提取

经过调查,学浪这个学习平台越来越多人使用了,但是学浪视频官方没有提供下载按钮,为了让这些人能够随时随地的观看视频,于是我钻研学浪视频的下载,终于研究出来了并且做成软件批量版 下面是学浪视频提取的软件,有需要的自己下载一下 链接&#xff1a;https://pan.baidu.com/s/…

由浅到深认识Java语言(36):I/O流

该文章Github地址&#xff1a;https://github.com/AntonyCheng/java-notes 在此介绍一下作者开源的SpringBoot项目初始化模板&#xff08;Github仓库地址&#xff1a;https://github.com/AntonyCheng/spring-boot-init-template & CSDN文章地址&#xff1a;https://blog.c…

C++中 eigen(一)建造向量

快速上手&#xff1a; https://eigen.tuxfamily.org/dox/group__QuickRefPage.html 文档&#xff1a; https://eigen.tuxfamily.org/dox/index.html Constructors 建造 向量 Vectors 向量 例如&#xff0c;方便的 typedef Vector3f 是一个包含 3 个浮点数的&#xff08;列&a…

Spring用到了哪些设计模式?

目录 Spring 框架中⽤到了哪些设计模式&#xff1f;工厂模式单例模式1.饿汉式&#xff0c;线程安全2.懒汉式&#xff0c;线程不安全3.懒汉式&#xff0c;线程安全4.双重检查锁&#xff08;DCL&#xff0c; 即 double-checked locking&#xff09;5.静态内部类6.枚举单例 代理模…