监听器模式复习
/**
* 事件
*/
public abstract class WeatherEvent {
public abstract String getWeather();
}
/**
* 监听器
*/
public interface WeatherListener {
void onWeatherEvent(WeatherEvent event);
}
/**
* 广播器
*/
public interface EventMulticaster {
void MulticastEvent(WeatherEvent event);
void addListener(WeatherListener weatherListener);
void removeLister(WeatherListener weatherListener);
}
@Component
public abstract class AbstractEventMulticaster implements EventMulticaster{
@Autowired
private List<WeatherListener> list;
@Override
public void MulticastEvent(WeatherEvent event) {
doStart();
list.forEach(e->e.onWeatherEvent(event));
doEnd();
}
protected abstract void doEnd();
protected abstract void doStart();
@Override
public void addListener(WeatherListener weatherListener) {
list.add(weatherListener);
}
@Override
public void removeLister(WeatherListener weatherListener) {
list.remove(weatherListener);
}
}
public class SnowEvent extends WeatherEvent {
@Override
public String getWeather() {
return "Snow";
}
}
@Component
public class SnowListener implements WeatherListener {
@Override
public void onWeatherEvent(WeatherEvent event) {
if (event instanceof SnowEvent){
System.out.println(event.getWeather());
}
}
}
@Component
public class WeatherRunListener {
@Autowired
private WeatherEventMulticaster eventMulticaster;
public void snow(){
eventMulticaster.MulticastEvent(new SnowEvent());
}
public void rain(){
eventMulticaster.MulticastEvent(new RainEvent());
}
}
main测试
public class Test {
public static void main(String...args){
WeatherEventMulticaster eventMulticaster = new WeatherEventMulticaster();
RainListener rainListener = new RainListener();
SnowListener snowListener = new SnowListener();
eventMulticaster.addListener(rainListener);
eventMulticaster.addListener(snowListener);
eventMulticaster.MulticastEvent(new RainEvent());
eventMulticaster.MulticastEvent(new SnowEvent());
eventMulticaster.removeLister(rainListener);
eventMulticaster.MulticastEvent(new RainEvent());
eventMulticaster.MulticastEvent(new SnowEvent());
//---start---
//Rain
//---end---
//---start---
//Snow
//---end---
//---start---
//---end---
//---start---
//Snow
//---end---
}
}
springboot测试
@SpringBootTest
class SpringBootDemoApplicationTests {
@Test
void contextLoads() {
}
@Autowired
private WeatherRunListener weatherRunListener;
@Test
void testEvent(){
weatherRunListener.rain();
weatherRunListener.snow();
}
}
自定义ApplicationListener监听器两种方式
import org.springframework.boot.context.event.ApplicationStartedEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.core.annotation.Order;
@Order
public class FirstApplicationListener implements ApplicationListener<ApplicationStartedEvent> {
@Override
public void onApplicationEvent(ApplicationStartedEvent event) {
System.out.println("FirstApplicationListener");
}
}
import org.springframework.boot.context.event.ApplicationPreparedEvent;
import org.springframework.boot.context.event.ApplicationStartedEvent;
import org.springframework.context.ApplicationEvent;
import org.springframework.context.event.SmartApplicationListener;
import org.springframework.core.annotation.Order;
@Order
public class SecondApplicationListener implements SmartApplicationListener {
@Override
public boolean supportsEventType(Class<? extends ApplicationEvent> eventType) {
return ApplicationStartedEvent.class.isAssignableFrom(eventType)|| ApplicationPreparedEvent.class.isAssignableFrom(eventType);
}
@Override
public void onApplicationEvent(ApplicationEvent event) {
System.out.println("SecondApplicationListener");
}
}
# Application Listeners
org.springframework.context.ApplicationListener=\
cn.fly.springbootdemo.listener.FirstApplicationListener
application.properties
context.listener.classes=cn.fly.springbootdemo.listener.SecondApplicationListener