Spring实现Bean延迟加载
使用spring,则所有bean统一交给spring管理,spring负责初始化、销毁等整个声明周期。所有bean的定义通过配置文件或javaConfig方式。启动时统一初始化并加载至spring的applicationContext中,通过其getBean方法获取。
但有时为了加快系统启动速度,并不需启动时立刻初始化并加载,可以在使用其时才初始化并加载,可以使用@Lazy实现懒加载
有些时候,我们不需要懒加载,但是又希望一些Bean在项目启动后延迟几分钟再初始化加载,具体实现案例如下:
import java.util.List;
import org.apache.commons.collections.CollectionUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
/**
* Description:Bean延迟懒加载实现
* @author xxx
* @version 1.0.0
* @date 2022/2/16
*/
public class SpringContextUtils implements ApplicationContextAware {
public static ApplicationContext applicationContext;
private List<String> lazyLoadBeans;
private static final Logger logger = LoggerFactory.getLogger(SpringContextUtils.class);
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
SpringContextUtils.applicationContext = applicationContext;
LazyLoadThread t1 = new LazyLoadThread(applicationContext, lazyLoadBeans);
t1.start();
}
public void setLazyLoadBeans(List<String> lazyLoadBeans) {
this.lazyLoadBeans = lazyLoadBeans;
}
class LazyLoadThread extends Thread {
private ApplicationContext applicationContext;
private List<String> lazyLoadBeans;
public LazyLoadThread(ApplicationContext applicationContext, List<String> lazyLoadBeans) {
this.applicationContext = applicationContext;
this.lazyLoadBeans = lazyLoadBeans;
}
@Override
public void run() {
if(CollectionUtils.isEmpty(lazyLoadBeans)) {
return;
}
// 延时3分钟加载
try {
Thread.sleep(3 * 60 * 1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
for(String bean : lazyLoadBeans) {
logger.info("SpringContextUtils lazy Load Bean : {}", bean);
applicationContext.getBean(bean);
}
}
}
}
xml方式把Bean添加到Spring容器
<!-- 延时加载,把需要延时加载的Bean放到list中 -->
<bean class="com.utils.SpringContextUtils">
<property name="lazyLoadBeans">
<list>
<value>orderDeliveryConfirmConsumer</value>
<value>updateWeightConsumer</value>
<value>orderDeliveryForAliyunDeliveryConsumer</value>
<value>cartonRecommendConsumer</value>
</list>
</property>
</bean>
<!-- 注意延时加载的Bean,设置懒加载lazy-init="true" -->
<bean id="orderDeliveryForAliyunDeliveryConsumer" class="com.OrderDeliveryForAliyunDeliveryConsumer" lazy-init="true">
<constructor-arg name="topic">
<value>1</value>
</constructor-arg>
</bean>