빈 이름을 참조하여 @Scheduled 주석에서 @ConfigurationProperties 사용
사용 중@ConfigurationProperties
Spring boot에서 백그라운드 작업의 지연을 구성하고 이 값을 사용하려고 합니다.@Scheduled
다른 구성 요소에 대한 주석입니다.하지만, 그것을 작동시키기 위해서 나는 봄에 콩에 주어진 전체 이름을 사용해야 합니다.
구성 속성 클래스는 다음과 같습니다.
@ConfigurationProperties("some")
class SomeProperties {
private int millis; //the property is some.millis
public int getMillis() {
return millis;
}
public void setMillis(int millis) {
this.millis = millis;
}
}
그리고 저는 다음과 같은 값을 예정된 방법으로 사용하고 있습니다.
@Component
class BackgroundTasks {
@Scheduled(fixedDelayString = "#{@'some-com.example.demo.SomeProperties'.millis}") //this works.
public void sayHello(){
System.out.println("hello");
}
}
콩의 전체 이름을 사용하지 않고도 값을 참조할 수 있습니까?이 답변은 가능하다는 것을 암시하지만, 저는 그것을 실행할 수 없었습니다.
사용.@Component
속성 클래스에서 다음과 같이 속성에 액세스할 수 있습니다."#{@someProperties.persistence.delay}
.
일부 속성.java
package com.example.demo;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@ConfigurationProperties("some")
@Component("someProperties")
public class SomeProperties {
private int millis; // the property is some.millis
public int getMillis() {
return millis;
}
public void setMillis(int millis) {
this.millis = millis;
}
}
백그라운드 태스크.java
package com.example.demo;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
@Component
public class BackgroundTasks {
/**
*
* Approach1: We can inject/access the property some.millis directly in @Value
* fashion even though we have configured it to bind with SomeProperties class
* using @ConfigurationProperties.
*
*
*/
@Scheduled(fixedRateString = "${some.millis}")
public void fromDirectInjection() {
System.out.println("Hi, I'm from DirectInjection method");
}
/**
*
* Approach2: Add @Component on SomeProperties and access the bean bean's
* property millis like below using Spring Expression language
*
*
*/
@Scheduled(fixedRateString = "#{@someProperties.millis}")
public void fromConfigurationProperty() {
System.out.println("Hi, I'm from ConfigurationProperty method");
}
}
DemoApplication.java
package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;
@SpringBootApplication
@EnableScheduling
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
application.properties
some.millis=2000
사용된 버전
SpringBoot 2.6.0
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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.6.0-SNAPSHOT</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>demo</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>11</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</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>
<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
<repository>
<id>spring-snapshots</id>
<name>Spring Snapshots</name>
<url>https://repo.spring.io/snapshot</url>
<releases>
<enabled>false</enabled>
</releases>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</pluginRepository>
<pluginRepository>
<id>spring-snapshots</id>
<name>Spring Snapshots</name>
<url>https://repo.spring.io/snapshot</url>
<releases>
<enabled>false</enabled>
</releases>
</pluginRepository>
</pluginRepositories>
</project>
출력:
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.6.0-SNAPSHOT)
2021-10-08 08:38:03.342 INFO 8092 --- [ main] com.example.demo.DemoApplication : Starting DemoApplication using Java 14.0.2 on TO-GZ9M403-L with PID 8092 (D:\workspaces\configprop\demo (1)\demo\target\classes started by D1 in D:\workspaces\configprop\demo (1)\demo)
2021-10-08 08:38:03.345 INFO 8092 --- [ main] com.example.demo.DemoApplication : No active profile set, falling back to default profiles: default
2021-10-08 08:38:04.884 INFO 8092 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http)
2021-10-08 08:38:04.902 INFO 8092 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat]
2021-10-08 08:38:04.902 INFO 8092 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.53]
2021-10-08 08:38:05.050 INFO 8092 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
2021-10-08 08:38:05.050 INFO 8092 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 1631 ms
2021-10-08 08:38:05.644 INFO 8092 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path ''
Hi, I'm from DirectInjection method
Hi, I'm from ConfigurationProperty method
2021-10-08 08:38:05.662 INFO 8092 --- [ main] com.example.demo.DemoApplication : Started DemoApplication in 2.995 seconds (JVM running for 3.712)
Hi, I'm from DirectInjection method
Hi, I'm from ConfigurationProperty method
Hi, I'm from DirectInjection method
Hi, I'm from ConfigurationProperty method
Hi, I'm from DirectInjection method
Hi, I'm from ConfigurationProperty method
Spring 문서에서:
구성 속성 검색을 사용하거나 @EnableConfigurationProperties를 통해 @ConfigurationProperties 빈을 등록하는 경우 빈의 일반 이름은 -입니다. 여기서 은 @ConfigurationProperties 주석에 지정된 환경 키 접두사이고 은 빈의 정규화된 이름입니다.주석이 접두사를 제공하지 않는 경우 완전한 콩 이름만 사용됩니다.위의 예에서 bean 이름은 com.example.app-com.example.app입니다.일부 속성.
그래서 답은 다음과 같습니다.
- JavaBean 스타일 속성을 사용하는 경우 @Component 또는 @Bean에 Bean을 등록할 수 있습니다.그러면 SPEL 표현식에서 콩 이름만 사용할 수 있습니다.
- @ConstructorBinding을 사용하여 불변 속성을 가진 경우 다음과 같은 환경 키 접두사와 함께 완전한 빈 이름을 사용해야 합니다.
@Scheduled(fixedRateString = "#{@'other-com.example.demo.OtherProperties'.millis}")
여기 샘플 프로젝트가 있습니다 - Arun Sai에서 분기된 https://github.com/marksutic/scheduler_fixedratestring, .
콩이 다음으로 생성된다고 가정하면 다음이 잘 작동할 것입니다.someProperties
기본적으로 이름은 재정의되지 않습니다.
@Scheduled(fixedDelayString = "#{@someProperties.getMillis()}")
언급URL : https://stackoverflow.com/questions/49034588/using-configurationproperties-in-a-scheduled-annotation-by-referencing-the-bea
'programing' 카테고리의 다른 글
Kubernetes에 MariaDB ColumnStore를 설치하는 방법은 무엇입니까? (0) | 2023.08.21 |
---|---|
"git add, git commit" 이전 또는 이후에 "git pull"을 수행해야 합니까? (0) | 2023.08.21 |
"return false;"는 무엇을 합니까? (0) | 2023.08.21 |
jquery를 사용하여 뷰포트를 기준으로 요소의 위치 가져오기 (0) | 2023.08.21 |
선택 요소에서 선택한 옵션 가져오기 (0) | 2023.08.21 |