SpringBoot配置文件-自定义注解从配置文件解析参数-《Java笔记》

admin 2025-10-19 04:51:55 编程 来源:ZONE.CI 全球网 0 阅读模式

Java SpringBoot

概述

  • @Value@PropertySource注解中使用${}引用配置文件参数原理分析
  • 把这个功能加入到自己的注解中

    问题分析

    平时在使用@Value@PropertySource两个注解(下面分别用V和P代替)时都可以在value中使用${xxx.xxx}方式获取配置文件的值,这样可以使程序根据配置文件动态设置一些值,比如数据库连接的url,username,password或者环境变量等。但是有时候自己实现的切面注解中也想能使用这样的方式动态配置,这就需要Spring环境变量的解析支持了。这两个注解的解析过程V是在spring-bean中,P是在spring-context中,但是他们的${}解析过程都需要依赖Environment提供的环境解析

    1. public abstract class AbstractPropertyResolver implements ConfigurablePropertyResolver {
    2. .....
    3. @Override
    4. public String resolvePlaceholders(String text) {
    5. return this.propertyResolver.resolvePlaceholders(text);
    6. }
    7. @Override
    8. public String resolveRequiredPlaceholders(String text) throws IllegalArgumentException {
    9. return this.propertyResolver.resolveRequiredPlaceholders(text);
    10. }
    11. ....
    12. }

    就是resolvePlaceholders这个方法解析${}里的参数的。

    加入到自己的注解中

    Spring中有个EnvironmentAware接口,他的作用就是在任何实现了这个接口的类中注入Environment对象,就可以在自己的类中使用这个对象的功能了,还有ApplicationContextAwareSchedulerContextAware等等,通过搜索spring-framework的源代码可以看到所有Spring可以对外提供的这些内部工具接口。使用方法很简单 ```java import java.lang.annotation.*;

@Target(ElementType.METHOD) @Documented @Retention(RetentionPolicy.RUNTIME) public @interface Login { String username() default “”; String password() default “”; }

public class AspectDemo implements EnvironmentAware { Environment environment;

  1. @Override
  2. public void setEnvironment(Environment environment) {
  3. this.environment = environment;
  4. }
  5. @Pointcut("@annotation(com.watson.onebox.aspect.annotations.Login)")
  6. public void logPointCut() {
  7. }
  8. @Before(value = "logPointCut()")
  9. public void check(){
  10. log.info("check");
  11. }
  12. @After(value = "logPointCut()")
  13. public void bye(){
  14. log.info("bye");
  15. }
  16. @Around("logPointCut() && @annotation(login)")
  17. public Object around(ProceedingJoinPoint joinPoint, Login login){
  18. log.info("around");
  19. //关键的就是这一行解析代码
  20. String s = environment.resolvePlaceholders(login.username());
  21. log.info("username: {}", login.username());
  22. log.info("username-resolve: {}", s);
  23. //输出使用login注解时候的passwo属性值
  24. log.info("password: {}", login.password());
  25. Object proceed = null;
  26. try {
  27. proceed = joinPoint.proceed();
  28. } catch (Throwable throwable) {
  29. throwable.printStackTrace();
  30. }
  31. return proceed;
  32. }

}

  1. 这个就是完整的一个自己实现切面注解解析过程的代码。这样在使用注解时就可以通过`${xxx.xxx}`方式加载配置文件参数了<br />下面是测试代码,使用SpringBoot启动就可以了
  2. ```java
  3. @Slf4j
  4. @Component
  5. public class TestMethod {
  6. @Login(username = "abc-${spring.profiles.active}", password = "b")
  7. public String getData() {
  8. log.info("get data");
  9. return "getData";
  10. }
  11. }
以太坊cppgolang区别 编程

以太坊cppgolang区别

以太坊是一种去中心化的开源平台,它采用智能合约技术,旨在构建和运行不受干扰的分布式应用程序。作为目前最受欢迎的区块链平台之一,以太坊提供了多种编程语言的支持,其
progolang 编程

progolang

Go语言(Golang)是由Google开发的一门静态类型编程语言。作为一名专业的Golang开发者,我深知这门语言的优势和特点。在本文中,我将介绍Golang
golangn个发送者 编程

golangn个发送者

Golang是一种开源的编程语言,由Google团队开发,旨在提高程序的并发性和简化软件开发过程。在Go语言中,有时需要向多个接收者发送信息。本文将介绍如何在G
golang技能图谱 编程

golang技能图谱

从互联网行业的快速发展到人工智能技术的日益成熟,各种编程语言也应运而生。而在这众多的编程语言中,Golang(即Go)作为一门强大且高效的开发语言备受关注。Go
评论:0   参与:  7