1.定义一个接口(具体的逻辑实现)
public interface SpringFrameLoaded {
void postSpringLoaded();
/**
* 这个操作是否必须正常完成
*
* @return 是否必须
*/
default boolean required()
{
return true;
}
}
2.实现 InitializingBean, ApplicationContextAware, DisposableBean
/**
*
* spring工具类,可以通过这个工具类获得bean
* 同时实现了InitializingBean接口,可以在spring将bean初始化完毕后执行一些事情
*
*/
@Component("springBeanUtils")
public class SpringBeanUtils implements InitializingBean, ApplicationContextAware, DisposableBean
{
public static ApplicationContext applicationContext = null;
@SuppressWarnings("unchecked")
public static <T> T getBean(String beanName)
{
isInjected();
return (T) applicationContext.getBean(beanName);
}
public static <T> T getBean(Class<T> requiredType)
{
isInjected();
return applicationContext.getBean(requiredType);
}
public static <T> Map<String, T> getBeansOfType(Class<T> type)
{
isInjected();
return applicationContext.getBeansOfType(type);
}
@Override
public void destroy() throws Exception
{
SpringBeanUtils.applicationContext = null;
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException
{
SpringBeanUtils.applicationContext = applicationContext;
}
/**
* 判断是否注入
*
* @return
*/
public static void isInjected()
{
if (SpringBeanUtils.applicationContext == null)
{
throw new RuntimeException("springUtils applicationContext is not injected!");
}
}
/**
* spring框架加载完毕后的处理
*/
@Override
public void afterPropertiesSet() throws Exception
{
Map<String, SpringFrameLoaded> map = getBeansOfType(SpringFrameLoaded.class);
map.forEach((key, value) ->
{
try
{
value.postSpringLoaded();
}
catch (Exception e)
{
e.printStackTrace();
if (value.required())
{
throw new RuntimeException("无法正常处理对象【" + value + "】的SpringFrameLoaded事件!");
}
}
});
}
}
3.具体的Spring框架加载完之后需要做的事
@Service("initFlowPic")
public class InitFlowPic implements SpringFrameLoaded {
private Logger logger = LoggerFactory.getLogger(getClass());
@Override
public void postSpringLoaded() {
logger.info("开始。。。。。。。。。");
}
}