Java 在Spring启动应用程序启动后设置系统属性是否合适?
由于每个属性都被设置到每个应用程序的JVM实例中,因此,一旦我的应用程序设置了所有it Bean并开始在我的服务器上运行以下内容,将会发生什么行为: System.setProperty(字符串键、字符串值)是否会在运行时通过更改特定JVM实例中的前一个键或创建新实例来反映新的更改Java 在Spring启动应用程序启动后设置系统属性是否合适?,java,spring,spring-boot,spring-rest,Java,Spring,Spring Boot,Spring Rest,由于每个属性都被设置到每个应用程序的JVM实例中,因此,一旦我的应用程序设置了所有it Bean并开始在我的服务器上运行以下内容,将会发生什么行为: System.setProperty(字符串键、字符串值)是否会在运行时通过更改特定JVM实例中的前一个键或创建新实例来反映新的更改 此外,我还注意到一个构造函数中的另一个异常,在该异常之前我尝试设置属性。我做了一些测试,结果如下: 如果在bean的构造函数中使用属性,则旧bean在属性更改后不会更改。因此,更改不会影响默认范围为的bean。如果您
此外,我还注意到一个构造函数中的另一个异常,在该异常之前我尝试设置属性。我做了一些测试,结果如下: 如果在bean的构造函数中使用属性,则旧bean在属性更改后不会更改。因此,更改不会影响默认范围为
的bean。如果您有带有@RequestScope的Bean,则每次收到新请求时,都会创建带有新值的新Bean
@RestController
@RequestScope
public class Controller {
private String testValue;
@Autowired
public Controller(@Value("${pl.bier.test}") String testValue) {
this.testValue = testValue;
}
@GetMapping("/foo")
public FooModel fooEndpoint() {
System.setProperty("pl.bier.test", testValue + "bar");
return new FooModel(testValue);
}
}
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
class FooModel {
private String value;
}
访问/foo端点时,每次都会得到不同的响应(每次都会有一个“嘿”)
如果删除@RequestScope,您总是会得到相同的答案。我做了一些测试,结果如下:
如果在bean的构造函数中使用属性,则旧bean在属性更改后不会更改。因此,更改不会影响默认范围为的bean。如果您有带有@RequestScope的Bean,则每次收到新请求时,都会创建带有新值的新Bean
@RestController
@RequestScope
public class Controller {
private String testValue;
@Autowired
public Controller(@Value("${pl.bier.test}") String testValue) {
this.testValue = testValue;
}
@GetMapping("/foo")
public FooModel fooEndpoint() {
System.setProperty("pl.bier.test", testValue + "bar");
return new FooModel(testValue);
}
}
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
class FooModel {
private String value;
}
访问/foo端点时,每次都会得到不同的响应(每次都会有一个“嘿”)
如果删除@RequestScope,您总是会得到相同的答案。从您自己的代码中设置系统属性通常不是一个好主意。@chrylis小心光学您能更详细地解释一下吗?如果我为系统属性创建一个单独的配置bean,并且具有有序的。最低的\u优先级,则可以先创建它,然后再创建其他bean,因此,我的其他bean不必担心从自己的代码中设置系统属性通常不是一个好主意。@chrylis cautiouslyoptimistic您能更详细地解释一下吗?如果我为系统属性创建一个具有Ordered.LOWEST_优先级的单独配置bean,是否可以在之前先创建它任何其他的豆子,这样我的其他豆子就不用担心了