静态方法调用@Autowired注入的service的问题

关于工具类静态方法调用@Autowired注入的service类问题

记录下。之前遇到过解决了 。但是没有深究。

spring自动注入,使用spring框架的很常用,但是如果在静态方法中调用此注入类的方法,发现注入为’null’;原因不是spring未注入,而是被static方法给’清空’了,在无法先于static方法初始化之前想了一个办法
private static Test test;
@Autowired
private Redisson redisson;
private String a = “a”;
private String b = “b”;
private String c = “c”;
private String d = “d”;

@PostConstruct
public void init() {
test= this;
test.redisson=this.redisson;
}
@PostConstruct修饰的方法会在服务器加载Servle的时候运行,并且只会被服务器执行一次。PostConstruct在构造函数之后执行,init()方法之前执行。

构造器 加载属性时 需要加

public Test(String a){
    RLock lock = redisson.getLock("key");
    lock.lock();
    System.out.println("b_____"+b);
    System.out.println("c_____"+c);
    System.out.println("d_____"+d);
    lock.unlock();

}
此处会报错 空指针。 调用不了 redisson
需改为
public Test(String a){
redisson =test.redisson;
RLock lock = redisson.getLock(“key”);
lock.lock();
System.out.println(“b_____”+b);
System.out.println(“c_____”+c);
System.out.println(“d_____”+d);
lock.unlock();
}
此处redisson是作为test的属性。所以下面可以调用

需要在工具类中注入Service,由于工具类中方法一般都是静态的,所以要求该属性也要是静态的。
但是由于Spring/SpringBoot正常情况下不能支持注入静态属性(会报空指针异常)。
主要原因在于:Spring的依赖注入实际上是依赖于Set方法进行注入值的,Spring是基于对象层面的依赖注入,而静态属性/静态变量实际上是属于类的。

Feign 是 Netflix 开源的一款声明式 HTTP 客户端库,用于简化远程调用和 REST API 的使用。静态方法调用 Feign 可以通过直接使用预定义的接口(如 `Ribbon` 或 `Hystrix` 等)创建客户端实例,并发起请求。 ### 静态方法调用 Feign 的步骤: 1. **导入依赖**:首先,在项目中添加 Feign 相关的 Maven 或 Gradle 依赖。例如,在 Maven 中可以添加以下依赖: ```xml <dependency> <groupId>com.github(feign)</groupId> <artifactId>feign</artifactId> <version>(最新版本)</version> </dependency> ``` 2. **创建配置文件**:通常会有默认的配置类用于全局设置,如 `Feign.Builder`。但你也可以自定义配置类来自定义特定的行为。 3. **定义接口**:编写一个接口并注解 `@FeignClient` 来指定这个服务的具体信息,如服务名称、URL 和超时时间等。 ```java @FeignClient(name = "my-service", url = "${my-service.url}", configuration = YourConfiguration.class) public interface MyServiceClient { @GetMapping("/health") HealthCheckResponse health(); } ``` 4. **注入接口**:在需要调用该服务的类中,通过构造函数或依赖注入的方式注入上述接口,然后就可以像调用本地方法一样使用了。 5. **发起请求**:调用接口中的方法即可发起远程调用。 ### 示例代码: 假设我们需要调用名为 `MyService` 的远程服务,其提供的接口包含了一个 `/health` 路径的方法返回健康检查结果。 ```java @Service public class ServiceClass { private final MyServiceClient myServiceClient; @Autowired public ServiceClass(MyServiceClient myServiceClient) { this.myServiceClient = myServiceClient; } public void checkHealth() { try { HealthCheckResponse response = myServiceClient.health(); System.out.println("Health status: " + response.getStatus()); } catch (Exception e) { e.printStackTrace(); } } } ``` ### 注意事项: - **容错处理**:Feign 支持集成多种错误处理机制,如 Hystrix 和 Ribbon,可以增强系统的健壮性和稳定性。 - **序列化支持**:Feign 支持多种序列化库(Jackson、Gson 等),选择合适的序列化库可以帮助提高性能或兼容性。 - **日志记录**:通过配置日志级别和内容,可以在请求过程中获取更多详细信息,有助于调试和监控。 ### 相关问题: 1. **如何自定义 Feign 的默认超时时间和连接时间?** 2. **如何集成 Feign 与其他微服务框架一起使用,比如 Spring Cloud?** 3. **在哪些场景下 Feign 比其他HTTP客户端更合适?**
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值