事件定義
創建一個自定義事件類 UserLoginEvent
,繼承 ApplicationEvent
,用于攜帶用戶登錄信息:
import org.springframework.context.ApplicationEvent;public class UserLoginEvent extends ApplicationEvent { //關鍵點1:extends ApplicationEventprivate String username;public UserLoginEvent(Object source, String username) {super(source);this.username = username;}public String getUsername() {return username;}
}
事件發布
在用戶登錄邏輯中發布事件,例如在 LoginService
中:
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.stereotype.Service;@Service
public class LoginService {private final ApplicationEventPublisher eventPublisher;public LoginService(ApplicationEventPublisher eventPublisher) {this.eventPublisher = eventPublisher;}public void login(String username) {// 模擬登錄邏輯System.out.println("用戶登錄成功: " + username);// 關鍵點2:事件的發布,就一行代碼eventPublisher.publishEvent(new UserLoginEvent(this, username));}
}
事件監聽
通過 @EventListener
注解實現監聽,記錄日志:
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;@Component
public class UserLoginEventListener {@EventListenerpublic void handleUserLoginEvent(UserLoginEvent event) {//關鍵點3:這里意味著監聽某個類型的事件System.out.println("[日志] 用戶登錄事件觸發: " + event.getUsername());}
}
測試驗證
編寫測試類或控制器調用登錄方法:
@RestController
public class LoginController {private final LoginService loginService;public LoginController(LoginService loginService) {this.loginService = loginService;}@GetMapping("/login")public String login(@RequestParam String username) {loginService.login(username);return "Login triggered for: " + username;}
}
訪問 http://localhost:8080/login?username=testUser
,控制臺將輸出:
用戶登錄成功: testUser
[日志] 用戶登錄事件觸發: testUser
關鍵說明
- 默認同步執行,若需異步處理可在監聽方法上添加
@Async
注解