1. Введение
JavaНекоторая логика в разработке такова, после завершения операции А продолжаем операцию Б, и продолжаем операцию С. Это описание кажется немного неясным. Например, вы ужинаете, уведомляете свою жену (подругу), чтобы она собрала посуду, а затем уведомляете своих онлайн-братьев, чтобы они сказали им, что вы вернулись и готовы открыть халтуру. Неважно, придет ваша жена (подруга) или нет, вы все равно ей сказали. Что касается вашего брата, вы также сообщаете им, что они не обязательно вас подставляют, на случай, если они развлекаются с боссом-керри один-к-трем.
2. Концепция событий
Ужин – это так называемое событие. Следующие две операции являются триггерными, и они имеют только причинно-следственную связь. Но они не мешают друг другу и идут своим путем. Полное мероприятие состоит изПоиск событий, публикация событий, мониторинг событийсочинение. Далее мы говоримSpringсобытия в .
3. События весны
SpringВ фреймворке используется большое количество механизмов событий, таких какSpring BootНачало. Для удобства создаем новыйSpring Bootпроект. Затем следуйте за мной шаг за шагом, чтобы управлять событием.
3.1 Объявление событий
- Объявите событие. по наследству
org.springframework.context.ApplicationEvent
написать событие. Определите метод, который будет выполняться, когда событие будет передано слушателю вовремя.Конечно, вы также можете написать логику триггера в слушателе. Сделаем заявление:
package cn.felord.boot.event;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.ApplicationEvent;
import org.springframework.context.ApplicationListener;
/**
* 吃饭事件
*
* @author dax
* @since 2019 /7/8 21:54
*/
@Slf4j
public class EatEvent extends ApplicationEvent {
private Boolean eatFinished;
/**
* Instantiates a new Eat event.
*
* @param eatFinished 吃饭是否完成的信号 这里也可以传递其他资源
*/
public EatEvent(Boolean eatFinished) {
super(eatFinished);
this.eatFinished = eatFinished;
}
/**
* 这里会由对应监听器{@link ApplicationListener<EatEvent>} 执行
*
* 叫女友收拾碗筷.
*/
public void callGirlFriend() {
log.info("亲爱的! 我吃完饭了,来收拾收拾吧");
}
/**
* 这里会由对应监听器{@link ApplicationListener<EatEvent>} 执行
* 呼叫兄弟开黑.
*/
public void callBrothers() {
log.info("兄弟们! 我吃完饭了,带我开黑");
}
/**
* 吃晚饭的信号.
*
* @return the boolean
*/
public Boolean isEatFinished() {
return this.eatFinished;
}
}
3.2 Релиз события
Публикуйте события, реализуя интерфейс публикации событийorg.springframework.context.ApplicationEventPublisher
или его фасадный интерфейсorg.springframework.context.ApplicationEventPublisherAware
, рекомендуемый фасадный интерфейс, в котором метод активной отправки событий должен быть определен следующим образом.refreshEvent
метод, фактический проксиApplicationEventPublisher
выполнять своюpublishEvent
метод:
package cn.felord.boot.event;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.ApplicationEvent;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.context.ApplicationEventPublisherAware;
/**
* 发布事件 发布事件通过实现 事件发布接口 {@link ApplicationEventPublisher}
* 或者通过门面接口{@link ApplicationEventPublisherAware}
* 推荐按照下面的实现方式,而且该类需要注册为spring bean
*
* @author dax
* @since 2019 /7/8 22:04
*/
@Slf4j
public class EatEventPublisherAware implements ApplicationEventPublisherAware {
private ApplicationEventPublisher applicationEventPublisher;
private ApplicationEvent eatEvent;
public EatEventPublisherAware(ApplicationEvent eatEvent) {
this.eatEvent = eatEvent;
}
@Override
public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {
this.applicationEventPublisher = applicationEventPublisher;
}
/**
* 发送事件动作 事件的动作需要主动触发 调用此方法进行事件触发
* 代理{@link ApplicationEventPublisher#publishEvent(ApplicationEvent)}
*/
public void refreshEvent() {
log.info("发送事件中……");
this.applicationEventPublisher.publishEvent(eatEvent);
}
}
3.3 Мониторинг событий
Слушатели событий используются для прослушивания событий для запуска соответствующей логики. путем реализацииorg.springframework.context.ApplicationListener<E extends ApplicationEvent>
для наблюдения за событиями. Обратите особое внимание на общий E, если вы не укажете событие, вы можете получить любое событие и попытаться иметь одну ответственность.
package cn.felord.boot.event;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.ApplicationListener;
/**
* {@link EatEvent}事件的专属事件监听器
* @author dax
* @since 2019/7/8 22:11
*/
@Slf4j
public class EatEventListener implements ApplicationListener<EatEvent> {
@Override
public void onApplicationEvent(EatEvent eatEvent) {
//如果吃完饭了
if (eatEvent.isEatFinished()) {
eatEvent.callGirlFriend();
log.error("来自母老虎的咆哮:滚犊子");
eatEvent.callBrothers();
log.error("太晚了,我们已经满了,明天带你");
log.info("还是关注一下 【码农小胖哥】 学习点新知识吧");
}
}
}
3.4 Внедрение Spring IoC
Внедрить вышеперечисленные три классаSpring
контейнер, здесь мы используемJavaConfigобразом, это выглядит более очевидным.
package cn.felord.boot.config;
import cn.felord.boot.event.EatEvent;
import cn.felord.boot.event.EatEventListener;
import cn.felord.boot.event.EatEventPublisherAware;
import org.springframework.context.ApplicationEvent;
import org.springframework.context.ApplicationEventPublisherAware;
import org.springframework.context.ApplicationListener;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* 这三个一定要配置成bean
*
* @author dax
* @since 2019/7/8 22:16
*/
@Configuration
public class EventConfig {
@Bean
public ApplicationEvent eatEvent() {
return new EatEvent(true);
}
@Bean
public ApplicationListener eatEventListener() {
return new EatEventListener();
}
@Bean
public ApplicationEventPublisherAware eatEventPublisherAware(ApplicationEvent eatEvent) {
return new EatEventPublisherAware(eatEvent);
}
}
4. Тест
Здесь все готово, так как его использовать, выполните метод публикации издателя событий.refreshEvent
Вот и все, прослушиватель событий автоматически отреагирует на событие. Давайте напишем модульный тест.
package cn.felord.boot;
import cn.felord.boot.event.EatEventPublisherAware;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import javax.annotation.Resource;
@RunWith(SpringRunner.class)
@SpringBootTest
public class EventSpringApplicationTests {
@Resource
private EatEventPublisherAware eatEventPublisherAware;
@Test
public void contextLoads() {
eatEventPublisherAware.refreshEvent();
}
}
Запустите его, введите изображение
К настоящему времени вы должны научиться использоватьSpringСобытие закончилось, и код, написанный таким образом, стал более мощным. Вы можете обналичить деньги?SpringНекоторое понимание фреймворка. Конечно, есть более простой способ, основанный на аннотациях, который здесь описываться не будет. Соответствующий код находится в моемОблачное хранилище кода
关注公众号:Felordcn获取更多资讯