我是 Spring Boot 框架的新手,我對 @Bean 注釋以及 Bean 如何更改實體變數有一些困惑。我有一個下面的例子,如果有人能回答我的問題會非常有幫助:
- 如果我在我的實體變數中定義了 restTemplate,userRestTemplate 模板 bean 將能夠改變它的值嗎?
- 如果 userRestTemplate 正在更改其值,那么 userDetail 將具有 userRestTemplate bean 的更新值?
- 如果不是 userdetail bean 將在 setTemplate 方法中設定什么?
@Configuration
public class UserConfiguration{
RestTemplate restTemplate;
@Bean
@Named("userRestTemplate")
public RestTemplate userRestTemplate(RestTemplateBuilder restTemplateBuilder) {
RestTemplate restTemplate = restTemplateBuilder.build();
//restTemplate.getMessageConverters().add(0, createMappingJacksonHttpMessageConverter());
this.restTemplate = restTemplate;
return restTemplate;
}
@Bean
public UserDetail userDetail() {
UserDetail user = new UserDetail();
user.setTemplate(restTemplate);
return user;
}
}
uj5u.com熱心網友回復:
您可以使用以下代碼配置您的新 bean。
@Configuration
public class UserConfiguration{
private final RestTemplate restTemplate;
@Autowired
public UserConfiguration(RestTemplate restTemplate) {
this.restTemplate = restTemplate;
}
@Bean
public UserDetail userDetail() {
UserDetail user = new UserDetail();
user.setTemplate(restTemplate);
return user;
}
}
uj5u.com熱心網友回復:
實際上,我認為這不是標準的創作方式。
當您使用 注釋方法時@Bean,您的意思是您想請 Spring 幫助您管理 bean。因此,將 bean 實體自己存盤為區域變數是沒有意義的。
與其將實體存盤在 class 欄位中,不如讓 Spring 為您提供實體。
有多種方法可以做到這一點。
RestTemplate在@Bean方法中指定為引數。如果您要求 Spring 管理多個 RestTemplate 實體,這是可能的。然后您應該指定與@Namedwhich is相同的引數名稱userRestTemplate,以便 Spring 可以正確找到正確的 restTemplate。
@Configuration
public class UserConfiguration{
@Bean
@Named("userRestTemplate")
public RestTemplate userRestTemplate(RestTemplateBuilder restTemplateBuilder) {
RestTemplate restTemplate = restTemplateBuilder.build();
// this.restTemplate = restTemplate; // no this restTemplate instance setting;
return restTemplate;
}
@Bean
public UserDetail userDetail(RestTemplate userRestTemplate) {
UserDetail user = new UserDetail();
user.setTemplate(userRestTemplate);
return user;
}
}
- 使用
@Autowired注釋。
@Configuration
public class UserConfiguration{
@Autowired
private RestTemplate restTemplate;
@Bean
@Named("userRestTemplate")
public RestTemplate userRestTemplate(RestTemplateBuilder restTemplateBuilder) {
RestTemplate restTemplate = restTemplateBuilder.build();
//restTemplate.getMessageConverters().add(0, createMappingJacksonHttpMessageConverter());
// this.restTemplate = restTemplate; // again no setting this, okay.
return restTemplate;
}
@Bean
public UserDetail userDetail() {
UserDetail user = new UserDetail();
user.setTemplate(restTemplate);
return user;
}
}
讓Spring來管理java bean,而不是自己管理的好處。您將有優勢使用Spring AOP, ...
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/338126.html
上一篇:SpringSecurityBCryptPasswordEncoder:編碼后的密碼看起來不像使用相同密碼的BCrypt
