目录
一、注解
元注解
基本注解
启动注解
二、配置
格式介绍
读取配置文件信息
案例演示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 和 yaml(yml)。
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的应用程序上下文中。
本篇内容就到这了,如果有好的建议和不妥之处,欢迎大家评论区点赞留言转发