Springboot-注册注解【springboot常用注解】

1.组件注册

1.1 使用的注解

  • @Configuration:普通配置类,替代以前的配置文件,配置类本身也是容器的组件|
  • @SpringBootConfiguration:Springboot配置类,与@Configuration功能一样|
  • @Bean:替代以前的Bean标签,如果没有在Bean标签内定义名字,则默认组件的名字为方法名,可以直接修改注解的名字|
  • @Scope:多实例获取
  • @Import:导入第三方组件

1.2 步骤

1、@Configuration 编写一个配置类
2、在配置类中,自定义方法给容器中注册组件。配合@Bean
3、或使用@Import 导入第三方的组件

1.3 实战

第一步:创建一个组件,比如我创建的是一个Cat实体类

public class Cat {
    private Long id;
    private String name;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

在这里插入图片描述
第二步:创建一个配置类,并且注册相应的组件,我创建的类名为ApplConfig

@Import(DruidRuntimeException.class) //第三方类,也可以通过Import导入,给容器中放指定类型的组件,组件的名字默认是全类名
@SpringBootConfiguration // 定义配置文件
public class AppConfig {
    @Scope
    @Bean("user01")
    public User user(){
        var user=new User();
        user.setName("张三");
        user.setId(1L);
        return user;
    }

    //2.给第三方类注册组件
    @Bean
    public FastsqlException fastsqlException(){
        return new FastsqlException();
    }

}

在这里插入图片描述
第三步: 查看是否注册成功,在主程序中,查看容器中是否有这些组件

@SpringBootApplication// 告诉系统这是一个Springboot的应用
public class Boot2DemoApplication {

    public static void main(String[] args) {
        // java10:局部变量类型的自动推断
        var ioc = SpringApplication.run(Boot2DemoApplication.class, args);

        for (String s : ioc.getBeanNamesForType(User.class)) {
            System.out.println(s);
        }

        // 查看第三方库是否注册成功
        for (String s : ioc.getBeanNamesForType(FastsqlException.class)) {
            System.out.println(s);
        }

        for (String s :ioc.getBeanNamesForType(DruidRuntimeException.class)) {
            System.out.println(s);
        }
        
    }

}

在这里插入图片描述

2. 条件注解

2.1 使用的注解

@ConditionalOnXxx

  • @ConditionalOnClass:如果类路径中存在这个类,则触发指定行为
  • @ConditionalOnMissingClass:如果类路径中不存在这个类,则触发指定行为
  • @ConditionalOnBean:如果容器中存在这个Bean(组件),则触发指定行为
  • @ConditionalOnMissingBean:如果容器中不存在这个Bean(组件),则触发指定行为
  • @ConditionalOnBean(value=组件类型,name=组件名字):判断容器中是否有这个类型的组件,并且名字是指定的值

2.2 实战

场景:
● 如果存在FastsqlException这个类,给容器中放一个Cat组件,名cat01,
● 否则,就给容器中放一个Dog组件,名dog01
● 如果系统中有dog01这个组件,就给容器中放一个 User组件,名zhangsan 
● 否则,就放一个User,名叫lisi

代码:

@ConditionalOnClass(value = "com.alibaba.druid.FastsqlException") //放在类级别,如果注解判断生效,则整个配置类才会生效
@SpringBootConfiguration
public class AppConfig2 {
    @ConditionalOnClass(FastsqlException.class) // 如果类路径中存在这个类,则触发指定行为
    @Bean
    public Cat cat01(){
        return new Cat();
    }

    @ConditionalOnMissingClass(value="com.alibaba.druid.FastsqlException")// 如果类路径中不存在这个类,则触发指定行为
    @Bean
    public Dog dog01(){
        return new Dog();
    }

    @ConditionalOnBean(value = Dog.class) // 在有这个组件类的情况指定行为
    @Bean
    public User zhangsan(){
        return  new User();
    }

    @ConditionalOnMissingBean(value = Dog.class)// 在没有这个组件类的情况指定行为
    @Bean
    public User lisi(){
        return new User();
    }
}

在这里插入图片描述

验证是否按照指定条件注册的组件:在主程序中运行下面代码

@SpringBootApplication// 告诉系统这是一个Springboot的应用
public class Boot2DemoApplication {

    public static void main(String[] args) {
        // java10:局部变量类型的自动推断
        var ioc = SpringApplication.run(Boot2DemoApplication.class, args);
        
        // 查看一下容器中cat类的组件有哪些
        for (String s : ioc.getBeanNamesForType(Cat.class)) {
            System.out.println(s);
        }

        for (String s : ioc.getBeanNamesForType(Dog.class)) {
            System.out.println(s);
        }

        for (String s : ioc.getBeanNamesForType(User.class)) {
            System.out.println(s);
        }
    }
}

在这里插入图片描述

3.属性绑定

3.1 使用的注解

  • @ConfigurationProperties: 声明组件的属性和配置文件哪些前缀开始项进行绑定
  • @EnableConfigurationProperties:快速注册注解:

3.2 步骤

将容器中任意组件(Bean)的属性值和配置文件的配置项的值进行绑定

