Springboot 常用注解

02876c2ca6fb45069f4368eec933309c.jpg自动装配

 

@ComponentScan

用于配置Spring需要扫描的被组件注解注释的类所在的包。

 

@Component

用于标注一个普通的组件类,它没有明确的业务范围,只是通知Spring被此注解的类需要被纳入到Spring Bean容器中并进行管理。

 

@Autowired

Autowired用于自动装配,对于接口的实现类,可以使用该注解,消除get和set方法。

 

声明一个接口

 

public interface UserService {

    void readyTest(String var);

}

单个实现类

新建一个类,实现该接口

 

import org.springframework.stereotype.Service;

 

@Service

public class UserServiceImpl implements UserService{

    @Override

    public void readyTest(String var) {

        System.out.println("方法被调用,收到参数:"+var);

    }

}

使用@Autowired注解,实现属性的自动装配

 

@SpringBootTest

class TestApplicationTests {

 

    // 属性自动装配,可以省略get和set方法

    // 此处的属性名称可以任意自定义,都会去找 UserService 接口的唯一实现类

    @Autowired

    UserService userServiceImpl;

 

    @Test

    void contextLoads() {

        userServiceImpl.readyTest("Autowired");

    }

 

}

多个实现类

我们新建一个实现类

 

import org.springframework.stereotype.Service;

 

@Service

public class UserServiceNewImpl implements UserService{

    @Override

    public void readyTest(String var) {

        System.out.println("新方法被调用,收到参数:"+var);

    }

}

当有多个实现类的情况下,会报错:无法自动装配。存在多个 'UserService' 类型的 Bean。

 

idea会自动识别此错误。

 

此时需要显式指定实现类:

 

@SpringBootTest

class TestApplicationTests {

 

    @Autowired

    UserService userServiceNewImpl;// 参数名称为类名

 

    @Test

    void contextLoads() {

        userServiceNewImpl.readyTest("Autowired");

    }

 

}

或者配合@Qualifier注解使用:

 

@SpringBootTest

class TestApplicationTests {

 

    @Autowired

    @Qualifier("userServiceNewImpl") // 指定实现类

    UserService userService;

 

    @Test

    void contextLoads() {

        userService.readyTest("Autowired");

    }

 

}

@Resource

@Resource 和 @Autowired 一样,是用来实现依赖注入的。

 

声明一个接口

 

public interface UserService {

    void readyTest(String var);

}

单个实现类

新建一个类,实现该接口

 

import org.springframework.stereotype.Service;

 

@Service

public class UserServiceImpl implements UserService{

    @Override

    public void readyTest(String var) {

        System.out.println("方法被调用,收到参数:"+var);

    }

}

使用@Resource 注解,实现属性的自动装配

 

@SpringBootTest

class TestApplicationTests {

 

    @Resource

    UserService userService;

 

    @Test

    void contextLoads() {

        userService.readyTest("Resource");

    }

 

}

当单个实现类,对应不同的bean时,也可以使用name属性指定具体的bean

 

@SpringBootTest

class TestApplicationTests {

 

    @Resource(name="student")

    private SayInterface student;

    @Resource(name="teacher")

    private SayInterface teacher;

 

    @Test

    void contextLoads() {

        student.say();

        teacher.say();

    }

 

}

 

@Configuration

public class HumanConfig {

    @Bean(name = "student",initMethod = "init")

    public Human getStudent() {

        Human student = new Human();

        student.setName("Teacher");

        return student;

    }

 

    @Bean(name = "teacher",destroyMethod = "destroy")

    public Human getTeacher() {

        Human teacher = new Human();

        teacher.setName("Student");

        return teacher;

    }

}

多个实现类

我们新建一个实现类

 

import org.springframework.stereotype.Service;

 

@Service

public class UserServiceNewImpl implements UserService{

    @Override

    public void readyTest(String var) {

        System.out.println("新方法被调用,收到参数:"+var);

    }

}

当有多个实现类的情况下,会报错:org.springframework.beans.factory.BeanCreationException: Error creating bean with name

 

需要区分的是,idea不会自动识别此错误,在运行时才会报错。

 

解决方法就是手动指定@Resource的name属性:

 

@SpringBootTest

class TestApplicationTests {

 

    @Resource(name = "userServiceNewImpl")

    UserService userService;

 

    @Test

