public class ServiceBean<T> extends ServiceConfig<T> implements InitializingBean, DisposableBean, ApplicationContextAware, ApplicationListener<ContextRefreshedEvent>, BeanNameAware { private static final long serialVersionUID = 213195494150089726L; private static transient ApplicationContext SPRING_CONTEXT; private final transient Service service; private transient ApplicationContext applicationContext; private transient String beanName; private transient boolean supportedApplicationListener;
spring 容器中經過@PostConstruct和@PreDestroy能夠對Bean進行初始化和銷燬;或者通InitializingBean和DisposableBean實現對Bean的初始化和銷燬。spring
這說明在spring初始化bean的時候,若是bean實現了InitializingBean接口,會自動調用afterPropertiesSet方法。app
public void afterPropertiesSet() throws Exception { if (getProvider() == null) {
進行了以上各類Model,Config的初始化。ide
核心方法爲:onApplicationEvent,監聽全部發送到ApplicationContext中到Event。this
public synchronized void export() { if (provider != null) { if (export == null) { export = provider.getExport(); } if (delay == null) { delay = provider.getDelay(); } } if (export != null && !export) { return; } if (delay != null && delay > 0) { delayExportExecutor.schedule(new Runnable() { public void run() { doExport(); } }, delay, TimeUnit.MILLISECONDS); } else { doExport(); } }
經過一個延遲線程池,對各類Config,Model進行初始化。線程
經過ApplicationContext能夠獲取Spring容器中的全部Bean,也能夠經過setApplicationContext獲取Spring上下文。code
public void setApplicationContext(ApplicationContext applicationContext) { this.applicationContext = applicationContext; SpringExtensionFactory.addApplicationContext(applicationContext); if (applicationContext != null) { SPRING_CONTEXT = applicationContext; try { Method method = applicationContext.getClass().getMethod("addApplicationListener", new Class<?>[]{ApplicationListener.class}); // backward compatibility to spring 2.0.1 method.invoke(applicationContext, new Object[]{this}); supportedApplicationListener = true; } catch (Throwable t) { if (applicationContext instanceof AbstractApplicationContext) { try { Method method = AbstractApplicationContext.class.getDeclaredMethod("addListener", new Class<?>[]{ApplicationListener.class}); // backward compatibility to spring 2.0.1 if (!method.isAccessible()) { method.setAccessible(true); } method.invoke(applicationContext, new Object[]{this}); supportedApplicationListener = true; } catch (Throwable t2) { } } } } }