创建类
package com.byyl.web.frame;
public interface CallBack {
void executor();
default String getCallBackName() {
return "" + Thread.currentThread().getId() + ":" + Thread.currentThread().getId();
}
}
package com.byyl.web.frame;
import java.util.ArrayList;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.core.env.Environment;
public class SpringContextHolder implements ApplicationContextAware, DisposableBean {
private static final Logger log = LoggerFactory.getLogger(SpringContextHolder.class);
private static ApplicationContext applicationContext = null;
private static final List<CallBack> CALL_BACKS = new ArrayList<>();
private static boolean addCallback = true;
public static synchronized void addCallBacks(CallBack callBack) {
if (addCallback) {
CALL_BACKS.add(callBack);
} else {
log.warn("CallBack:{} 已无法添加!立即执行", callBack.getCallBackName());
callBack.executor();
}
}
public static <T> T getBean(String name) {
assertContextInjected();
return (T) applicationContext.getBean(name);
}
public static ApplicationContext getContext() {
assertContextInjected();
return applicationContext;
}
public static <T> T getBean(Class<T> requiredType) {
assertContextInjected();
return (T) applicationContext.getBean(requiredType);
}
public static <T> T getProperties(String property, T defaultValue, Class<T> requiredType) {
T result = defaultValue;
try {
result = (T) ((Environment) getBean(Environment.class)).getProperty(property, requiredType);
} catch (Exception exception) {
}
return result;
}
public static String getProperties(String property) {
return getProperties(property, null, String.class);
}
public static <T> T getProperties(String property, Class<T> requiredType) {
return getProperties(property, null, requiredType);
}
private static void assertContextInjected() {
if (applicationContext == null)
throw new IllegalStateException("applicaitonContext属性未注入, 请在applicationContext.xml中定义SpringContextHolder或在SpringBoot启动类中注册SpringContextHolder.");
}
private static void clearHolder() {
log.debug("清除SpringContextHolder中的ApplicationContext:" + applicationContext);
applicationContext = null;
}
public void destroy() {
clearHolder();
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
if (SpringContextHolder.applicationContext != null)
log.warn("SpringContextHolder中的ApplicationContext被覆盖, 原有ApplicationContext为:" + SpringContextHolder.applicationContext);
SpringContextHolder.applicationContext = applicationContext;
if (addCallback) {
for (CallBack callBack : CALL_BACKS)
callBack.executor();
CALL_BACKS.clear();
}
addCallback = false;
}
}
启动类增加注入
@Bean
public SpringContextHolder springContextHolder() {
return new SpringContextHolder();
}
使用
PayOrderService payOrderService = (PayOrderService) SpringContextHolder.getBean(PayOrderService.class);