    void contextLoads() {

        userService.readyTest("Resource");

    }

 

}

@Configuration

@Configuration用于定义配置类,可替换xml配置文件,被注解的类内部包含有一个或多个被@Bean注解的方法,这些方法将会被AnnotationConfigApplicationContext或AnnotationConfigWebApplicationContext类进行扫描,并用于构建bean定义,初始化Spring容器。

 

简单来说,就是初始化bean所对应的对象,提供默认属性。

 

@Configuration

public class HumanConfig {

    @Bean(name = "student",initMethod = "init")

    public Human getStudent() {

        Human student = new Human();

        student.setName("Teacher");

        return student;

    }

 

    @Bean(name = "teacher",destroyMethod = "destroy")

    public Human getTeacher() {

        Human teacher = new Human();

        teacher.setName("Student");

        return teacher;

    }

}

@ConditionalOnWebApplication

只有当spring为web服务时,才使注解生效

 

@AutoConfigureAfter

在加载配置类之后再加载当前类

 

@ConditionalOnProperty

控制配置类是否生效

 

name

配置项的名字

 

havingValue

与配置的值对比

 

matchIfMissing

未配置属性时的匹配方式

 

@Bean

方法级别上的注解,产生一个被IOC容器所管理的bean。bean可以理解为一个豆子,一个对象。

 

创建一个类:

 

import lombok.Data;

 

@Data

public class Human implements SayInterface {

 

    private String name;

 

    @Override

    public void say() {

        System.out.println("Hello " + name);

    }

 

    public void init() {

        System.out.println(name + " init");

    }

 

    public void destroy() {

        System.out.println(name + " destroy");

    }

}

创建一个配置类:

 

@Configuration

public class HumanConfig {

    // 默认bean的名称和方法名相同

    // 使用name定义bean的名称

    // initMethod声明周期,创建后执行

    @Bean(name = "student",initMethod = "init")

