Spring的核心是ApplicationContext,它负责管理beans的完整生命周期,当加载beans时,ApplicationContext发布某些类型的事件。例如,上下文启动时,ContextStartedEvent发布;当上下文停止时,ContextStoppedEvent发布。
Spring五种内置事件
1 | ContextRefreshedEvent | ApplicationContext 被初始化或刷新时,该事件被发布。这也可以在 ConfigurableApplicationContext 接口中使用 refresh() 方法来发生。 |
2 | ContextStartedEvent | 当使用 ConfigurableApplicationContext 接口中的 start() 方法启动 ApplicationContext 时,该事件被发布。你可以调查你的数据库,或者你可以在接受到这个事件后重启任何停止的应用程序。 |
3 | ContextStoppedEvent | 当使用 ConfigurableApplicationContext 接口中的 stop() 方法停止 ApplicationContext 时,发布这个事件。你可以在接受到这个事件后做必要的清理的工作。 |
4 | ContextClosedEvent | 当使用 ConfigurableApplicationContext 接口中的 close() 方法关闭 ApplicationContext 时,该事件被发布。一个已关闭的上下文到达生命周期末端;它不能被刷新或重启。 |
5 | RequestHandledEvent | 这是一个 web-specific 事件,告诉所有 bean HTTP 请求已经被服务。 |
监听上下文事件
为了监听上下文事件,一个bean应该实现ApplicationListener接口,重写onApplicationEvent()方法。
下面代码展示的是如何在项目启动的时候,发短信通知开发者
public class ApplicationRefreshListener implements ApplicationListener<ContextRefreshedEvent> {
Logger logger = LoggerFactory.getLogger(ApplicationRefreshListener.class);
@Autowired
SmsRepos smsRepos;
private String appName = "application";
private boolean notify = false;
private String environment;
public void setAppName(String appName) {
this.appName = appName;
}
public void setNotify(boolean notify) {
this.notify = notify;
}
public void setEnvironment(String environment) {
this.environment = environment;
}
@Override
public void onApplicationEvent(ContextRefreshedEvent event) {
if (notify) {
smsRepos.sendMsg(appName + "应用已启动,环境为" + environment + ", 日期:" + DateUtils.fullDateFormat(new Date()), "10086");
}
}
}
xml中配置
<bean class="com.damuzee.lisenter.ApplicationRefreshListener">
<property name="appName" value="app"/>
<property name="environment" value="dev"/>
<property name="notify" value="true"/>
</bean>