SpringBoot核心配置和注解

目录

一、注解

元注解

基本注解

启动注解

二、配置

格式介绍

读取配置文件信息

案例演示1

 嵌套读取bean信息

案例演示2

 读取Map,List 以及 Array 类型配置数据

案例演示3

 三、总结


一、注解

        之前我们了解了SpringBoot基础和AOP简单应用,这期来讲讲SpringBoot核心配置和注解 

        SpringBoot注解就是给代码打上标签的能力。通过引入注解,我们可以简单快速赋予代码生命力,大大提高代码可读性和扩展性。注解本身不具有任何能力,只是一个标签,但是我们可以定义各种标签然后实现各种标签处理器来对类、方法、属性甚至参数等进行功能扩展、功能开启、属性定义、行为定义、规则定义、关联处理、元数据定义等等。

元注解

@Documented:将会在被此注解注解的元素的javadoc文档中列出注解,一般都打上这个注解没坏处

@Target

        注解能被应用的目标元素,比如类、方法、属性、参数等等,需要仔细思考

@Retention

        仅在源码保留,还是保留到编译后的字节码,还是到运行时也去加载,超过90%的应用会在运行时去解析注解进行额外的处理,所以大部分情况我们都会设置配置为RetentionPolicy.RUNTIME

@Inherited

        如果子类没有定义注解的话,能自动从父类获取定义了继承属性的注解,比如Spring的@Service是没有继承特性的,但是@Transactional是有继承特性的,在OO继承体系中使用Spring注解的时候请特别注意这点,理所当然认为注解是能被子类继承的话可能会引起不必要的Bug,需要仔细斟酌是否开启继承

@Repeatable

        Java 8引入的特性,通过关联注解容器定义可重复注解,小小语法糖提高了代码可读性,对于元素有多个重复注解其实是很常见的事情,比如某方法可以是A角色可以访问也可以是B角色可以访问,某方法需要定时任务执行,要在A条件执行也需要在B条件执行

@Native

        是否在.h头文件中生成被标记的字段,除非原生程序需要和Java程序交互,否则很少会用到这个元注解

基本注解

@Service: 注解在类上,表示这是一个业务层bean

@Controller:注解在类上,表示这是一个控制层bean

@Repository: 注解在类上,表示这是一个数据访问层bean

@Component: 注解在类上,表示通用bean ,value不写默认就是类名首字母小写

@Autowired:按类型注入.默认属性required= tru

@Resource: 按名称装配。

启动注解

 SpringBootApplication

包括以下三个注解:

 @SpringBootConfiguration

          @Configuration: JavaConfig的功能,配置类,结合@Bean能够将对象注入到spring的IOC容器。@SpringBootConfiguration标注的类是配置类。

@EnableAutoConfiguration

         开启自动配置。 将spring和第三方库中的对象创建好,注入到spring容器避免写xml,去掉样例代码。 需要使用的对象,由框架提供。

 @ComponentScan 

         组件扫描器,<context:component-scan base-package="xxx包"/> 扫描@Controller, @Service, @Repository ,@Component注解, 创建他们的对象注入到容器

springboot约定:启动类,作为扫描包的根(起点)


二、配置

格式介绍

配置文件有两种格式分别properies 和  yamlyml)。

        properties 是Java 中的常用的一种配置文件格式,文件扩展名为properties。

语法格式是:key=value。key 是唯一的。

        yaml(Yet Another Markup Language)),是一种做配置文件的数据格式,文件扩展名是yaml 或yml(常用)

语法格式是:key:[空格]值。


YAML 基本语法规则:

 大小写敏感

 使用缩进表示层级关系

 缩进只可以使用空格,不允许使用Tab 键

 缩进的空格数目不重要,相同层级的元素左侧对齐即可

 #字符表示注释,只支持单行注释。#放在注释行的第一个字符

YAML 缩进必须使用空格,而且区分大小写,建议编写YAML 文件只用小写和空格。

YAML 支持三种数据结构

 对象:键值对的集合,又称为映射(mapping)/ 哈希(hashes) / 字典(dictionary)

 数组:一组按次序排列的值,又称为序列(sequence) / 列表(list)

 标量(scalars):单个的、不可再分的值,例如数字、字符串、true|false 等

存放路径:src/main/resource目录或者类路径的/config

读取配置文件信息

        Spring Boot 同时支持 properties yml  格式的配置文件。配置文件名称默认是 application 。我们可以使用application.properties 、 application.yml

