定义Bean
demo : Spring Boot 配置类中的 Bean 定义方法,用于创建并注册一个 HTTP 调用服务
/**
* http接口调用bean
*
* @param httpProperties
* @return
*/
@Bean
public HttpInvokeService httpInvokeService(
@Qualifier("httpProperties") HttpProperties httpProperties
) {
return new HttpInvokeServiceImpl(httpProperties);
}
1、@Bean 注解
作用:声明该方法将创建一个 Spring 管理的 Bean
效果:Spring 容器启动时会执行此方法,并将返回的对象注册为 Bean
Bean 名称:默认使用方法名 httpInvokeService
2、方法签名
public HttpInvokeService httpInvokeService(...)
返回类型:HttpInvokeService (接口)
实际返回:HttpInvokeServiceImpl (接口的实现类)
设计模式:使用 面向接口编程,便于后续替换实现
3、参数注入
@Qualifier("httpProperties") HttpProperties httpProperties
@Qualifier:指定要注入的 Bean 名称(当存在多个同类型 Bean 时避免歧义)
这里显式要求注入名为 "httpProperties" 的 HttpProperties 类型 Bean
依赖注入模式:构造器注入(通过参数传入依赖)
4、实现逻辑
return new HttpInvokeServiceImpl(httpProperties);
创建 HttpInvokeServiceImpl 实例
将配置对象 httpProperties 传入实现类
典型的 依赖注入 做法(解耦配置与业务逻辑)
整体工作流程
Spring 容器启动时扫描到此配置类
查找名为 "httpProperties" 的 HttpProperties Bean
调用 httpInvokeService() 方法,传入找到的配置 Bean
创建 HttpInvokeServiceImpl 实例并注入配置
将创建的实例注册为 HttpInvokeService 类型的 Bean
配置与实现分离
HttpProperties:封装 HTTP 相关配置(如超时时间、URL 前缀等)
HttpInvokeService:定义 HTTP 调用接口
HttpInvokeServiceImpl:具体实现,使用配置参数执行 HTTP 请求
// 后续使用示例
@Autowired
private HttpInvokeService httpService;
public void getUser() {
String response = httpService.get("/user/123");
}
调用方只需依赖接口,不关心具体实现
可轻松替换不同的 HTTP 客户端实现(如 OkHttp/JDK HttpClient)
典型的 HttpProperties 类结构:
@ConfigurationProperties(prefix = "app.http")
public class HttpProperties {
private String baseUrl;
private int connectTimeout = 5000;
private int readTimeout = 10000;
// getters/setters
}
对应 application.yml 配置:
app:
http:
base-url: https://api.example.com
connect-timeout: 3000
read-timeout: 5000
其他
@Configuration // 标记为配置类
public class HttpConfig {
@Bean
@ConfigurationProperties(prefix = "app.http") // 绑定配置项
public HttpProperties httpProperties() {
return new HttpProperties();
}
@Bean
public HttpInvokeService httpInvokeService(HttpProperties httpProperties) {
return new HttpInvokeServiceImpl(httpProperties);
}
}
接口设计示例
public interface HttpInvokeService {
String get(String path);
String post(String path, Map<String, Object> body);
}
public class HttpInvokeServiceImpl implements HttpInvokeService {
private final HttpProperties properties;
private final OkHttpClient client;
public HttpInvokeServiceImpl(HttpProperties properties) {
this.properties = properties;
this.client = new OkHttpClient.Builder()
.connectTimeout(properties.getConnectTimeout(), TimeUnit.MILLISECONDS)
.readTimeout(properties.getReadTimeout(), TimeUnit.MILLISECONDS)
.build();
}
@Override
public String get(String path) {
// 使用 client 实现请求
String url = properties.getBaseUrl() + path;
// ... 发送请求并返回结果
}
}
添加了 @EnableConfigurationProperties

浙公网安备 33010602011771号