1,非pring框架下的监听者设计。
1.1事件接口
public interface Observer {
void onChange(Object object,String message);
}
1.2事件注册
public class Subject {
//通知列表
private List<Observer> observers = new ArrayList<>();
// 注册观察者
public void registerObserver(Observer o) {
observers.add(o);
}
// 注销观察者
public void removeObserver(Observer o) {
observers.remove(o);
}
// 通知所有观察者
public void notifyObservers(Object object,String message) {
for (Observer observer : observers) {
observer.onChange(object,message);
}
}
}
1.3事件发布
public class Test implements Observer {
@Override
public void onChange(Object object, String message) {
}
}
public class Test1 implements Observer {
@Override
public void onChange(Object object, String message) {
}
}
public static void main(String[] args) {
Test1 test1 = new Test1();
Test test = new Test();
Subject subject = new Subject();
subject.registerObserver(test1);
subject.registerObserver(test);
subject.notifyObservers("55555","233231");
}
2,spring框架下的监听者设计(单机模式的时候,即非分布式项目)。
2.1事件注册,你希望监听的事件
import org.springframework.context.ApplicationEvent;
public class CustomEvent extends ApplicationEvent {
private String message;
public CustomEvent(Object source, String message) {
super(source);
this.message = message;
}
public String getMessage() {
return message;
}
}
2.2事件发布器
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.stereotype.Component;
@Component
public class EventPublisher {
private ApplicationEventPublisher publisher;
@Autowired
public EventPublisher(ApplicationEventPublisher publisher) {
this.publisher = publisher;
}
public void publishCustomEvent(Object event) {
publisher.publishEvent(event);
}
}
2.3事件发布
@Autowired
private EventPublisher eventPublisher;
//手动注入
//private EventPublisher eventPublisher = BeanTool.getBean(EventPublisher.class);
protected void ff(ChannelHandlerContext ctx, GDM.Message msg) throws Exception {
//。。。。其他逻辑
eventPublisher.publishCustomEvent(new CustomEvent("8888","4989"));
//。。。。其他逻辑
}
有时候@Autowired会出现注入失败null的情况,可以自己手动注入
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
@Component
public class BeanTool implements ApplicationContextAware {
protected static ApplicationContext applicationContext ;
@Override
public void setApplicationContext(ApplicationContext arg0) throws BeansException {
if (applicationContext == null) {
applicationContext = arg0;
}
}
public static Object getBean(String name) {
//name表示其他要注入的注解name名
return applicationContext.getBean(name);
}
/**
* 拿到ApplicationContext对象实例后就可以手动获取Bean的注入实例对象
*/
public static <T> T getBean(Class<T> clazz) {
return applicationContext.getBean(clazz);
}
}
2.4,事件监听
import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;
@Component
public class CustomEventListener implements ApplicationListener<CustomEvent> {
@Override
public void onApplicationEvent(CustomEvent event) {
System.out.println("============CustomEvent - " +event );
}
}
3,spring+分布式框架下,前面的两种都不太好使用了,推荐使用消息队列,制作监听者模式设计。
待续.....