读取配置文件的key 值,注入到Bean 的属性可用@Value,@Value 一次注入一个key 的值。

将多个key 值绑定到Bean 多个属性可以配合ConfigurationProperties 注解。 

在代码中访问属性还可以使用外部化配置的抽象对象Environment。使用Environment 的注入此对象,调用它的getProperty(String key)方法即可。

案例演示1

        需求:在application.properties 提供应用程序的name,owner, port 基本信息,程序读取这些数据,显示给用户。

        步骤1:新建maven项目,无需添加依赖

        步骤2:在application.properties 自定义配置项目

        步骤3:  创建SomeService 类读取app.name, app.owner,app.port 配置key。       

        注解@Value 读取单个值,语法${key:默认值}

     

@Service
public class SomeService {@Value("${app.name}")private String name;@Value("${app.owner}")private String owner;@Value("${app.port:8088}")private Integer prot;public void printValue(){//链接字符串StringJoiner joiner = new StringJoiner(";");joiner.add(name).add(owner).add(String.valueOf(prot));//打印出字符串String result = joiner.toString();System.out.println("result= "+ result);}

         步骤4:单元测试

        在test 目录下创建测试类,注入SomeService 对象,调用它的printValue()方法。


 嵌套读取bean信息

案例演示2

        需求:Bean 中包含其他Bean 作为属性,将配置文件中的配置项绑定到Bean 以及引用类型的成员。Bean 的定义无特殊要求。

        步骤1:在resources文件夹下新建 .yml 后缀的文件,添加依赖

       在 pom.xml 文件里添加以下依赖  

<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional>
</dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><optional>true</optional>
</dependency>

步骤2:新建pk02包,并建立两个类

//DoubBean 
@Configuration(proxyBeanMethods = false)
@ConfigurationProperties(prefix = "app1")
@Service
public class DoubBean {private String name;private String owner;private Integer port;private Seri ser;public String getName() {return name;}public void setName(String name) {this.name = name;}public String getOwner() {return owner;}public void setOwner(String owner) {this.owner = owner;}public Integer getPort() {return port;}public void setPort(Integer port) {this.port = port;}public Seri getSer() {return ser;}public void setSer(Seri ser) {this.ser = ser;}@Overridepublic String toString(){return "DoubBean{ \n"+"网站名="+name+"\n" +",浏览器cookic="+owner+"\n" +",端口="+port+"\n" +"用户信息:"+ser+"}";}
// Seri 
public class Seri {private String username;private String userpass;public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getUserpass() {return userpass;}public void setUserpass(String userpass) {this.userpass = userpass;}@Overridepublic String toString(){return "用户名:" + username +"  用户密码:" + userpass;}}

         步骤3:添加扫描包和单元测试方法

一定要先去启动类上面添加扫描注解,并设置好扫描的包


 读取Map,List 以及 Array 类型配置数据

案例演示3

Map,List 以及 Array 都能提供配置数据, 下面通过一个示例配置演示过程:

        步骤1:在刚才的 application.yml 文件接着写入不同类型数据

        步骤2:添加pk3包,新建以下类文件

//Users 
public class Users {private String name;private String sex;private Integer age;public String getName() {return name;}public void setName(String name) {this.name = name;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}@Overridepublic String toString(){return "MyServer{ " +"name: " + name +"\n"+"sex: " + sex +"\n" +"age= "+age+"  }"+"\n";}
}
//ConutClass 
@Data
@ConfigurationProperties
public class ConutClass {private List<Servers> servers;private Map<String,Users> users;private String [] names;@Overridepublic String toString(){return "ConutClass{ \n"+"网站服务器:"+"\n"+servers+"\n" +"用户信息列表:"+"\n"+users+"\n" +"名字列:"+"\n"+names+"\n" +"}";}
}
//Servers 
public class Servers {private String title;private String ip;public String getTitle() {return title;}public void setTitle(String title) {this.title = title;}public String getIp() {return ip;}public void setIp(String ip) {this.ip = ip;}@Overridepublic String toString(){return "MyServer{ " +"title: " + title +"\n"+"ip: " + ip + "  }"+"\n";}
}

        步骤4:添加扫描包和测试单元

@ConfigurationPropertiesScan注解只能添加一次,所以多个扫描包可以用存放在大括号里面,用逗号隔开

 三、总结

在这篇文章中,我们重点关注了常用的注解和Bean的读取和测试。

