Event事件:
import org.springframework.context.ApplicationEvent;
public class TestEvent extends ApplicationEvent {
public TestEvent(Object source) {
super(source);
}
}
文章目录
一、向ApplicationContext中添加监听器
public class TestListener1 implements ApplicationListener<TestEvent> {
Logger logger = LoggerFactory.getLogger(TestListener1.class);
@Override
public void onApplicationEvent(TestEvent event) {
logger.info(String.format("%s 监听到事件源:%s.", TestListener1.class.getName(), event.getSource()));
}
}
要点是spring上下文中加入监听器
@SpringBootApplication
public class Application {
public static void main(String[] args) {
ConfigurableApplicationContext context = SpringApplication.run(Application.class,args);
//装载监听
context.addApplicationListener(new TestListener1());
context.publishEvent(new TestEvent("启动时作出如下动作!"));
}
}
二、将监听器作为组件交给spring容器管理
要点:@Component声明
@Component
public class TestListener2 implements ApplicationListener<TestEvent> {
Logger logger = LoggerFactory.getLogger(TestListener2.class);
@Override
public void onApplicationEvent(TestEvent event) {
logger.info(String.format("%s 监听到事件源:%s.", TestListener2.class.getName(), event.getSource()));
}
}
@SpringBootApplication
public class Application {
public static void main(String[] args) {
ConfigurableApplicationContext context = SpringApplication.run(Application.class,args);
context.publishEvent(new TestEvent("启动时作出如下动作!"));
}
三、在application.properties中配置监听器context.listener.classes
public class TestListener3 implements ApplicationListener<TestEvent> {
Logger logger = LoggerFactory.getLogger(TestListener3.class);
@Override
public void onApplicationEvent(TestEvent event) {
logger.info(String.format("%s 监听到事件源:%s.", TestListener3.class.getName(), event.getSource()));
}
}
@SpringBootApplication
public class Application {
public static void main(String[] args) {
ConfigurableApplicationContext context = SpringApplication.run(Application.class,args);
context.publishEvent(new TestEvent("启动时作出如下动作!"));
}
这种方式有个问题:测试时监听器会执行2遍。
四、通过@EventListener注解实现事件监听
@Component
public class TestListener4 {
Logger logger = LoggerFactory.getLogger(TestListener4.class);
@EventListener
public void onApplicationEvent(TestEvent event) {
logger.info(String.format("%s 监听到事件源:%s.", TestListener4.class.getName(), event.getSource()));
}
}
@SpringBootApplication
public class Application {
public static void main(String[] args) {
ConfigurableApplicationContext context = SpringApplication.run(Application.class,args);
context.publishEvent(new TestEvent("启动时作出如下动作!"));
}
五、配置spring.factories
public class TestListener5 implements ApplicationListener<TestEvent> {
Logger logger = LoggerFactory.getLogger(TestListener5.class);
@Override
public void onApplicationEvent(TestEvent event) {
logger.info(String.format("%s 监听到事件源:%s.", TestListener5.class.getName(), event.getSource()));
}
}
@SpringBootApplication
public class Application {
public static void main(String[] args) {
ConfigurableApplicationContext context = SpringApplication.run(Application.class,args);
context.publishEvent(new TestEvent("启动时作出如下动作!"));
}
六、通过实现接口org.springframework.context.ApplicationContextInitializer,得到context后通过编程式,设置监听器
public class TestListener6 implements ApplicationListener<TestEvent> , ApplicationContextInitializer {
Logger logger = LoggerFactory.getLogger(TestListener6.class);
@Override
public void onApplicationEvent(TestEvent event) {
logger.info(String.format("%s 监听到事件源:%s.", TestListener6.class.getName(), event.getSource()));
}
@Override
public void initialize(ConfigurableApplicationContext applicationContext) {
applicationContext.addApplicationListener(new TestListener6());
}
}
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication springApplication = new SpringApplication(Application.class);
springApplication.addInitializers(new TestListener6());
ConfigurableApplicationContext context = springApplication.run(args);
//发布事件
context.publishEvent(new TestEvent("启动时作出如下动作!"));
}
}
七、测试运行结果
统一运行:
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication springApplication = new SpringApplication(Application.class);
springApplication.addInitializers(new TestListener6());
ConfigurableApplicationContext context = springApplication.run(args);
//装载监听
context.addApplicationListener(new TestListener1());
//发布事件
context.publishEvent(new TestEvent("启动时作出如下动作!"));
}
}