Springboot注入数据的几个注解

简介: 本篇文章主要讲述了@Value,@ConfigurationProperties,@ImportResource以及@Configuration等注解的使用


@Value

@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Value {
    String value();
}


我们来看一下,从注解本身的定义,该注解可以使用在以下方面

  1. 字段上
  2. set方法上
  3. 方法入参上
  4. 当作元注解


功能


1.可以注入普通的字符串

@Value("normal")
private String normal;


2.可以使用SpEl表达式
a. 获取系统属性

 @Value("#{systemProperties['java.version']}")
 private String systemPropertiesName; // 注入操作系统属性


b.调用方法

 @Value("#{T(java.lang.Math).random()*80}")//获取随机数
 private double randomNumber; //注入表达式结果


c.计算

@Value("#{1+2}")
private double sum; //注入表达式结果 1+2的求和


3.注入Resource

 @Value("classpath:os.yaml")
 private Resource resourceFile; // 注入文件资源


4.注入URL资源

@Value("http://www.baidu.com")
private Resource testUrl; // 注入URL资源


5.获取配置文件属性

 @Value("${app.name}")
 private String appName; // 这里的值来自application.properties,spring boot启动时默认加载此文件




{}与${}

1. #{}


通常用来获取bean的属性,或者调用bean的某个方法。当然还有可以表示常量



2. ${}


一般用于读取配置文件中的内容
如果内容找不到,启动会失败。
如果说希望配置文件没有配置的情况下也能正常启动,需要在里面加上默认值

@Value("${app.name:测试}")
private String name;


3.混合使用

那么#{}与${}是否可以混合着使用呢,答案是可以<br />a. #{}在外  ${}在内

// SpEL: 传入一个字符串,根据","切分后插入列表中, #{}和${}配置使用
@Value("#{'${server.name}'.split(',')}")
private List<String> servers;


这时会先读取配置文件中的server.name的属性,然后通过SpEl表达式去执行split方法将逗号分隔的字符串转换为字符串的列表
b.${}在外,#{}在内


@Value("${server.#{1+2}")
private List<String> servers2;


这样写去获取配置文件中server.3的值可行吗,不可以
因为在spring的加载机制中是先执行${}然后再去执行#{}
所以这样写就会去配置文件中找server.#{1+2}这个属性的值,因为配置文件中没有,启动就会报错

4.总结

#{} 用于执行SpEl表达式,并将内容赋值给属性
${} 主要用于加载外部属性文件中的值
#{} 在外,${}在里






@ConfigurationProperties


@ConfigurationProperties是Spring Boot提供的。包括@EnableConfigurationProperties也是Spring Boot才有的。它在自动化配置中起到了非常关键的作用
ConfigurationPropertiesBindingPostProcessor会对标注@ConfigurationProperties注解的Bean进行属性值的配置。



我们在配置文件中增加一下列

com.example.demo.age=11
com.example.demo.address[0]=北京  
com.example.demo.name=test


读取方式
a.

@Component
@ConfigurationProperties(prefix = "com.example.demo")
public class People {

    private String name;
    private Integer age;
    private List<String> address;
}

b.在方法上使用bean和ConfigurationProperties注解

    @Bean
    @ConfigurationProperties(prefix = "com.example.demo")
    public People people() {
        return new People();
    }




@ImportResource


@ImportResource注解用于导入Spring的配置文件,让配置文件里面的内容生效;(就是以前写的springmvc.xml、applicationContext.xml)
Spring Boot里面没有Spring的配置文件,我们自己编写的配置文件,也不能自动识别;
想让Spring的配置文件生效,需要使用@ImportResource加载进来

@ImportResource(locations = {"classpath:beans.xml"})


@Configuration


指明当前类是一个配置类;就是来替代之前的Spring一些繁琐的配置文件

  • 配置类@Configuration作用于类上,相当于一个xml配置文件
  • 使用@Bean给容器中添加组件,作用于方法上

@Configuration
public class MyAppConfig {

    //将方法的返回值添加到容器中;容器中这个组件默认的id就是方法名
    @Bean
    public HelloService helloService02(){
        System.out.println("配置类@Bean给容器中添加组件了...");
        return new HelloService();
    }
}


这样写实质上就相当于在xml中进行bean的配置

<bean id="helloService" class="com.self.springboot.service.HelloService"></bean>

如果有很多bean需要注入,又不想这么麻烦去做,就使用扫描的方式实现

