基于事件也是一种解耦的方式,这里简单写了个demo:
1.创建ApplicatonEvent的实现类
public class MyApplicationEvent extends ApplicationEvent {
/**
* Create a new {@code ApplicationEvent}.
*
* @param source the object on which the event initially occurred or with
* which the event is associated (never {@code null})
*/
public MyApplicationEvent(Object source) {
super(source);
}
}
2.创建事件发送方类
@Component
@Slf4j
public class UserListener {
@Autowired
private ApplicationEventPublisher applicationEventPublisher;
private String username;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public void register(){
log.info("UserListener!!!");
username = "xiaochen";
//发布事件
applicationEventPublisher.publishEvent(new MyApplicationEvent(this));
}
}
3.创建事件接收类
@Component
@Slf4j
public class PersonListener {
@EventListener
public void test1(MyApplicationEvent myApplicationEvent){
log.info("PersonListener!!!");
UserListener userListener = (UserListener) myApplicationEvent.getSource();
String username = userListener.getUsername();
log.info(username);
}
}
4.测试
@SpringBootApplication
public class AppStart {
public static void main(String[] args) {
ConfigurableApplicationContext context = SpringApplication.run(AppStart.class, args);
new Thread(()->{
for (int i = 0;i < 3;i++){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
context.getBean(UserListener.class).register();
}
}).start();
}
}
输出结果如下: