哈喽,大家好,我是有勇气的牛排(全网同名)🐮🐮🐮
有问题的小伙伴欢迎在文末评论,点赞、收藏是对我最大的支持!!!。
文章目录
1 使用 @Value 注解
package com.couragesteak.service;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ReadProperties {
@Value("${cs.name}")
private String name;
@Value("${cs.star}")
private String star;
@RequestMapping("/getProperties")
public String getProperties() {
return name + ":" + star;
}
}
2 使用 ConfigurationProperties
@ConfigurationProperties
加载配置通过 BeanPostProcessor实现,其对应的Bean的后置处理器为 ConfigurationPropertiesBindingPostProcessor,也就是在bean被实例化后,会调用后置处理器,递归的查找属性,通过反射机制注入值,因此需要提供getter和setter方法。
此外,针对此种属性注入的方式,SpringBoot支持 Relaxed Bingding
,即秩序保证配置文件的属性和setter方法名相同即可。
注意事项
(1) 属性必须要有getter、setter方法
(2) 如果属性类型是集合,需要确保集合是不可变的。
(3) 如果使用Lombok自动生成 getter/setter方法,一定不要生成对应的任何构造函数,因为Spring IOC容器会自动使用它来实例化对象。
(4) 使用JavaBean属性绑定的方式只针对 标准Java Bean属性
,不支持对静态属性的绑定。
配置文件
application.yml
cs:
name: cs
star: 9
2.1 Maven依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
2.2 实体类
package com.couragesteak.entity;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Component
@ConfigurationProperties(prefix = "cs")
public class UserEntity {
private String name;
private String star;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getstar() {
return star;
}
public void setstar(String star) {
this.star = star;
}
@Override
public String toString() {
return "UserEntity{" +
"name='" + name + '\'' +
", star='" + star + '\'' +
'}';
}
}
2.3 后端
package com.couragesteak.service;
import com.couragesteak.entity.UserEntity;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ReadProperties_ConfigurationProperties {
@Autowired
private UserEntity userEntity;
@RequestMapping("/getInfo")
public String getInfo(String userName, Integer age){
System.out.println("666");
return userEntity.toString();
}
}
注意事项
Spring考虑到带有注释@ConfigurationProperties的类可能不适合扫描(比如:我正在开发自己的自动配置或希望有条件地启用它们),所以Spring并不会自动扫描带有注释@ConfigurationProperties的类。
在这些情况下,推荐使用@EnableConfigurationProperties注解指定要处理的类型列表(即:将@ConfigurationProperties注释的类加到Spring IOC容器中)。一般通过将@EnableConfigurationProperties加在@Configuration类上完成。
3 @Value和@ConfigurationProperties的区别
(1) @ConfigurationProperties注解支持属性文件和javabean映射;而@Value支持spel表达式。
(2) @ConfigurationProperties注解支持全量的属性,宽松绑定方式;而@Vavlue只推荐使用标准的 kebab-case
方式(仅使用小写字母和-
),例如@Value("{demo.item-price}")
可以提取demo.item-price
和demo-itemPrice
。
(3) 对于多个属性映射,并且属性尝尝被复用时,推荐使用@ConfigurationProperties;只读取单个属性使用@Value更加方便。
参考地址:
- 余胜军
- https://developer.aliyun.com/article/1058227
- https://www.couragesteak.com/article/292
<p><font face="楷体,华文行楷,隶书,黑体" color="red" size="4"><strong>哈喽,大家好,我是有勇气的牛排(全网同名)🐮🐮🐮</strong></font></p>
<p><font face="楷体,华文行楷,隶书,黑体" color="blue" size="4"><strong>有问题的小伙伴欢迎在文末评论,点赞、收藏是对我最大的支持!!!。</strong></font></p>
<p><h3>文章目录</h3><ul><ul><li><a href="#1__Value__6">1 使用 @Value 注解</a></li><li><a href="#2__ConfigurationProperties_38">2 使用 ConfigurationProperties</a></li><ul><li><a href="#21_Maven_62">2.1 Maven依赖</a></li><li><a href="#22__72">2.2 实体类</a></li><li><a href="#23__119">2.3 后端</a></li></ul><li><a href="#3_ValueConfigurationProperties_156">3 @Value和@ConfigurationProperties的区别</a></li></ul></ul></p>
<h2><a id="1__Value__6"></a>1 使用 @Value 注解</h2>
<pre><div class="hljs"><code class="lang-JAVA"><span class="hljs-comment">/*
* @Author : 有勇气的牛排
* @FileName: ReadProperties.java
* desc :
* */</span>
<span class="hljs-keyword">package</span> com.couragesteak.service;
<span class="hljs-keyword">import</span> org.springframework.beans.factory.annotation.Value;
<span class="hljs-keyword">import</span> org.springframework.web.bind.annotation.RequestMapping;
<span class="hljs-keyword">import</span> org.springframework.web.bind.annotation.RestController;
<span class="hljs-meta">@RestController</span>
<span class="hljs-keyword">public</span> <span class="hljs-keyword">class</span> <span class="hljs-title class_">ReadProperties</span> {
<span class="hljs-meta">@Value("${cs.name}")</span>
<span class="hljs-keyword">private</span> String name;
<span class="hljs-meta">@Value("${cs.star}")</span>
<span class="hljs-keyword">private</span> String star;
<span class="hljs-comment">// http://127.0.0.1:8080/getProperties</span>
<span class="hljs-meta">@RequestMapping("/getProperties")</span>
<span class="hljs-keyword">public</span> String <span class="hljs-title function_">getProperties</span><span class="hljs-params">()</span> {
<span class="hljs-keyword">return</span> name + <span class="hljs-string">":"</span> + star;
}
}
</code></div></pre>
<h2><a id="2__ConfigurationProperties_38"></a>2 使用 ConfigurationProperties</h2>
<p><code>@ConfigurationProperties</code> 加载配置通过 BeanPostProcessor实现,其对应的Bean的后置处理器为 ConfigurationPropertiesBindingPostProcessor,也就是在bean被实例化后,会调用后置处理器,递归的查找属性,通过反射机制注入值,因此需要提供getter和setter方法。</p>
<p>此外,针对此种属性注入的方式,SpringBoot支持 <code>Relaxed Bingding</code>,即秩序保证配置文件的属性和setter方法名相同即可。</p>
<p><strong>注意事项</strong></p>
<p>(1) 属性必须要有getter、setter方法<br />
(2) 如果属性类型是集合,需要确保集合是不可变的。<br />
(3) 如果使用Lombok自动生成 getter/setter方法,一定不要生成对应的任何构造函数,因为Spring IOC容器会自动使用它来实例化对象。<br />
(4) 使用JavaBean属性绑定的方式只针对 <code>标准Java Bean属性</code>,不支持对静态属性的绑定。</p>
<p><strong>配置文件</strong></p>
<p>application.yml</p>
<pre><div class="hljs"><code class="lang-yaml"><span class="hljs-attr">cs:</span>
<span class="hljs-attr">name:</span> <span class="hljs-string">cs</span>
<span class="hljs-attr">star:</span> <span class="hljs-number">9</span>
</code></div></pre>
<h3><a id="21_Maven_62"></a>2.1 Maven依赖</h3>
<pre><div class="hljs"><code class="lang-xml"><span class="hljs-comment"><!--导入配置文件处理器,配置文件进行绑定就会有提示--></span>
<span class="hljs-tag"><<span class="hljs-name">dependency</span>></span>
<span class="hljs-tag"><<span class="hljs-name">groupId</span>></span>org.springframework.boot<span class="hljs-tag"></<span class="hljs-name">groupId</span>></span>
<span class="hljs-tag"><<span class="hljs-name">artifactId</span>></span>spring-boot-configuration-processor<span class="hljs-tag"></<span class="hljs-name">artifactId</span>></span>
<span class="hljs-tag"><<span class="hljs-name">optional</span>></span>true<span class="hljs-tag"></<span class="hljs-name">optional</span>></span>
<span class="hljs-tag"></<span class="hljs-name">dependency</span>></span>
</code></div></pre>
<h3><a id="22__72"></a>2.2 实体类</h3>
<pre><div class="hljs"><code class="lang-java"><span class="hljs-comment">/*
* @Author : 有勇气的牛排
* @FileName: UserEntity.java
* desc :
* */</span>
<span class="hljs-keyword">package</span> com.couragesteak.entity;
<span class="hljs-keyword">import</span> org.springframework.boot.context.properties.ConfigurationProperties;
<span class="hljs-keyword">import</span> org.springframework.stereotype.Component;
<span class="hljs-meta">@Component</span>
<span class="hljs-meta">@ConfigurationProperties(prefix = "cs")</span>
<span class="hljs-keyword">public</span> <span class="hljs-keyword">class</span> <span class="hljs-title class_">UserEntity</span> {
<span class="hljs-keyword">private</span> String name;
<span class="hljs-keyword">private</span> String star;
<span class="hljs-keyword">public</span> String <span class="hljs-title function_">getName</span><span class="hljs-params">()</span> {
<span class="hljs-keyword">return</span> name;
}
<span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title function_">setName</span><span class="hljs-params">(String name)</span> {
<span class="hljs-built_in">this</span>.name = name;
}
<span class="hljs-keyword">public</span> String <span class="hljs-title function_">getstar</span><span class="hljs-params">()</span> {
<span class="hljs-keyword">return</span> star;
}
<span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title function_">setstar</span><span class="hljs-params">(String star)</span> {
<span class="hljs-built_in">this</span>.star = star;
}
<span class="hljs-meta">@Override</span>
<span class="hljs-keyword">public</span> String <span class="hljs-title function_">toString</span><span class="hljs-params">()</span> {
<span class="hljs-keyword">return</span> <span class="hljs-string">"UserEntity{"</span> +
<span class="hljs-string">"name='"</span> + name + <span class="hljs-string">'\''</span> +
<span class="hljs-string">", star='"</span> + star + <span class="hljs-string">'\''</span> +
<span class="hljs-string">'}'</span>;
}
}
</code></div></pre>
<h3><a id="23__119"></a>2.3 后端</h3>
<pre><div class="hljs"><code class="lang-java"><span class="hljs-comment">/*
* @Author : 有勇气的牛排
* @FileName: ReadProperties_ConfigurationProperties.java
* desc : ConfigurationProperties 配置文件读取
* */</span>
<span class="hljs-keyword">package</span> com.couragesteak.service;
<span class="hljs-keyword">import</span> com.couragesteak.entity.UserEntity;
<span class="hljs-keyword">import</span> org.springframework.beans.factory.annotation.Autowired;
<span class="hljs-keyword">import</span> org.springframework.web.bind.annotation.RequestMapping;
<span class="hljs-keyword">import</span> org.springframework.web.bind.annotation.RestController;
<span class="hljs-meta">@RestController</span>
<span class="hljs-keyword">public</span> <span class="hljs-keyword">class</span> <span class="hljs-title class_">ReadProperties_ConfigurationProperties</span> {
<span class="hljs-meta">@Autowired</span>
<span class="hljs-keyword">private</span> UserEntity userEntity;
<span class="hljs-comment">//</span>
<span class="hljs-meta">@RequestMapping("/getInfo")</span>
<span class="hljs-keyword">public</span> String <span class="hljs-title function_">getInfo</span><span class="hljs-params">(String userName, Integer age)</span>{
System.out.println(<span class="hljs-string">"666"</span>);
<span class="hljs-keyword">return</span> userEntity.toString();
}
}
</code></div></pre>
<p><strong>注意事项</strong></p>
<p>Spring考虑到带有注释@ConfigurationProperties的类可能不适合扫描(比如:我正在开发自己的自动配置或希望有条件地启用它们),所以Spring并不会自动扫描带有注释@ConfigurationProperties的类。</p>
<p>在这些情况下,推荐使用@EnableConfigurationProperties注解指定要处理的类型列表(即:将@ConfigurationProperties注释的类加到Spring IOC容器中)。一般通过将@EnableConfigurationProperties加在@Configuration类上完成。</p>
<h2><a id="3_ValueConfigurationProperties_156"></a>3 @Value和@ConfigurationProperties的区别</h2>
<p>(1) @ConfigurationProperties注解支持属性文件和javabean映射;而@Value支持spel表达式。</p>
<p>(2) @ConfigurationProperties注解支持全量的属性,宽松绑定方式;而@Vavlue只推荐使用标准的 <code>kebab-case</code>方式(仅使用小写字母和<code>-</code>),例如<code>@Value("{demo.item-price}")</code>可以提取<code>demo.item-price</code>和<code>demo-itemPrice</code>。</p>
<p>(3) 对于多个属性映射,并且属性尝尝被复用时,推荐使用@ConfigurationProperties;只读取单个属性使用@Value更加方便。</p>
<p>参考地址:</p>
<ul>
<li>余胜军</li>
<li>https://developer.aliyun.com/article/1058227</li>
<li>https://www.couragesteak.com/article/292</li>
</ul>
留言