- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章Spring boot中PropertySource注解的使用方法详解由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
前言 。
本文将重点讲解一下Spring中@PropertySource注解的使用,如何通过PropertySource注解加载指定的配置文件。以及PropertySource注解与@ConfigurationProperties两个注解的配合使用。下面话不多说了,来随着小编来一起学习学习吧.
1.1. PropertySource注解加载指定的属性文件 。
Spring框架提供了PropertySource注解,目的是加载指定的属性文件,接下来我们看一下如何使用该注解。首先我们定义一个配置类,并在类中添加PropertySource注解,如下所示:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
@Component
@PropertySource
(value= {
"classpath:config/jdbc-bainuo-dev.properties"
},ignoreResourceNotFound=
false
,encoding=
"UTF-8"
,name=
"jdbc-bainuo-dev.properties"
,)
public
class
CustomerDataSourceConfig1 {
private
String url;
public
String getUrl() {
return
url;
}
public
void
setUrl(String url) {
this
.url = url;
}
@Override
public
String toString() {
return
"CustomerDataSourceConfig{"
+
"url='"
+ url + '\
''
+
'}'
;
}
}
|
上述的代码目的是加载classpath路径中config文件中的jdbc-bainuo-dev.properties。其中encoding用于指定读取属性文件所使用的编码,我们通常使用的是UTF-8;ignoreResourceNotFound含义是当指定的配置文件不存在是否报错,默认是false;比如上文中指定的加载属性文件是jdbc-bainuo-dev.properties。如果该文件不存在,则ignoreResourceNotFound为true的时候,程序不会报错,如果ignoreResourceNotFound为false的时候,程序直接报错。实际项目开发中,最好设置ignoreResourceNotFound为false。该参数默认值为false.
value值是设置需要加载的属性文件,可以一次性加载多个。name的值我们设置的是jdbc-bainuo-dev.properties。这个值在Springboot的环境中必须是唯一的,如果不设置,则值为:“class path resource [config/jdbc-bainuo-dev.properties] “.
可能很多人比较纳闷,为什么是“class path resource [config/jdbc-bainuo-dev.properties] “呢?这个就涉及到了Spring中对资源文件的封装类Resource。上文我们配置的value值为"classpath:config/jdbc-bainuo-dev.properties",因此Spring发现是classpath开头的,因此最终使用的是Resource的子类ClassPathResource。如果是file开头的,则最终使用的类是FileSystemResource.
了解了上文所述的Resource类之后。我们再次明确一点,如果@PropertySource中如果没有设置name值,则name值的生成规则是:根据value值查找到最终封装的Resource子类,然后调用具体的Resource子类实例对象中的getDescription方法,getDescription方法的返回值为最终的name值.
比如ClassPathResource类中的getDescription方法实现如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
public
String getDescription() {
StringBuilder builder =
new
StringBuilder(
"class path resource ["
);
String pathToUse = path;
if
(
this
.clazz !=
null
&& !pathToUse.startsWith(
"/"
)) {
builder.append(ClassUtils.classPackageAsResourcePath(
this
.clazz));
builder.append(
'/'
);
}
if
(pathToUse.startsWith(
"/"
)) {
pathToUse = pathToUse.substring(
1
);
}
builder.append(pathToUse);
builder.append(
']'
);
return
builder.toString();
}
|
上述的name处理逻辑暂时先有个印象即可,后续会详细地跟踪源码进行讲解.
1.2. PropertySource注解加载指定的属性文件测试 。
上文我们设置了PropertySource注解来加载"classpath:config/jdbc-bainuo-dev.properties"文件。该文件的目录结构如下图所示:
jdbc-bainuo-dev.properties文件内容如下:
1
|
spring.datasource.shareniu.url=shareniu
|
application.properties文件内容如下:
1
|
spring.profiles.active=dev
|
上面的配置文件中,spring.profiles.active属性配置了当前使用的环境是dev。spring.datasource.shareniu.url只是一个普通的属性,本身并没有什么特殊的含义.
下面开始书写Springboot的启动类,如下所示:
1
2
3
4
5
6
7
8
9
10
|
@SpringBootApplication
public
class
DemoApplication {
public
static
void
main(String[] args) {
SpringApplication springApplication =
new
SpringApplication(DemoApplication.
class
);
ConfigurableApplicationContext configurableApplicationContext = springApplication.run(args);
CustomerDataSourceConfig1 customerDataSourceConfig = configurableApplicationContext
.getBean(CustomerDataSourceConfig1.
class
);
System.out.print(customerDataSourceConfig);
}
}
|
运行上述的代码,程序的输出如下:
1
|
CustomerDataSourceConfig{url=
'null'
}
|
奇怪了,怎么url是空呢?PropertySource注解不是已经将jdbc-bainuo-dev.properties文件加载到当前的环境中了吗?我们不妨试一下看看jdbc-bainuo-dev.properties中的spring.datasource.shareniu.url属性是否可以获取到,进而从侧面验证PropertySource注解已经将jdbc-bainuo-dev.properties文件加载到当前的环境中.
修改上述启动类的代码如下:
1
2
3
4
5
6
7
8
9
10
11
|
@SpringBootApplication
public
class
DemoApplication {
public
static
void
main(String[] args) {
SpringApplication springApplication =
new
SpringApplication(DemoApplication.
class
);
ConfigurableApplicationContext configurableApplicationContext = springApplication.run(args);
CustomerDataSourceConfig1 customerDataSourceConfig = configurableApplicationContext.getBean(CustomerDataSourceConfig1.
class
);
String property = configurableApplicationContext.getEnvironment().getProperty(
"spring.datasource.shareniu.url"
);
System.out.println(property);
System.out.print(customerDataSourceConfig);
}
}
|
运行上述的代码,程序的输出如下:
1
|
Shareniu
|
通过上述的代码可以看出PropertySource确实是生效了。那么我们怎么将spring.datasource.shareniu.url属性值自动注入到CustomerDataSourceConfig1 类中的url属性中呢?
1.3. PropertySource注解读取指定文件并将属性注入到配置类 。
Spring中提供了@Value注解,用于将配置文件中的属性值读取出来并设置到相应的属性中。在这里我们学习一下如何使用@Value注解。同样的还是以上文的两个类为例进行详细说明,首先需要修改CustomerDataSourceConfig1类,修改部分如下所示:
1
2
3
4
5
6
|
@Component
@PropertySource
( name=
"jdbc-bainuo-dev.properties"
,value= {
"classpath:config/jdbc-bainuo-dev.properties"
},ignoreResourceNotFound=
false
,encoding=
"UTF-8"
)
public
class
CustomerDataSourceConfig1 {
@Value
(
"${spring.datasource.shareniu.url}"
)
private
String url;
}
|
上述的类中,在url字段中增加了@Value注解,并指定了SPEL表达式为${spring.datasource.shareniu.url} 。再次运行springboot启动类,控制台的输出为shareniu。表明确实可以通过@Value进行属性值的注入。但是使用@Value注解方式有一个不太友好的地方就是,当项目中有大量的属性进行配置的时候,我们需要一个个的在类的字段中增加@Value注解,这样确实很费劲,不过我们可以通过Springboot提供的@ConfigurationProperties注解解决这个问题.
1.4. ConfigurationProperties注解使用 。
@ConfigurationProperties是类级别的注解,具体使用方式如下:
1
2
3
4
5
6
|
@Component
@ConfigurationProperties
(prefix =
"spring.datasource.shareniu"
)
@PropertySource
( name=
"jdbc-bainuo-dev.properties"
,value= {
"classpath:config/jdbc-bainuo-dev.properties"
},ignoreResourceNotFound=
false
,encoding=
"UTF-8"
)
public
class
CustomerDataSourceConfig1 {
private
String url;
}
|
上述代码中,在CustomerDataSourceConfig1类中增加了ConfigurationProperties注解,并且指明了属性的前缀为spring.datasource.shareniu。这样Springboot在处理的时候,会去扫描当前类中的所有字段并进行属性的查找以及组装。比如我们配置的prefix = "spring.datasource.shareniu" ,CustomerDataSourceConfig1类中有一个url字段,则url字段需要匹配的属性是prefix+字段=spring.datasource.shareniu.url .
那不仅有个疑问?如果指定的字段没有找到属性怎么办呢?这个可以进行如下的配置:
1
|
@ConfigurationProperties
(prefix =
"spring.datasource.shareniu"
,ignoreUnknownFields=
true
,ignoreInvalidFields=
true
)
|
ignoreUnknownFields:忽略未知的字段.
ignoreInvalidFields:是否忽略验证失败的字段。这个怎么理解呢?比如我们在配置文件中配置了一个字符串类型的变量,类中的字段是int类型,那肯定会报错的。如果出现这种情况我们可以容忍,则需要配置该属性值为true。该参数值默认为false.
本文暂且讲解到这里,后续的文章我们来讲解@PropertySource注解如何实现读取不同环境中的配置文件,这个不同环境的文件动态切换读取,PropertySource默认是不支持的,因此我们需要扩展该注解对应的源码.
总结 。
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对我的支持.
原文链接:http://blog.csdn.net/qq_30739519/article/details/78791142 。
最后此篇关于Spring boot中PropertySource注解的使用方法详解的文章就讲到这里了,如果你想了解更多关于Spring boot中PropertySource注解的使用方法详解的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
在Spring框架中@PropertySource注解是非常常用的一个注解,其主要作用是将外部化配置解析成key-value键值对"存入"Spring容器的Environment
我想使用 @PropertySource 注释设置动态属性源值。谁能告诉我如何实现这一目标?对于下面我动态传递属性文件名。 @Configuration @PropertySource("classp
为什么当我尝试从属性文件输出数据时,显示的数据是错误的? 在我的 ChatApp 项目中,我有 datasource-cfg.properties 文件: # DataSource ds.databa
我有一个@Configuration类。这个类有一个@PropertySource。 我希望每个应用程序都有一个不同的属性。 示例: @Configuration @PropertySource("f
我有一个完美的测试设置,如下所示...... @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(loader = Annota
自 4.0 以来, Spring 为所有标记为 @Configuration 的类引入了一个新的注解 @PropertySources。它采用不同的 @PropertySource 作为参数。 @Pr
我正在使用 Spring Java 配置来创建我的 bean。但是这个 bean 对 2 个应用程序是通用的。两者都有一个属性文件 abc.properties 但具有不同的类路径位置。当我把明确的类
在我的 sprint 启动应用程序中,我有一个配置类来读取属性文件:common.properties 和 dev.properties。我在两个属性文件中都有相同的 key server.url。该
我正在 Tomcat 中将 Spring Boot 应用程序部署为 WAR 文件。我希望我的 application-local.properties 能够覆盖 application.propert
我的配置文件有问题,它位于我的 jar 文件之外的其他目录中。 我使用 @PropertySource 加载属性。 @PropertySource(ignoreResourceNotFound = t
我只需要读取MyServiceImpl.java类中的menu.properties文件这些值不是特定于环境的。 menu.properties ---------------- menu.optio
我有一个 micronaut 项目,我想为私有(private)数据(如数据库连接等)提供一个非版本化的配置文件 此信息必须通过@Property注释加载,但由于将有多个.yml(至少还有一个appl
我有一个关于以编程方式向 Spring 上下文添加属性的问题。 GenericXmlApplicationContext ctx = new GenericXmlApplicationContext(
我正在尝试通过以下方式创建一个 spring 配置类 @Configuration @PropertySource(value={"file:${my.dir}/fileone.properties"
嗨,我是 Spring 和 Jpa 集成的初学者。当我尝试配置我的数据库连接时,详细信息处理程序 itp。我发现了 Spring 的奇怪行为。 首先,我有3个配置文件: 1) RootConfig -
如何在 spring 中刷新 @PropertySouce(propertyFile)。 例如:-属性文件中有一个参数:- MY_APP_NAME=MY APPLICATION 我正在使用
我想用 java ... -Denv=prod ... 启动我的程序并且有 @PropertySource("classpath:/settings/$idontknowwhat$/database.
配置 @Configuration @PropertySources({ @PropertySource("classpath*:properties/test-database.proper
我遇到了连线问题,但没有找到任何提示。 我正在使用属性文件处理数据库分片配置。我得到了一个负责加载这些属性的类: @Component @PropertySources(value = *arrayO
无论如何我可以在我的程序中知道通过Spring的@PropertySource注释加载的文件的完整路径。我需要它显示在日志中,以便可以知道应用程序中正在使用哪个属性文件 最佳答案 此信息已由 Stan
我是一名优秀的程序员,十分优秀!