SpringBoot核心配置和注解

目录

一、注解

元注解

基本注解

启动注解

二、配置

格式介绍

读取配置文件信息

案例演示1

 嵌套读取bean信息

扫描二维码关注公众号,回复: 16227073 查看本文章

案例演示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;
    }

    @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的应用程序上下文中。

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

猜你喜欢

转载自blog.csdn.net/qq_51294997/article/details/132112903
今日推荐