Spring - 我应该使用@Bean 还是@Component?
Spring - should I use @Bean or @Component?
这是我工作中的当前代码。
方法一
@Configuration
public class AppConfig {
@Bean
@Autowired(required = false)
public HttpClient createHttpClient() {
// do some connections configuration
return new HttpClient();
}
@Bean
@Autowired
public NameClient nameClient(HttpClient httpClient,
@Value("${ServiceUrl:NotConfigured}")
String serviceUrl) {
return new NameClient(httpClient, serviceUrl);
}
}
NameClient
是一个简单的 POJO,如下所示
public class NameClient {
private HttpClient client;
private String url;
public NameClient(HttpClient client, String url) {
this.client = client;
this.url = url;
}
// other methods
}
我没有使用 @Bean
进行配置,而是想遵循以下模式:
方法二
@Configuration
public class AppConfig {
@Bean
@Autowired(required = false)
public HttpClient createHttpClient() {
// do some connections configuration
return new HttpClient();
}
}
并使用自动扫描功能获取 bean
@Service //@Component will work too
public class NameClient {
@Autowired
private HttpClient client;
@Value("${ServiceUrl:NotConfigured}")
private String url;
public NameClient() {}
// other methods
}
为什么上面第一个方法是used/preferred?一个比另一个有什么优势?我了解了使用 @Component
和 @Bean
注释之间的区别。
它们是等价的。
当您拥有 NameClient class 时通常会使用第二个,因此可以在其源代码中添加 Spring 注释。
当您不拥有 NameClient class 时,您将使用第一个,因此无法使用适当的 Spring 注释对其进行注释。
这是我工作中的当前代码。
方法一
@Configuration
public class AppConfig {
@Bean
@Autowired(required = false)
public HttpClient createHttpClient() {
// do some connections configuration
return new HttpClient();
}
@Bean
@Autowired
public NameClient nameClient(HttpClient httpClient,
@Value("${ServiceUrl:NotConfigured}")
String serviceUrl) {
return new NameClient(httpClient, serviceUrl);
}
}
NameClient
是一个简单的 POJO,如下所示
public class NameClient {
private HttpClient client;
private String url;
public NameClient(HttpClient client, String url) {
this.client = client;
this.url = url;
}
// other methods
}
我没有使用 @Bean
进行配置,而是想遵循以下模式:
方法二
@Configuration
public class AppConfig {
@Bean
@Autowired(required = false)
public HttpClient createHttpClient() {
// do some connections configuration
return new HttpClient();
}
}
并使用自动扫描功能获取 bean
@Service //@Component will work too
public class NameClient {
@Autowired
private HttpClient client;
@Value("${ServiceUrl:NotConfigured}")
private String url;
public NameClient() {}
// other methods
}
为什么上面第一个方法是used/preferred?一个比另一个有什么优势?我了解了使用 @Component
和 @Bean
注释之间的区别。
它们是等价的。
当您拥有 NameClient class 时通常会使用第二个,因此可以在其源代码中添加 Spring 注释。
当您不拥有 NameClient class 时,您将使用第一个,因此无法使用适当的 Spring 注释对其进行注释。