前面提到,要让自定义注解生效,需要写一段驱动代码,那么驱动代码的启动执行方式是什么才合适呢?您可能知道答案:应用程序启动时。回到具体的代码实现,假设应用(客户端或服务端)依赖RPC框架,使用Spring环境,熟悉Spring的应该都知道,Spring会在启动时初始化bean,是否可以执行初始化bean后的驱动程序代码?答案是肯定的。查阅相关资料后,Spring监听器可以实现上述请求。Spring监听器监听器在使用过程中可以监听某些感兴趣的事件,当检测到事件时可以做出响应。Spring事件监听系统包括事件监听器、事件、事件广播器三个核心组件,如下图所示:提前在活动广播中注册。事件所有动作都可以定义为一个事件。事件发生后,事件广播者通知所有的监听器,监听器根据情况做出响应。Spring定义了一个事件基类:ApplicationEvent,看下源码:publicabstractclassApplicationEventextendsEventObject{/**事件发生的时间*/privatefinallongtimestamp;/***创建实例*@paramsource事件源*/publicApplicationEvent(Objectsource){super(source);this.timestamp=System.currentTimeMillis();}...省略其他代码}ApplicationEvent继承JDK定义的事件基类:EventObject,publicclassEventObjectimplementsjava.io.Serializable{/***最初发生Event的对象。*/protectedtransientObjectsource;...省略其他代码}ApplicationEvent是一个抽象类,如果需要自定义事件,需要继承这个类:publicclassMyEventextendsApplicationEvent{......省略其他代码}当然,Spring本身已经定义了很多events:ContextRefreshedEvent:这个事件在ApplicationContext初始化或刷新时发布。初始化意味着所有的Bean被成功加载,后处理Bean被检测和激活,所有的SingletonBeans被预实例化,ApplicationContext容器准备好使用了。ContextStartedEvent:此事件在ApplicationContext启动时发布。ContextStoppedEvent:此事件在ApplicationContext停止时发布。ContextClosedEvent:该事件在ApplicationContext关闭时发布。以上只是几个常用的Spring事件。根据上面分析的业务需求,我们希望所有的bean在初始化之后都开始执行自定义注解驱动代码,所以我们感兴趣的事件是ContextRefreshedEvent。看看源码:publicclassContextRefreshedEventextendsApplicationContextEvent{publicContextRefreshedEvent(ApplicationContext源){超级(源);}}看起来很简单,继承ApplicationContextEvent,继续追源码发现ApplicationContextEvent继承了我们上面说的ApplicationEvent。事件监听器所有的事件监听器都注册在事件广播器中,它就像观察者模式中的观察者。在Spring中,ApplicationListener是事件监听器的顶层接口,继承自JDK的EventListener,所有的监听器都必须实现这个接口。publicinterfaceApplicationListener
