定义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

posted @ 2025-07-01 11:17  kiss_sheep  阅读(11)  评论(0)    收藏  举报