        Spring Boot使用 application.properties 或 application.yml 文件来管理应用程序的配置

   @SpringBootApplication注解用于开启Spring Boot应用程序的启动类,它组合了@Configuration@EnableAutoConfiguration@ComponentScan的功能。@RestController注解将一个类标记为RESTful API的控制器,而@RequestMapping注解用于将HTTP请求映射到控制器方法上。

        另外,依赖注入的注解@Autowired,它可以自动注入依赖。最后是@Bean注解,它可以将方法返回的实例注册为Bean,并添加到Spring的应用程序上下文中。

本篇内容就到这了,如果有好的建议和不妥之处,欢迎大家评论区点赞留言转发

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

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

相关文章

[Docker实现测试部署CI/CD----Jenkins集成相关服务器(3)]

目录 7、 Jenkins 集成 SonarQubeJenkins 中安装 SonarScanner下载移动修改配置文件 8、Jenkins配置SonarQube安装插件添加SonarQube添加 SonarScanner 9、Jenkins集成目标服务器 7、 Jenkins 集成 SonarQube Jenkins 中安装 SonarScanner SonarScanner 是一种代码扫描工具&am…

【stm32】初识stm32—stm32环境的搭建

文章目录 &#x1f6f8;stm32资料分享&#x1f354;stm32是什么&#x1f384;具体过程&#x1f3f3;️‍&#x1f308;安装驱动&#x1f388;1&#x1f388;2 &#x1f3f3;️‍&#x1f308;建立Start文件夹 &#x1f6f8;stm32资料分享 我用夸克网盘分享了「STM32入门教程资料…

【Android】控件与布局入门 - 简易计算器

目录 1. 基础开发环境 2. 计算器的布局和相关按钮 3. 计算器的主要运算逻辑 4. APK 文件 5. 项目源码 1. 基础开发环境 JDK&#xff1a;JDK17 Android Studio&#xff1a;Android Studio Giraffe | 2022.3.1 Android SDK&#xff1a;Android API 34 Gradle: gradle-8.0-bi…

参考RabbitMQ实现一个消息队列

文章目录 前言小小消息管家1.项目介绍2. 需求分析2.1 API2.2 消息应答2.3 网络通信协议设计 3. 开发环境4. 项目结构介绍4.1 配置信息 5. 项目演示 前言 消息队列的本质就是阻塞队列&#xff0c;它的最大用途就是用来实现生产者消费者模型&#xff0c;从而实现解耦合以及削峰填…

Android中简单封装Livedata工具类

Android中简单封装Livedata工具类 前言&#xff1a; 之前讲解过livedata和viewmodel的简单使用&#xff0c;也封装过room工具类&#xff0c;本文是对livedata的简单封装和使用&#xff0c;先是封装了一个简单的工具类&#xff0c;然后实现了一个倒计时工具类的封装. 1.LiveD…

JVM之类加载与字节码(一)

1.类文件结构 一个简单的HelloWorld.Java package cn.itcast.jvm.t5; // HelloWorld 示例 public class HelloWorld { public static void main(String[] args) { System.out.println("hello world"); } }编译为 HelloWorld.class 后的样子如下所示&#xff1a; […

【广州华锐视点】葡萄种植VR虚拟仿真实训平台

随着虚拟现实(VR)技术的不断发展&#xff0c;越来越多的教育领域开始尝试将VR技术应用于教学中。在葡萄栽培这一专业领域&#xff0c;我们开发了一款创新的VR实训课件&#xff0c;旨在为学生提供沉浸式的互动学习体验。本篇文案将为您介绍葡萄种植VR虚拟仿真实训平台所提供的互…

重型并串式液压机械臂建模与simscape仿真

一、建模 Hydraulic manipulator Figure 1 shows different constituting parts of the manipulator considered, with every part labeled using numbers from 1 to 10. For each part, a CAD model is provided. Each file is named in accordance with the corresponding la…

el-popover使用自定义图标

使用el-popover实现鼠标点击或浮动到自定义图标上弹出表格弹窗&#xff0c;官方文档上使用的是按钮el-button&#xff0c;如果想换成图标或其他的组件的话直接把el-button替换掉即可。注意替换之后的组件一定要加slot“reference”&#xff0c;不然组件是显示不出来的。 代码如…

阿里云二级域名配置

阿里云二级域名配置 首先需要进入阿里云控制台的域名管理 1.选择域名点击解析 2.添加记录 3.选择A类型 4.主机记录设置【可以aa.bb或者aa.bb.cc】 到时候会变成&#xff1a;aa.bb.***.com 5.解析请求来源设置为默认 6.记录值 设置为要解析的服务器的ip地址 7.TTL 默认即…

HDFS中的NAMENODE元数据管理(超详细)

元数据管理 元数据是什么元数据管理概述内存元数据元数据文件fsimage内存镜像文件edits log编辑日志 namenode加载元数据文件顺序 元数据管理相关目录文件元数据相关文件VERSIONseen_txid 元数据文件查看&#xff08;OIV,OEV&#xff09;SecondaryNameNode介绍checkpoint机制SN…

24届近5年上海大学自动化考研院校分析

今天给大家带来的是上海大学控制考研分析 满满干货&#xff5e;还不快快点赞收藏 一、上海大学 学校简介 上海大学是上海市属的综合性研究型大学&#xff0c;是教育部与上海市人民政府共建高校&#xff0c;是国家“211 工程”重点建设高校、上海市高水平地方大学建设高校&a…

elementui Cascader 级联选择使用心得

相信大家对于elementui并不陌生&#xff0c;作为适配Vue的优秀UI框架之一&#xff0c;一直被所有的开发者痛并快乐着。今天要记录的就是里边的主角之一Cascader。 首先先介绍一下Cascader ---> 当一个数据集合有清晰的层级结构时&#xff0c;可通过级联选择器逐级查看并选择…

【嵌入式环境下linux内核及驱动学习笔记-(18)LCD驱动框架1-LCD控制原理】

目录 1、LCD显示系统介绍1.1 LCD显示基本原理1.1.1 颜色的显示原理&#xff1a;1.1.2 图像的构成 1.2 LCD接口介绍1.2.1 驱动接口 - MCU接口1.2.2 驱动接口 - RGB接口1.2.3 驱动接口 - LVDS接口1.2.4 驱动接口 - MIPI接口1.2.5 RGB / MIPI / LVDS三种接口方式的区别&#xff1a…

【沁恒蓝牙mesh】CH58x系统时钟配置与计算

本文主要记录了【沁恒蓝牙mesh】CH58x系统时钟配置与计算 &#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是喜欢记录零碎知识点的小菜鸟。&#x1f60e;&#x1f4dd; 个人主页&#xff1a;欢迎访问我的 Ethernet_Comm 博客主页&#x1f525;&#x1f389; 支持我&am…

Containerd数据持久化和网络管理

1. 轻量级容器管理工具 Containerd 2. Containerd的两种安装方式 3. Containerd容器镜像管理 4. Containerd数据持久化和网络管理 1、Containerd NameSpace管理 containerd中namespace的作用为:隔离运行的容器&#xff0c;可以实现运行多个容器。 查看命令帮助 # ctr namespac…

[IDEA]使用idea比较两个jar包的差异

除了一些小工具外&#xff0c;idea自带了jar包比较的功能。 把需要比对的jar包放到任意目录下&#xff0c;然后选中两个需要比较的jar包&#xff0c;右键&#xff0c;选择Compare Archives&#xff0c;然后就可以比较了。 这次疏忽了&#xff0c;每次打包前需要commit界面看一下…

极光笔记 | 浅谈企业级SaaS产品的客户成长旅程管理(上)—— 分析篇

本文作者&#xff1a;陈伟&#xff08;极光用户体验部高级总监&#xff09; “企业级SaaS产品与C端互联网产品特征差异很大&#xff0c;有些甚至是截然相反&#xff0c;这些特征也会成为后续客户成长旅程的重要影响变量。本文就如何设计并服务好企业级SaaS产品客户成长旅程进行…

CS 144 Lab Five -- the network interface

CS 144 Lab Five -- the network interface TCP报文的数据传输方式地址解析协议 ARPARP攻击科普 Network Interface 具体实现测试tcp_ip_ethernet.ccTCPOverIPv4OverEthernetAdapterTCPOverIPv4OverEthernetSpongeSocket通信过程 对应课程视频: 【计算机网络】 斯坦福大学CS144…

「Qt」常用事件介绍

&#x1f514; 在开始本文的学习之前&#xff0c;笔者希望读者已经阅读过《「Qt」事件概念》这篇文章了。本文会在上篇文章的基础上&#xff0c;进一步介绍 Qt 中一些比较常用的事件。 0、引言 当我们想要让控件收到某个事件时做一些操作&#xff0c;通常都需要重写相应的事件处…