Spring上下文ApplicationContext初始化Bean和事件

时间:2021-11-20 22:01:43

ApplicationContext初始化方式

系统创建ApplicationContext容器时,默认就会初始化所有的Bean,注意这里默认初始化得到的Bean都是单例。在一开始就全部加载Bean开销较大,但是由于是单例,之后使用就能够快速得到BeanBeanFactory不会预初始化容器中所有的Bean,它得到的Bean也是单例。

如果不希望Spring容器一开始就初始化某一个Bean,可以在<bean ../>元素指定lazy-init="true",这样只有在需要用到该类时,才初始化。


ApplicationContext事件机制

  1. ApplicationEvent: 容器事件,必须由ApplicationContext发布。
  2. ApplicationListener: 监听器,可由容器中的任何监听器Bean担任。
    事件可以由ApplicationContextpublishEvent()方法发送容器事件,监听器会自动监听。
    例子:
    事件EmailEvent类:
public class EmailEvent extends ApplicationEvent {

private String address;
private String text;

public EmailEvent(Object source) {
super(source);
}

public EmailEvent(Object source, String address, String text) {
super(source);
this.address = address;
this.text = text;
}
//...
}

监听器EmailNotifier类:

public class EmailNotifier implements ApplicationListener {
//容器发生事件时,自动触发该方法
@Override
public void onApplicationEvent(ApplicationEvent event) {
//判断是说明什么事件
if(event instanceof EmailEvent) {
EmailEvent emailEvent = (EmailEvent) event;
System.out.println("需要发送的邮件地址: " + emailEvent.getText());
System.out.println("邮件正文: " + emailEvent.getText());
} else {
System.out.println("其它事件");
}
}
}

将监听器写到配置文件中:

    <!-- 事件的监听器 -->
<bean class="Event.EmailNotifier"/>

测试代码:

        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
EmailEvent emailEvent = new EmailEvent("test", "sweatott@gmail.com", "this is a test");
context.publishEvent(emailEvent);

控制台信息:

其它事件
需要发送的邮件地址: this is a test
邮件正文: this is a test

监听器成功获取到了发布的事件内容。