//通过该注解来表明该类是一个Spring的配置,相当于一个传统的ApplicationContext.xml
@Configuration
//相当于配置文件里面的<context:component-scan/>标签,扫描这些包下面的类的注解
@ComponentScan(basePackages="com.self.dao,com.hanpang.service")
public class SpringConfig {
    // 通过该注解来表明是一个Bean对象,相当于xml中的<bean>
    //bean的id值默认是方法名userDao
    /*
    @Bean
    public HelloService helloService02(){
        System.out.println("配置类@Bean给容器中添加组件了...");
        return new HelloService();
    }
    */
}
相关文章
|
16天前
|
XML 安全 Java
使用 Spring 的 @Aspect 和 @Pointcut 注解简化面向方面的编程 (AOP)
面向方面编程(AOP)通过分离横切关注点,如日志、安全和事务,提升代码模块化与可维护性。Spring 提供了对 AOP 的强大支持,核心注解 `@Aspect` 和 `@Pointcut` 使得定义切面与切入点变得简洁直观。`@Aspect` 标记切面类,集中处理通用逻辑;`@Pointcut` 则通过表达式定义通知的应用位置,提高代码可读性与复用性。二者结合,使开发者能清晰划分业务逻辑与辅助功能,简化维护并提升系统灵活性。Spring AOP 借助代理机制实现运行时织入,与 Spring 容器无缝集成,支持依赖注入与声明式配置,是构建清晰、高内聚应用的理想选择。
210 0
|
22天前
|
Java 测试技术 API
将 Spring 的 @Embedded 和 @Embeddable 注解与 JPA 结合使用的指南
Spring的@Embedded和@Embeddable注解简化了JPA中复杂对象的管理,允许将对象直接嵌入实体,减少冗余表与连接操作,提升数据库设计效率。本文详解其用法、优势及适用场景。
199 126
|
1月前
|
XML JSON Java
Spring框架中常见注解的使用规则与最佳实践
本文介绍了Spring框架中常见注解的使用规则与最佳实践,重点对比了URL参数与表单参数的区别,并详细说明了@RequestParam、@PathVariable、@RequestBody等注解的应用场景。同时通过表格和案例分析,帮助开发者正确选择参数绑定方式,避免常见误区,提升代码的可读性与安全性。
|
2天前
|
XML Java 数据格式
常用SpringBoot注解汇总与用法说明
这些注解的使用和组合是Spring Boot快速开发和微服务实现的基础,通过它们,可以有效地指导Spring容器进行类发现、自动装配、配置、代理和管理等核心功能。开发者应当根据项目实际需求,运用这些注解来优化代码结构和服务逻辑。
59 12
|
15天前
|
Java 测试技术 数据库
使用Spring的@Retryable注解进行自动重试
在现代软件开发中,容错性和弹性至关重要。Spring框架提供的`@Retryable`注解为处理瞬时故障提供了一种声明式、可配置的重试机制,使开发者能够以简洁的方式增强应用的自我恢复能力。本文深入解析了`@Retryable`的使用方法及其参数配置,并结合`@Recover`实现失败回退策略,帮助构建更健壮、可靠的应用程序。
使用Spring的@Retryable注解进行自动重试
|
15天前
|
传感器 Java 数据库
探索Spring Boot的@Conditional注解的上下文配置
Spring Boot 的 `@Conditional` 注解可根据不同条件动态控制 Bean 的加载,提升应用的灵活性与可配置性。本文深入解析其用法与优势,并结合实例展示如何通过自定义条件类实现环境适配的智能配置。
探索Spring Boot的@Conditional注解的上下文配置
|
15天前
|
智能设计 Java 测试技术
Spring中最大化@Lazy注解,实现资源高效利用
本文深入探讨了 Spring 框架中的 `@Lazy` 注解,介绍了其在资源管理和性能优化中的作用。通过延迟初始化 Bean,`@Lazy` 可显著提升应用启动速度,合理利用系统资源,并增强对 Bean 生命周期的控制。文章还分析了 `@Lazy` 的工作机制、使用场景、最佳实践以及常见陷阱与解决方案,帮助开发者更高效地构建可扩展、高性能的 Spring 应用程序。
Spring中最大化@Lazy注解,实现资源高效利用
|
16天前
|
安全 IDE Java
Spring 的@FieldDefaults和@Data:Lombok 注解以实现更简洁的代码
本文介绍了如何在 Spring 应用程序中使用 Project Lombok 的 `@Data` 和 `@FieldDefaults` 注解来减少样板代码,提升代码可读性和可维护性,并探讨了其适用场景与限制。
Spring 的@FieldDefaults和@Data:Lombok 注解以实现更简洁的代码
|
16天前
|
缓存 监控 安全
Spring Boot 的执行器注解:@Endpoint、@ReadOperation 等
Spring Boot Actuator 提供多种生产就绪功能,帮助开发者监控和管理应用。通过注解如 `@Endpoint`、`@ReadOperation` 等,可轻松创建自定义端点,实现健康检查、指标收集、环境信息查看等功能,提升应用的可观测性与可管理性。
Spring Boot 的执行器注解:@Endpoint、@ReadOperation 等