我正在使用Spring Boot开发2个网络应用程序,而且我还使用Keycloak来管理身份验证和授权。
然后我从app1中暴露了一些apis
。这些api是使用KeycloakRestTemplate从app2调用的。
这是一个例子:
@Autowired
private KeycloakRestTemplate restTemplate;
......
JSONObject jObj = new JSONObject(restTemplate.getForEntity(URI.create(API_URL, String.class).getBody());
我以这种方式配置了其余模板:
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled=true)
@KeycloakConfiguration
public class SecurityConfig extends KeycloakWebSecurityConfigurerAdapter {
@Autowired
public KeycloakClientRequestFactory keycloakClientRequestFactory;
...
@Bean
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public KeycloakRestTemplate keycloakRestTemplate() {
return new KeycloakRestTemplate(keycloakClientRequestFactory);
}
...
}
直到这里它完美无缺,但我发现当我使用这个休息模板时,它会为每个调用生成一个新会话。 我怎么能避免它?
答案 0 :(得分:0)
这取决于您如何使用它。您正在使用PROTOTYPE范围声明RestTemplate
,因此每次请求时都会创建一个bean。这就是PROTOTYPE范围is all about。此外,如果您只注射一次,但是您在一次又一次启动的示例程序中对其进行测试,那么您将拥有许多bean创建。通常,我在服务中注入RestTemplate
:
@Service
public class RemoteAccessService{
private RestTemplate restTemplate;
public RemoteAccessService(RestTemplate restTemplate){
this.restTemplate = restTemplate;
}
public void doSomething(){
//Use restTemplate here
}
}
Spring Service
创建为SINGLETON,因此RestTemplate
仅被请求一次。