我在一個每隔幾分鐘更改一次憑據的環境中作業。為了使實作依賴于這些憑據的客戶端的 bean 作業,需要重繪 bean。我決定為它實作自定義范圍是一個很好的方法。在查看檔案后,我發現要實作的范圍的主要方法是get方法:
public class CyberArkScope implements Scope {
private Map<String, Pair<LocalDateTime, Object>> scopedObjects = new ConcurrentHashMap<>();
private Map<String, Runnable> destructionCallbacks = new ConcurrentHashMap<>();
private Integer scopeRefresh;
public CyberArkScope(Integer scopeRefresh) {
this.scopeRefresh = scopeRefresh;
}
@Override
public Object get(String name, ObjectFactory<?> objectFactory) {
if (!scopedObjects.containsKey(name) || scopedObjects.get(name).getKey()
.isBefore(LocalDateTime.now().minusMinutes(scopeRefresh))) {
scopedObjects.put(name, Pair.of(LocalDateTime.now(), objectFactory.getObject()));
}
return scopedObjects.get(name).getValue();
}
@Override
public Object remove(String name) {
destructionCallbacks.remove(name);
return scopedObjects.remove(name);
}
@Override
public void registerDestructionCallback(String name, Runnable runnable) {
destructionCallbacks.put(name, runnable);
}
@Override
public Object resolveContextualObject(String name) {
return null;
}
@Override
public String getConversationId() {
return "CyberArk";
}
}
@Configuration
@Import(CyberArkScopeConfig.class)
public class TestConfig {
@Bean
@Scope(scopeName = "CyberArk")
public String dateString(){
return LocalDateTime.now().toString();
}
}
@RestController
public class HelloWorld {
@Autowired
private String dateString;
@RequestMapping("/")
public String index() {
return dateString;
}
}
當我使用控制器中自動裝配的簡單字串范圍除錯此實作時,我看到 get 方法僅在啟動時呼叫一次,再也不會呼叫。所以這意味著 bean 永遠不會再次重繪 。這種行為是否有問題,或者 get 方法應該如何作業?
uj5u.com熱心網友回復:
似乎您還需要定義 proxyMode 來注入 AOP 代理而不是對字串的靜態參考。請注意,bean 類不能是最終的。這解決了它:
@Configuration
@Import(CyberArkScopeConfig.class)
public class TestConfig {
@Bean
@Scope(scopeName = "CyberArk", proxyMode=ScopedProxyMode.TARGET_CLASS)
public NonFinalString dateString(){
return new NonFinalString(LocalDateTime.now());
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/336942.html
上一篇:與JavaFX控制器相比,如何在SpringMVC中正確定義控制器
下一篇:java.lang.NoSuchFieldError:com/fasterxml/jackson/annotation/JsonInclude$Include.USE_DEFAULTS
