最近遇到个场景,需要在使用@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. Retrieve pictures from Excel file using OLEDB

    string file = @"C:\sample.xlsx"; if(System.IO.File.Exists(file)) { Microsoft.Office.Intero ...

  2. .net不同集合类型及使用场合

    1.Dictionary-相当于字典[可以通过过索引(hash值)速添加.删除.查找]:如果需要非常快地添加.删除和查找项目,而且不关心集合中项目的顺序,那么首先应该考虑使用 System.Colle ...

  3. scrapy爬虫框架和selenium的配合使用

    scrapy框架的请求流程 scrapy框架? Scrapy 是基于twisted框架开发而来,twisted是一个流行的事件驱动的python网络框架.因此Scrapy使用了一种非阻塞(又名异步)的 ...

  4. 完美脱离Windows!! Linux发行版第一系统 Manjaro 开箱教程 :)

    没兴趣? 来几张图敌敌畏(kai kai wei) !! 0x00 预览(zhuangbi) 0x01 引言(feihua) 当我们想用ssh工具时,不像telnet那样是系统自带的软件,需要额外安装 ...

  5. less命令查看文件时的常用操作

    下键或者回车:往下一行 D:往下半页 空格和f:往下一页 上键:往上一行 B:往上一页 shift+G:直接切到末尾 ?+搜索条件:从下往上搜索 /+搜索条件:从上往下搜索

  6. JS 变量和函数提升 全局变量和局部变量

    变量提升 1. var a = 10; function test() { a = 100; console.log(a); console.log(this.a); var a; console.l ...

  7. selenium--控制浏览器和简单元素操作

    控制浏览器1.driver.maximize_window() #浏览器最大化2.driver.set_windows_size(480*800) #浏览器设置成移动端大小(480*800),参数数字 ...

  8. git使用手册整理

    -------------------20181217------------------- git使用:在gitbash 下初始化用户: $ git config --global user.nam ...

  9. [TJOI2009]猜数字

    题目描述 现有两组数字,每组k个,第一组中的数字分别为:a1,a2,...,ak表示,第二组中的数字分别用b1,b2,...,bk表示.其中第二组中的数字是两两互素的.求最小的非负整数n,满足对于任意 ...

  10. 面向对象:MATLAB的自定义类 [MATLAB]

    https://www.cnblogs.com/gentle-min-601/p/9785812.html 面向对象:MATLAB的自定义类 [MATLAB]   这几天刚刚开始学习MATLAB的面向 ...