目录
一、注解
之前我们了解了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;
}
@Override
public 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;
}
@Override
public 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;
}
@Override
public 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;
@Override
public 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;
}
@Override
public 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的应用程序上下文中。
本篇内容就到这了,如果有好的建议和不妥之处,欢迎大家评论区点赞留言转发