@Value和@Bean注解的执行顺序问题

2023-05-16

Springboot中使用@Configruation和@Bean一起将Bean注册到ioc容器中,而@Value常用于将yml配置文件中的配置信息注入到类的成员变量中。当@Configruation、@Bean和@Value出现在同一个类中时,@Bean会比@Value先执行,这会导致当@Bean注解的方法中用到@Value注解的成员变量时,无法注入(null)的情况。例如在为Feign创建配置类,以实现Feign的权限验证时,需要将yml文件中的用户名和密码注入到配置类的成员变量中,@Bean注解方法则依赖于用户名和密码产生Bean的实例。

@Configuration
public class FeignConfig implements BeanFactoryPostProcessor {
  @Value("${spring.cloud.config.username}")
  private static String username;

  @Value("${spring.cloud.config.username}")
  private static String password;

  @Bean
  public BasicAuthRequestInterceptor basicAuthRequestInterceptor() {
    //这时username和password无法被及时注入
    return new BasicAuthRequestInterceptor(username, password);
  }
}

解决方法

第一种:

直接在@Bean方法的参数上使用@Value注入username和password

@Configuration
public class FeignConfig implements BeanFactoryPostProcessor {


  @Bean
  public BasicAuthRequestInterceptor basicAuthRequestInterceptor(@Value("${spring.cloud.config.username}") String username,
      @Value("${spring.cloud.config.password}") String password) {
    //这时username和password可以注入
    return new BasicAuthRequestInterceptor(username, password);
  }
}

第二种:

重新写一个用户名和密码的类AuthConfig,然后用@AutoWired通过注入AuthConfig的对象来实现用户名和密码的注入,同样要在方法的参数上注入。

@Component
public class AuthConfig {
  @Value("${spring.cloud.config.username}")
  private String username;

  @Value("${spring.cloud.config.password}")
  private String password;

   //...省略getter和setter方法
}

@Configuration
public class FeignConfig implements BeanFactoryPostProcessor {


  @Bean
  public BasicAuthRequestInterceptor basicAuthRequestInterceptor(@Autowired AuthConfig authConfig) {
    return new BasicAuthRequestInterceptor(authConfig.getUsername(), authConfig.getPassword());
  }
}

这两种方法的思路应该都是利用Springboot对依赖关系的解析,当一个类对另一个类有明显依赖关系时,会改变bean加载的优先级?待深入研究

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

@Value和@Bean注解的执行顺序问题 的相关文章

  • 【错误记录】Error creating bean with name: Unsatisfied dependency expressed through field

    启动一个Spring boot集成mybatis plus报错 xff1a Error creating bean with name examManageController Unsatisfied dependency expresse
  • 利用MultipartFile实现文件上传

    利用MultipartFile实现文件上传 在java中上传文件似乎总有点麻烦 没 net那么简单 记得最开始的时候用smartUpload实现文件上传 最近在工作中使用spring的MultipartFile实现文件上传 感觉挺简单 在这
  • 07.Spring Bean 加载 - BeanDefinitionReader

    基本概念 BeanDefinitionReader 该接口的作用就是加载 Bean 在 Spring 中 Bean 一般来说都在配置文件中定义 而在配置的路径由在 web xml 中定义 所以加载 Bean 的步骤大致就是 加载资源 通过配
  • 模块化开发的时候,sqlsession如何配置多个typeAliasesPackage,mapperLocations

    如图 我们进行模块化开发的时候 往往我们每个人的bean和mapper都不在同一个路径包内 如果我们按照以下方式配置的话 就会报异常 大致上是因为不支持
  • InitializingBean讲解

    InitializingBean讲解 Spring中有两种类型的Bean 一种是普通Bean 另一种是工厂Bean 即FactoryBean 工厂Bean跟普通Bean不同 其返回的对象不是指定类的一个实例 其返回的是该工厂Bean的get
  • spring_day01_IOC

    1 spring 概述 1 1 框架的概述 框架是一个封装了很多功能和模块的程序的半成品 可以理解为一个由很多工具类组成的一个工具包 1 2 spring的概念 spring是分层的JavaSE EE应用full stack轻量级开源框架
  • spring+ jcaptcha(spring框架下的彩色验证码)

    从jcaptcha官方网站下载jcaptcha的发行包 并将其发行包中的jar文件考贝到本地项目WEB INF目录下的lib目录中 官方网址http jcaptcha sourceforge net 在web xml文件中配置 Java代码
  • 自动表单数据封装到javaBean中

    页面表单数据的自动封装到javaBean中 先定义一个Bean类 package com test public class Bean private String name private Integer sex public Strin
  • java bean对象属性复制,将一个对象的属性值赋值给另一个对象,对象之间的复制方法

    注意依赖 springframework下的复制顺序为 目标对象 新对象 import org springframework beans BeanUtils public static void main String args Inte
  • 学习Spring

    1 如何学习Spring 你可以通过下列途径学习spring 1 spring下载包中doc目录下的MVC step by step和sample目录下的例子都是比较好的spring开发的例子 2 AppFuse集成了目前最流行的几个开源轻
  • Educoder-Spring入门解答

    第一关 hello Spring HelloWorld package step1 public class HelloWorld Begin public void hello System out println Hello Sprin
  • springboot @ConfigurationProperties和@value读取配置文件的内容

    这里先只介绍 ConfigurationProperties的用法 1 属性文件信息 2 java类
  • Spring Bean生命周期doCreateBean源码阅读

    bean的生命周期的几个后置接口都是在这个方法里面调用 所以单独开一篇该方法的源码阅读 下面从两个点来阅读 1 何时调用 只看容器启动 2 梳理这个方法的流程 跟上一节对应上 先贴上源码 protected Object doCreateB
  • Springboot之Bean的加载过程

    加载和实例化bean分以下几个重要步骤 1 根据package扫描出需要被管理的类 2 将这些类封装成BeanDefinition并注册到BeanFactory容器 3 实例化所有扫描到的BeanDefinition 其中包括解决循环依赖
  • createBean方法详解

    前言 createBean是创建Bean的主要方法 该方法位于 AbstractBeanFactory的doGetBean方法中的createBean调用 createBean方法流程图 createBean源码解析 protected O
  • Spring 如何从 IoC 容器中获取对象?

    前情回顾 前面几篇文章主要分析了 Spring IoC 容器如何初始化 以及解析和注册我们定义的 bean 信息 其中 Spring 中的 IoC 容器 对 Spring 中的容器做了一个概述 Spring IoC 容器初始化 和 Spri
  • Jsf与Spring的整合原理

    Jsf做为Web框架 Spring做为业务层框架 两者可以结合起来用 只要在faces config xml中做一个很简单的配置
  • Spring Bean基础

    Spring Bean基础 1 1 定义Spring Bean 1 1 1 什么是BeanDefinition 1 2 通过BeanDefinition构建Bean 1 3 注册Bean BeanDefinition 注册 1 4 实例化S
  • @Configuration和@Bean

    spring Boot提倡约定优于配置 如何将类的生命周期交给spring 1 第一种自己写的类 Controller Service 用 controller service即可 2 第二种 集成其它框架 比如集成shiro权限框架 集成
  • spring3.0.3+hibernate3.5.4+JOTM2.2.1实现JTA事务管理

    本文参考资料 http java e800 com cn articles 2007 417 1176746498587392322 1 html 实验方法 本文设置两个entity Topic对应test1数据库 Post对应test2数

随机推荐