Spring Boot @configurationProperties.

时间:2020-02-23 14:35:46  来源:igfitidea点击:

在本教程中,我们将看到Spring Boot @configurationProperties注释。

Spring Boot @configurationProperties允许我们轻松地将具有Java对象的属性值映射。

让我们首先看到正常的映射。
假设我们有以下属性文件。

application.properties.

org.blogname=theitroad
org.host=hostEasy

我们可以访问以下属性文件如下。

package org.igi.theitroad;
 
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
 
@Component
public class BlogDetails {
	
	@Value("${org.blogName}")
	String blogName;
	
	@Value("${org.host}")
	String host;
 
	public String getBlogName() {
		return blogName;
	}
 
	public void setBlogName(String blogName) {
		this.blogName = blogName;
	}
 
	public String getHost() {
		return host;
	}
 
	public void setHost(String host) {
		this.host = host;
	}		
}

因此,我们可以使用@Value从Application.properties从Application.properties获取属性值,但它可能会繁琐才能在各处使用@Value,Spring Boot提供@configurationProperties以将属性值映射到Java对象。

让我们通过示例来理解。

步骤1:使用名为"springboothelly申请"的Eclipse中的Maven创建动态Web项目。

maven依赖项:

第2步:更改POM.xml如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
 
	<groupId>org.igi.theitroad</groupId>
	<artifactId>SpringBootConfigurationPropertiesExample</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>jar</packaging>
 
	<name>SpringBootConfigurationPropertiesExample</name>
	<description>Demo project for Spring Boot</description>
 
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.0.3.RELEASE</version>
		<relativePath <!-- lookup parent from repository -->
	</parent>
 
	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
		<java.version>1.8</java.version>
	</properties>
 
	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter</artifactId>
		</dependency>
 
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>
 
	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>
 
 
</project>

第3步:创建名为"org.igi.theitroad"的包和名为serverdetail的类

package org.igi.theitroad;
 
import java.util.Arrays;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
 
@Configuration
@ConfigurationProperties(prefix="com.server")
public class ServerDetails {
 
	String url;
	String name;
	int[] port;
	Application application;
	
	public static class Application
	{
		String userName;
		String password;
		public String getUserName() {
			return userName;
		}
		public void setUserName(String userName) {
			this.userName = userName;
		}
		public String getPassword() {
			return password;
		}
		public void setPassword(String password) {
			this.password = password;
		}
	
	}
 
	public String getUrl() {
		return url;
	}
 
	public void setUrl(String url) {
		this.url = url;
	}
 
	public String getName() {
		return name;
	}
 
	public void setName(String name) {
		this.name = name;
	}
 
	public int[] getPort() {
		return port;
	}
 
	public void setPort(int[] port) {
		this.port = port;
	}
 
	public Application getApplication() {
		return application;
	}
 
	public void setApplication(Application application) {
		this.application = application;
	}
	
	@Override
	public String toString() {
		 return "Server Details{" +
                 "name='" + name + '\'' +
                 ", url='" + url + '\'' +
                 ", port='" + Arrays.toString(port) + '\'' +
                 ", username='" + application.getUserName()+ '\'' +
                 ", password='" + application.getPassword()+ '\'' +
                 '}';
	}	
}

步骤4:更改应用程序.properties以添加以下属性。

org.blogName=theitroad
org.host=hostEasy
 
com.server.url= dummy.xyz.com
com.server.name= amazonEc2
com.server.port[0]=8080
com.server.port[1]=8081
 
com.server.application.username = admin
com.server.application.password = admin123

第5步:创建Spring Boot Main类。

package org.igi.theitroad;
 
import javax.annotation.PostConstruct;
 
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
 
@SpringBootApplication
public class SpringBootExample {
 
	@Autowired
	ServerDetails serverDetails;
 
	public static void main(String[] args) {
		ConfigurableApplicationContext run = SpringApplication.run(SpringBootExample.class, args);
	}
 
	@PostConstruct
	public void init() {
 
		System.out.println(serverDetails.toString());
		
	}
}

正如我们所看到的,我们使用@autowired将ServerDetail注入SpringBootexample。

步骤6:运行应用程序。

运行上面的示例时,我们将得到以下输出。

. ____ _ __ _ _
/\/___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )___ | '_ | '_| | '_ \/_` | \ \ \ \
\/___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |___, |////
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.0.3.RELEASE)
2016-07-14 23:53:47.766 INFO 67832 — [ main] org.igi.theitroad.SpringBootExample : Starting SpringBootExample on apples-MacBook-Air.local with PID 67832 (/Users/apple/Downloads/SpringBootConfigurationPropertiesExample/target/classes started by apple in /Users/apple/Downloads/SpringBootConfigurationPropertiesExample)
2016-07-14 23:53:47.774 INFO 67832 — [ main] org.igi.theitroad.SpringBootExample : No active profile set, falling back to default profiles: default
2016-07-14 23:53:47.901 INFO 67832 — [ main] s.c.a.AnnotationConfigApplicationContext : Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@429bd883: startup date [Sat May 14 23:53:47 IST 2016]; root of context hierarchy
Server Details{name='amazonEc2′, url='dummy.xyz.com', port='[8080, 8081]', username='admin', password='admin123′}
2016-07-14 23:53:49.000 INFO 67832 — [ main] o.s.j.e.a.AnnotationMBeanExporter : Registering beans for JMX exposure on startup
2016-07-14 23:53:49.024 INFO 67832 — [ main] org.igi.theitroad.SpringBootExample : Started SpringBootExample in 2.252 seconds (JVM running for 3.406)
2016-07-14 23:53:49.028 INFO 67832 — [ Thread-2] s.c.a.AnnotationConfigApplicationContext : Closing org.springframework.context.annotation.AnnotationConfigApplicationContext@429bd883: startup date [Sat May 14 23:53:47 IST 2016]; root of context hierarchy
2016-07-14 23:53:49.030 INFO 67832 — [ Thread-2] o.s.j.e.a.AnnotationMBeanExporter : Unregistering JMX-exposed beans on shutdown

这是图片,它将更好地了解@ConfigurationProperties。

宽松绑定

Spring boot的一个有趣特征是放松的绑定。
对于com.server.Application.Username,下面是有效的Spring Boot绑定。

  • com.server.Application.User_name(使用_)
  • com.server.Application.User-name(使用 - )
  • com.server.application.user_name(用大写)

自定义属性文件

我们也可以使用自定义属性而不是应用程序。
使用@propertysource注释。

package org.igi.theitroad;
 
import java.util.Arrays;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
 
@Configuration
@PropertySource("classpath:custom.properties")
@ConfigurationProperties(prefix="com.server")
public class ServerDetails {
..
}

验证

我们可以使用JSR-303验证API验证属性。
我们需要添加以下依赖项。

<dependency>
    <groupId>org.hibernate</groupId>
   <artifactId>hibernate-validator</artifactId>
   <version>6.0.10.Final</version>
   <relativePath
</dependency>

例如:假设我们希望将用户名限制为5到8个字符,我们可以使用@Length Annotaton如下所示。

@Length(max = 8, min = 5)
		String userName;

如果将用户名更改为亚当

com.server.application.username = adam

我们将获得以下验证错误。

Property:.com.server.application.username
Value: adam
Reason: length must be between 5 and 8