懒初始化的map

本文介绍了一种使用懒加载技术的Map实现方式,该方式在首次获取元素时进行初始化,有效提高了资源利用效率。通过实现Initializer接口,可以在不访问时避免不必要的资源消耗。
package org.jsirenia.defer;

import java.util.Map;
/***
 * 第一次get的时候,调用初始化方法。
 * @author zhoujiaping  2019-04-23
 *
 */
public class LazyInitMap<K,V>{
	private  Map<K,V> map;
	private boolean initialized;
	private Initializer<K,V> initializer;
	public interface Initializer<K,V>{
		Map<K,V> init();
	}
	public LazyInitMap(Initializer<K,V> initializer){
		if(initializer==null){
			throw new RuntimeException("LazyMap构造器的initializer不能为空");
		}
		this.initializer = initializer;
	}
	public V get(K k){
		if(!initialized){
			synchronized(this){
				if(!initialized){
					map = initializer.init();
					if(map==null){
						throw new RuntimeException("LazyMap的initializer返回值不能为空");
					}
					initialized = true;
				}
			}
		}
		return map.get(k);
	}
}

`@FeignClient` 初始化预热是为了在系统启动阶段提前创建和初始化 Feign 客户端,避免在实际请求时因首次创建客户端带来的性能延迟。 ### 方法 #### 手动调用 Feign 客户端方法 在系统启动完成后,手动调用一次 Feign 客户端的方法,触发客户端的初始化。示例代码如下: ```java import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.stereotype.Component; // 假设这是一个 Feign 客户端接口 interface MyFeignClient { String getData(); } @Component public class FeignClientWarmUp implements CommandLineRunner { @Autowired private MyFeignClient myFeignClient; @Override public void run(String... args) throws Exception { // 手动调用 Feign 客户端方法进行预热 myFeignClient.getData(); } } ``` #### 自定义预热逻辑 可以编写一个自定义的预热类,在系统启动时遍历所有的 Feign 客户端并调用其方法。示例代码如下: ```java import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.cloud.openfeign.FeignClientFactoryBean; import org.springframework.context.ApplicationContext; import org.springframework.stereotype.Component; import java.util.Map; @Component public class CustomFeignClientWarmUp implements CommandLineRunner { @Autowired private ApplicationContext applicationContext; @Override public void run(String... args) throws Exception { // 获取所有 FeignClientFactoryBean 类型的 Bean Map<String, FeignClientFactoryBean> feignClientBeans = applicationContext.getBeansOfType(FeignClientFactoryBean.class); for (FeignClientFactoryBean feignClientFactoryBean : feignClientBeans.values()) { Object feignClient = feignClientFactoryBean.getObject(); // 这里可以根据实际情况调用 Feign 客户端的方法 // 例如假设所有客户端都有一个名为 getData 的方法 // 可以通过反射调用该方法 // Method method = feignClient.getClass().getMethod("getData"); // method.invoke(feignClient); } } } ``` ### 原理 - **动态代理机制**:`@FeignClient` 基于 Java 的动态代理机制实现。当应用启动时,Spring Cloud 会根据 `@FeignClient` 注解的配置信息,动态生成一个代理类来实现 Feign 客户端接口。这个代理类负责将接口方法的调用转换为 HTTP 请求,并处理请求和响应。 - **懒加载机制**:默认情况下,Feign 客户端是懒加载的,即只有在第一次调用客户端方法时才会进行初始化。初始化过程包括创建 HTTP 客户端、配置请求拦截器、解析请求模板等操作,这些操作可能会消耗一定的时间和资源。 - **预热的作用**:通过在系统启动阶段进行预热,提前触发 Feign 客户端的初始化过程,将初始化的开销分摊到系统启动阶段,避免在实际业务请求时因首次初始化导致的性能延迟,从而提高系统的响应速度和稳定性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值