  • 1、给容器中注册组件(@Component、@Bean)
  • 2、使用@ConfigurationProperties 声明组件和配置文件的哪些配置项进行绑定
  • 或者使用@EnableConfigurationProperties注解
场景:SpringBoot默认只扫描自己主程序所在的包。如果导入第三方包,即使组件上标注了
 @Component、@ConfigurationProperties 注解,也没用。
 因为组件都扫描不进来,此时使用这个注解就可以快速进行属性绑定并把组件注册进容器

3.2 实战

使用@ConfigurationProperties注解

第一步:注册组件
创建一个pig组件

@ConfigurationProperties(prefix ="pig")
@Component
public class Pig {
    private Long id;
    private String name;
    private Integer age;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Pig{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

在这里插入图片描述
第二步:在配置文件properties中写好对应的配置

pig.id=1
pig.name=佩奇
pig.age=5

在这里插入图片描述
第三步:测试一下属性是否绑定成功


@SpringBootApplication// 告诉系统这是一个Springboot的应用
public class Boot2DemoApplication {

    public static void main(String[] args) {
        // java10:局部变量类型的自动推断
        var ioc = SpringApplication.run(Boot2DemoApplication.class, args);

        Pig pig=ioc.getBean(Pig.class);
        System.out.println("pig"+pig);

    }

}

在这里插入图片描述
方式二
也可以将组件类名上方的@component取消掉,直接在配置类中注册组件也是可以的

@SpringBootConfiguration
public class AppConfig2 {
    @Bean
    public Pig pig(){
        return new Pig();
    }
}

方法三
也可以将prefix也放到配置文件中

@SpringBootConfiguration
public class AppConfig2 {
    @Bean
    @ConfigurationProperties(prefix ="pig")
    public Pig pig(){
        return new Pig();
    }
}
使用@EnableConfigurationProperties注解

第一步:先在bean中创建一个sheep组件,并且加上@ConfigurationProperties注解,绑定属性
@ConfigurationProperties(prefix = “sheep”)
public class Sheep {
private Long id;
private String name;
private Integer age;

public Long getId() {
    return id;
}

public void setId(Long id) {
    this.id = id;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public Integer getAge() {
    return age;
}

public void setAge(Integer age) {
    this.age = age;
}

@Override
public String toString() {
    return "Sheep{" +
            "id=" + id +
            ", name='" + name + '\'' +
            ", age=" + age +
            '}';
}

}

第二步:在配置文件`properties`中写好对应的配置
~~~ java
pig.id=1
pig.name=哈利
pig.age=5

第三步:在配置类中配置

/*
@EnableConfigurationProperties有两个功能
1.开启sheep的属性绑定
2.默认会直接把这个组件放到容器中
*/
@EnableConfigurationProperties(Sheep.class)
@SpringBootApplication
public class AppConfig3 {

}

使用@EnableConfigurationProperties会把属性与组件绑定,并且还会自动将组件放到容器中./一般用于第三方写好的组件进行属性绑定,springboot默认只扫描主程序所在的包.

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

在gitlab上使用server_hooks

文章目录 1. 前置条件2. Git Hook2.1 Git Hook 分为两部分:本地和远程2.1.1 本地 Git Hook,由提交和合并等操作触发:2.1.2 远程 Git Hook,运行在网络操作上,例如接收推送的提交: 3. 操作步骤3.1 对所有的仓…

Linux下的文件IO之系统IO

1. 知识点 读入写出,切记以我们程序为中心向文件或者别的什么东西读入写出(输入流输出流) 人话就是 文件向我们程序就是读入 程序向文件或者别的什么就是写出 2. open打开文件 open.c /****************************************************…

C++ 学习之函数成员指针的一个小细节

看看下面的代码,你能看出错误吗 class A { public:void fun(){}}; int main() {A a;void (A:: * p)() &A::fun;(*p)(); } 这段代码在调用成员函数时存在问题。正确的方式是使用对象来调用成员函数,而不是通过指针。以下是修正后的代码&#xff1a…

STM32CubeIDE(CUBE-MX hal库)----定时器

系列文章目录 STM32CubeIDE(CUBE-MX hal库)----初尝点亮小灯 STM32CubeIDE(CUBE-MX hal库)----按键控制 STM32CubeIDE(CUBE-MX hal库)----串口通信 文章目录 系列文章目录前言一、定时器二、使用步骤三、HAL库实验代码三、标准库代码 前言 STM32定时器是一种多功能外设&#…

异常 Exception 02

异常 Exception 02 六、异常处理1、基本介绍2、异常处理的方式3、示意图 try-catchthrows1、介绍2、注意事项 自定义异常1、基本概念2、自定义异常的步骤3、实例4、throw和throws的区别 六、异常处理 1、基本介绍 异常处理就是当异常发生时,对异常处理的方式。 2、异常处理的…

以STM32CubeMX创建DSP库工程方法一

以STM32CubeMX创建DSP库工程方法 略过时钟树的分配和UART的创建等,直接进入主题生成工程文件 它们中的文件功能如下: 1)BasicMathFunctions 基本数学函数:提供浮点数的各种基本运算函数,如向量加减乘除等运算。 2&…

VBA代码解决方案第8讲:用FindPrevious进行重复搜索及利用LIKE查找

《VBA代码解决方案》(版权10028096)这套教程是我最早推出的教程,目前已经是第三版修订了。这套教程定位于入门后的提高,在学习这套教程过程中,侧重点是要理解及掌握我的“积木编程”思想。要灵活运用教程中的实例像搭积木一样把自己喜欢的代码…

货代FOB条款卖方必备的知识:发货人都要承担哪些费用呢?

据统计,中国出口中以FOB成交的占到70%,但专家指出:FOB对出口商的风险更大,有可能造成货、款两空的结局。 目前我国出口合同以FOB价格条款成交的比例越来越大,而且收货人指定船公司的少,指定境外货代的多&am…

3款厉害的小工具,小黑子都在用!

大家好,我是 Javapub。 程序员与普通人最大的区别是什么,当然是会使用工具。基于一些同学经常问我的问题,接下来给大家分享几款我经常使用的工具,主打一个提升效率。 第一款 Everything 用 windwos 的同学都体会过,…

带大家做一个,易上手的家常土豆片

还是先从冰箱里那一块猪瘦肉 搞一点蒜和生姜 切成小块 装进一个碗里 这里一点就够了 一条绿皮辣椒 切片 三个左右干辣椒 随便切两刀 让它小一点就好了 一起装一个碗 一大一小两个土豆切片 猪肉切片 起锅烧油 然后 下肉翻炒 等肉变颜色捞出来 然后放入土豆 和小半碗水 让…

JeecgBoot低代码开发—Vue3版前端入门教程

JeecgBoot低代码开发—Vue3版前端入门教程 后端接口配置VUE3 必备知识1.vue3新特性a. https://v3.cn.vuejs.org/b.setup的用法c.ref 和 reactive 的用法d.新版 v-model 的用法e.script setup的用法 2.TypeScript基础 后端接口配置 如何修改后台项目路径 http://127.168.3.52:8…

【玩转 EdgeOne】| 腾讯云下一代边缘加速CDN EdgeOne 是安全加速界的未来吗?

目录 前言边缘加速与安全加固边缘计算与CDN的融合EdgeOne优秀的安全特性EdgeOne卓越的性能表现灵活的配置和管理生态系统的支持与发展技术创新与未来展望EdgeOne试用结束语 前言 在当下互联网的迅猛发展的时刻,云计算和边缘计算技术的快速发展为网络加速领域带来了…

awk从放弃到入门(10):awk内置函数

awk从放弃到入门(10):awk内置函数 算数函数字符串函数其他函数 本博文转载自 这篇文章中的知识点是建立在前文的基础上的,如果你还没有掌握前文中的知识,请先参考之前的文章。 注:在阅读这篇文章之前&…

Abbyy FineReader16最新版本有哪些新功能?

在数字化时代,数据处理和转换变得非常重要,Abbyy FineReader 就是一款专门用于处理、转换和识别图像和 PDF 文件的软件。在本文中,我们将会详细介绍 Abbyy FineReader 的功能以及适合使用该软件的电脑。 ABBYY Finereader 16-安装包下载如下&…

滴滴2023.11.27P0级故障技术复盘回顾(k8s的的错?)

本文从滴滴官方恢复及技术公众号带大家从技术角度复盘这次事故 目录 1. 背景 2. 滴滴官方消息 3. 问题分析及定位 4.网传的k8s及解析 5.k8s引发的思考:举一反三,怎么避免再次出现 6.近段时间其他平台崩溃回顾 1. 背景 11 月 27 晚约 10 点&#xf…

TFIDF、BM25、编辑距离、倒排索引

TFIDF TF刻画了词语t对某篇文档的重要性,IDF刻画了词语t对整个文档集的重要性

最简单的链路追踪收集器

链路追踪可帮助您快速了解程序服务之间的调用关系,并快速洞悉内部发生的情况。主流的链路追踪系统有zipkin,jaeger,skywalking等,由于opentelemetry的存在,都具有opentelemetry的转换器。 我们利用opentelemetry来进行zipkin,jaeger,skywalk…

智能优化算法应用:基于生物地理学算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于生物地理学算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于生物地理学算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.生物地理学算法4.实验参数设定5.算法结果…

在Rust中编写自动化测试

1.摘要 Rust中的测试函数是用来验证非测试代码是否是按照期望的方式运行的, 测试函数体通常需要执行三种操作:1.设置任何所需的数据或状态;2.运行需要测试的代码;3.断言其结果是我们所期望的。本篇文章主要探讨了Rust自动化测试的几种常见场景。 2.测试函数详解 在Rust项目工…

(三)基于高尔夫优化算法GOA求解无人机三维路径规划研究(MATLAB代码)

一、无人机模型简介: 单个无人机三维路径规划问题及其建模_IT猿手的博客-CSDN博客 参考文献: [1]胡观凯,钟建华,李永正,黎万洪.基于IPSO-GA算法的无人机三维路径规划[J].现代电子技术,2023,46(07):115-120 二、高尔夫优化算法GOA简介 高尔夫优化算法…