最近遇到个场景,需要在使用@Bean注解定义bean的时候为对象设置一些属性,比如扫描路径,因为路径经常发布新特性的时候需要修改,所以就计划着放在配置文件中,然后通过@ConfigurationProperties或@Value结合@PropertySource注入,类似如下:

@Configuration
@PropertySource("classpath:application.properties")
public class AbcConfig {
@Value("${myconfig}")
private String myconfig;
}

但是只要在Config类中,myconfig就怎么都无法注入。

改成使用configurationproperties获取后,仍然无法注入。

@Configuration
@ConfigurationProperties(prefix = "mybatis")
@PropertySource("classpath:application.properties")
public class AbcConfig {
private String myconfig;
}

和@Value一样,在非Config注解的普通bean中都能够正常注入。

于是搜了下网上,有个帖子说在Config配置类中显示定义PropertySourcesPlaceholderConfigurer即可,如下:

    @Bean
public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
return new PropertySourcesPlaceholderConfigurer();
}

但是我们发现仍然无法注入。于是采用最原始的方法,依赖Environment来获取,结果发现它也没有自动注入,一直为null(注,这里可能是因为我们在依赖Environment的Bean上显示定义了@Order(1)优先创建的原因)。最后只要让bean实现EnvironmentAware接口显示设置,如下:

@PropertySource("classpath:myconfig.properties")
@Configuration
public class AbcConfig implements EnvironmentAware {
private Environment env; @Override
public void setEnvironment(Environment environment) {
this.env=environment;
}
}

然后使用env.getProperty就可以获取到配置了。

备注:@configurationproperties和@value区别如下:

@ConfigurationProperties和@Value的选用
如果只是在某个业务逻辑中需要获取一下配置文件中的某项值,使用@Value;

如果专门编写了一个javaBean来和配置文件进行映射如datasource,我们就直接使用@ConfigurationProperties;

最后,为啥原理很重要,这个时候就体现在对整体流程以及体系是否熟悉,如果熟悉就知道问题如何解决,否则不知道往哪里去,这也是面试的时候,我们经常会问或者被问及spring boot自动配置原理的原因。

Springboot 配置类( @Configuration) 不能使用@Value注解从application.propertyes中加载值以及Environment为null解决方案的更多相关文章

  1. Java的cmd配置(也即Java的JDK配置及相关常用命令)——找不到或无法加载主类 的解决方法

    Java的cmd配置(也即Java的JDK配置及相关常用命令) ——找不到或无法加载主类  的解决方法 这段时间一直纠结于cmd下Java无法编译运行的问题.主要问题描述如下: javac 命令可以正 ...

  2. C#动态编译代码,执行一个代码片段,或者从指定文件中加载某个接口的实现类

    在项目进行中有时候会需要配置一些复杂的表达式,在程序运行的时候执行表达式,根据结果执行相应的操作,简单写了一个类Expression,利用.net的动态编译技术实现,代码如下: public clas ...

  3. UIStoryboard类介绍(如何从Storyboard中加载View Controller)

    如何从Storyboard中加载View Controller? 1. 首先了解下UIStoryboard类: @class UIViewController; @interface UIStoryb ...

  4. Webpack 2 视频教程 011 - Webpack2 中加载 CSS 的相关配置与实战

    原文发表于我的技术博客 这是我免费发布的高质量超清「Webpack 2 视频教程」. Webpack 作为目前前端开发必备的框架,Webpack 发布了 2.0 版本,此视频就是基于 2.0 的版本讲 ...

  5. nginx 中配置多个location并解决js/css/jpg/等的加载问题

    2017-11-09 22:07 277人阅读 评论(0) 收藏 举报  分类: linux(1)  版权声明:如有版权问题,请私信我. ECS:阿里云 系统:ubuntu 16.04 我的配置文件位 ...

  6. Web项目中加载Spring配置的常用方法

    1.web.xml中添加配置 <web-app>      <context-param>         <param-name>contextConfigLoc ...

  7. Django模版中加载静态文件配置详解

    .settings.INSTALLED_APPS下添加:django.contrib.staticfiles .settings.py下添加:STATIC_URL = '/static/' . ()在 ...

  8. Springboot配置类

    配置类 MyAppConfig  import com.test.springboot.service.HelloService; import org.springframework.context ...

  9. SpringBoot——配置类实现WebMvcConfigurer接口来配置拦截器、view-controller、视图解析器等

    目的:为了保留SpringBoot对SpringMVC自动配置,另外我们还想要做一些自己拓展的功能 如何做扩展? 以配置view-controller实现跳转为例: 原先在SpringMvc中我们写v ...

随机推荐

  1. fatal error LNK1120: 11 unresolved externals

    一般原因是函数声明没有定义,或者c++文件没有包含include进来

  2. wordpress chronus主题 显示文章阅读数

    wordpress chronus主题 显示文章阅读数 第一步:将下面的代码拷贝到文件 /wp-content/themes/chronus/inc/template-tags.php 中 funct ...

  3. LeetCode 33 - 搜索旋转排序数组 - [二分]

    假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] ). 搜索一个给定的目标值,如果数组中存在这个目标值, ...

  4. 如何关闭git pull产生的merge 信息

    编辑 ~/.gitconfig [core] mergeoptions = --no-edit 或者终端之行 git config --global core.mergeoptions --no-ed ...

  5. 使用maxwell实时同步mysql数据到kafka

    一.软件环境: 操作系统:CentOS release 6.5 (Final) java版本: jdk1.8 zookeeper版本: zookeeper-3.4.11 kafka 版本: kafka ...

  6. Django集成Bootstrap美化后台

    1.pip install bootstrap-admin 2.编辑项目下的settings.py,增加下面行,放在最前面 3.编辑项目下的settings.py,增加下面行

  7. docker上部署rabbitmq

    1.docker search rabbitmq 2.docker pull rabbitmq:3.6 3.docker run -d -p 5672:5672 -p 15672:15672 --na ...

  8. Linux协议栈-netfilter-conntrack

    原文连接:https://blog.csdn.net/jasonchen_gbd/article/details/44874321?utm_source=blogxgwz8

  9. mysql--表数据操作

    查询: 简单查询 ####查询的字段必须在表中存在 #### 对查询出来的数据进行修改时,不会修改原来的数据,只是修改了可视化的,我们看到的数据. # 查一个数据 select 字段名 from 表名 ...

  10. ES6语法 Promise Iterator

    类和对象 基本定义: class Parent{ constructor(name='lmx'){ //name= 默认值 this.name=name } } let v_parent = new ...