项目中遇到一个场景:在定时任务中(非@EnableScheduling),需要调用其他bean。
解决方案:
1)创建一个bean实现ApplicationContextAware接口;
2)该bean在系统启动时,会将上下文ApplicationContext注入;
3)ApplicationContext注入后,将其赋值给该bean的一个静态属性;
4)外部调用查找bean时,直接使用静态方法,从静态属性中获取对应的bean。
废话少说,上代码:
package ***;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
@Slf4j
@Component
public class SpringUtil implements ApplicationContextAware {
private static ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
setApplication(applicationContext);
}
private static void setApplication(ApplicationContext applicationContext) {
if (SpringUtil.applicationContext == null) {
SpringUtil.applicationContext = applicationContext;
}
log.info("ApplicationContext配置成功, applicationContext对象: " + SpringUtil.applicationContext);
}
public static ApplicationContext getApplicationContext() {
return applicationContext;
}
public static Object getBean(String name) {
return getApplicationContext().getBean(name);
}
public static <T> T getBean(Class<T> clazz) {
return getApplicationContext().getBean(clazz);
}
public static <T> T getBean(String name, Class<T> clazz) {
return getApplicationContext().getBean(name, clazz);
}
}
注意,需将该bean放置到Spring扫描路径下。
使用示例:
CentralizedManageCtlService centralizedManageCtlService = SpringUtil.getBean(CentralizedManageCtlService.class);