    public Human getStudent() {

        Human student = new Human();

        student.setName("Teacher");

        return student;

    }

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux--进程终止

1.进程退出场景 进程退出场景只有三种: 代码运行完毕,结果正确代码运行完毕,结果错误代码在运行期间异常中断,退出进程 比如:对于错误的进程,可以通过不同的返回值来确定,什么是错误码呢&#x…

微信小程序前后端交互与WXS的应用

目录 前言 一、后台数据交互 1.数据表 2.后端代码的实现 3.前后端交互 3.1.后端接口URL管理 3.2.发送后端请求 3.3.请求方式的封装 4.前端代码的编写 二、WXS的使用 1、.wxs 文件 2.综合运用 前言 当今社交媒体的普及使得微信小程序成为了一种流行的应用开发形式。…

BUUCTF 大白 1

BUUCTF:https://buuoj.cn/challenges 题目描述: 看不到图? 是不是屏幕太小了 。 密文: 下载附件后解压,发现一张名为dabai.png的图片。 (似乎因为文件被修改过,原图片无法放在这里,这张图片是…

【JavaScript】深入浅出理解事件循环

1. 浏览器的进程模型 1.1 进程 程序运行需要有它自己专属的内存空间,可以把这块内存空间简单的理解为进程。 每个应用至少有一个进程,进程之间相互独立,即使要通信,也需要双方同意。 1.2 线程 有了进程后,就可以运…

【讲座笔记】基于 Apache Calcite 的多引擎指标管理最佳实践|CommunityOverCode Asia 2023 | 字节开源

引言 三个问题 (问题解法) 1套SQL 2种语法 统一SQL的实践案例 虚拟列的实践案例 SQL Define Function 指标管理的实现 在这里插入图片描述

还不知道光场相机吗?

1.什么是光场? 光场(light field):就是指光在每一个方向通过每一个点的光量。 从概念里,你至少可以得到两点信息: 光场包含光的方向光场包含一个点的光量 2.什么是光场相机 我们知道普通的相机拍照成像…

【MyBatisPlus】快速入门、常用注解、常用配置

🐌个人主页: 🐌 叶落闲庭 💨我的专栏:💨 c语言 数据结构 javaEE 操作系统 Redis 石可破也,而不可夺坚;丹可磨也,而不可夺赤。 MyBatisPlus 一、快速入门1.1 引入MyBatisP…

发挥服务器的无限潜能:创意项目、在线社区和更多

✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 ✨特色专栏&#xff1a…

docker 安装 sftpgo

sftpgo 简介 sftpgo 是一个功能齐全且高度可配置的 SFTP 服务器,具有可选的 HTTP/S、FTP/S 和 WebDAV 支持。支持多种存储后端:本地文件系统、加密本地文件系统、S3(兼容)对象存储、Google 云存储、Azure Blob 存储、SFTP。 官…

Rust之自动化测试(三): 测试组合

开发环境 Windows 10Rust 1.73.0 VS Code 1.83.1 项目工程 这里继续沿用上次工程rust-demo 测试组合 正如本章开始时提到的,测试是一个复杂的学科,不同的人使用不同的术语和组织。Rust社区根据两个主要类别来考虑测试:单元测试和集成测试。单元测试很…

轻松搭建个人web站点:OpenWRT教程结合内网穿透技术实现公网远程访问

文章目录 前言1. 检查uhttpd安装2. 部署web站点3. 安装cpolar内网穿透4. 配置远程访问地址5. 配置固定远程地址 前言 uhttpd 是 OpenWrt/LuCI 开发者从零开始编写的 Web 服务器,目的是成为优秀稳定的、适合嵌入式设备的轻量级任务的 HTTP 服务器,并且和…

ubuntu启动模式介绍以及如何进入单用户模式和恢复模式

Ubuntu操作系统提供了多种启动模式,每种模式都有不同的用途和功能。下面将深入介绍Ubuntu的几种启动模式: 正常启动模式(Normal boot):这是默认的启动模式,也是大多数用户使用的模式。在正常启动模式下&am…

mk语法示例

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

gitlab 离线安装问题解决:NOKEY,signature check fail

文章目录 1,安装gitlab-ce-161.1,rpm安装gitlab问题: NOKEY、signature check fail1.2, docker 启动 gitlab: ThreadError: cant create Thread: Operation not permitted 2,安装gitlab-ce-142.1 修改配置,重新编译2.2 root用户启…

陪诊小程序|陪诊小程序关爱健康,无忧陪伴

随着社会发展和人们生活水平的提高,健康问题成为人们关注的焦点。然而,在就医过程中,许多患者常常感到孤独和无助,缺乏得到家人陪伴的温暖与安慰。为了解决这一问题,我们公司开发了一款创新的陪诊小程序软件&#xff0…

迁移conda环境后,非root用户执行pip命令和jupyter命令报错/bad interpreter: Permission denied

移动conda环境,在移动的环境执行pip和jupyter 报错-bash: /data/home/用户名/anaconda3/envs/llm/bin/pip: /root/anaconda3/envs/llm/bin/python: bad interpreter: Permission denied 报错信息 一、原因 原因是当前的这个data/home/用户名/anaconda3/envs/环境名…

POSIX信号量

目录 信号量的原理 信号量函数 使用信号量实现线程互斥功能 基于环形队列的生产消费模型 生产者和消费者必须遵守的两个规则 信号量的原理 通过之前的学习,我们知道有的资源可能会被多个执行流同时申请访问,我们将这种资源叫做临界资源&#xff0c…

记录一次线下渗透电气照明系统(分析与实战)

项目地址:https://github.com/MartinxMax/S-Clustr 注意 本次行动未造成任何设备损坏,并在道德允许范围内测试 >ethical hacking< 发现过程 在路途中,发现一个未锁的配电柜,身为一个电工自然免不了好奇心(非专业人士请勿模仿,操作不当的话220V人就直了) 根据照片,简…

算法__中缀表达式转后缀表达式

文章目录 概念算法中缀转后缀案例讲解 后缀算值案例讲解 概念 中缀表达式就是日常生活中遇到的运算表达式&#xff0c;例如a*(b-c)&#xff1b; 后缀表达式则是另一种运算表达式&#xff0c;其特点在于运算符在对象后&#xff0c;且表达式中没有括号&#xff0c;例如abc-* 算…

观察者模式-对象间的联动

有个商城小程序&#xff0c;用户希望当有新品上市的时候能通知他们。这样用户就可以不要时刻盯着小程序了。在这个场景中&#xff0c;用户向小程序订阅了一个服务——发送新品短信。小程序在有新品上线时负责向订阅客户发出这个消息。 这就是发布-订阅模式&#xff0c;也称观察…