就是对这一行代码进行分析,初始化事件派发器
initApplicationEventMulticaster();
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.12.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>5.2.12.RELEASE</version>
</dependency>
</dependencies>
通过实现ApplicationListener来监听,容器中发布的事件
/**
* ApplicationListener 监听容器中发布的事件,事件驱动模型开发
* 监听ApplicationEvent 及其子事件
*/
@Component
public class Sp implements ApplicationListener {
//容器发布事件之后 在这里监听
public void onApplicationEvent(ApplicationEvent applicationEvent) {
System.out.println("收到事件:"+applicationEvent);
}
}
//扫描包 使得 使用@Component注解生效
@ComponentScan("com.dmg")
@Configuration
public class TestConfig {
}
public class Test {
public static void main(String[] args) {
AnnotationConfigApplicationContext applicationContext=new AnnotationConfigApplicationContext(TestConfig.class);
}
}
当我们启动之后可以看到收到ContextRefreshedEvent事件
完成刷新事件,就是所有bean已经加载到容器了,bean已经创建好了,就触发这个事件
![](https://img-blog.csdnimg.cn/img_convert/930121811fc4b8fd0147efab089cde4a.png)
我们也可以自定义一个发布事件
public class Test {
public static void main(String[] args) {
AnnotationConfigApplicationContext applicationContext=new AnnotationConfigApplicationContext(TestConfig.class);
String msg="我是自定义事件";
applicationContext.publishEvent(new ApplicationEvent(msg) {
@Override
public Object getSource() {
return super.getSource();
}
});
}
}
![](https://img-blog.csdnimg.cn/img_convert/8f577cdae66f7129e9d1c1fb321fc145.png)
我们来看下源码,进入refresh方法,容器创建对象
![](https://img-blog.csdnimg.cn/img_convert/98fbdbcc23436de33a8a5be43a4aa00f.png)
进入initApplicationEventMulticaster方法,初始化事件多播器,派发器
![](https://img-blog.csdnimg.cn/img_convert/8b9de56070e61fb3fee295573f72a3bc.png)
从bean工厂中判断是否存在applicationEventMulticaster
如果存在直接获取
如果不存在,new一个简单的应用事件多播器,派发器,然后注册到容器单实例bean中
![](https://img-blog.csdnimg.cn/img_convert/d34a43a880ddbd61a9cec082eb6e44df.png)