ApplicationContext初始化方式
系统创建ApplicationContext
容器时,默认就会初始化所有的Bean
,注意这里默认初始化得到的Bean
都是单例。在一开始就全部加载Bean
开销较大,但是由于是单例,之后使用就能够快速得到Bean
。BeanFactory
不会预初始化容器中所有的Bean
,它得到的Bean
也是单例。
如果不希望Spring
容器一开始就初始化某一个Bean
,可以在<bean ../>
元素指定lazy-init="true"
,这样只有在需要用到该类时,才初始化。
ApplicationContext事件机制
-
ApplicationEvent
: 容器事件,必须由ApplicationContext
发布。 -
ApplicationListener
: 监听器,可由容器中的任何监听器Bean
担任。
事件可以由ApplicationContext
的publishEvent()
方法发送容器事件,监听器会自动监听。
例子:
事件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
监听器成功获取到了发布的事件内容。