用一个demo辅助理解spring的事件机制


前言

网上介绍spring事件机制的文章很多,非常难入门和理解。今天我们使用纯 Java 来手动实现一个类似于 Spring 事件机制的简单示例。这将帮助你理解其背后的观察者模式和发布-订阅机制的工作原理。
以下是一个简单的例子,展示如何用纯 Java 实现一个基本的事件发布和监听系统。

一、 定义事件类

首先,我们定义一个简单的事件类。这个类相当于 Spring 中的 ApplicationEvent

class MyEvent {
    private final String message;

    public MyEvent(String message) {
        this.message = message;
    }

    public String getMessage() {
        return message;
    }
}

二、 定义事件监听器接口

接下来,我们定义一个事件监听器接口。所有监听器都要实现这个接口,相当于 Spring 中的 ApplicationListener

interface MyEventListener {
    void onEvent(MyEvent event);
}

三. 定义事件发布者类

然后,我们定义一个事件发布者类,用来管理监听器并发布事件。

import java.util.ArrayList;
import java.util.List;

class MyEventPublisher {
    private final List<MyEventListener> listeners = new ArrayList<>();

    // 注册监听器
    public void addListener(MyEventListener listener) {
        listeners.add(listener);
    }

    // 发布事件
    public void publishEvent(MyEvent event) {
        for (MyEventListener listener : listeners) {
            listener.onEvent(event);  // 通知所有监听器
        }
    }
}

四、 实现具体的监听器

接下来,实现几个具体的监听器,它们将对事件做出响应。

class MyEventListenerImpl implements MyEventListener {
    private final String name;

    public MyEventListenerImpl(String name) {
        this.name = name;
    }

    @Override
    public void onEvent(MyEvent event) {
        System.out.println(name + " received event with message: " + event.getMessage());
    }
}

五、 将所有部件结合起来

最后,在主程序中注册监听器,并发布事件。

public class EventDemo {
    public static void main(String[] args) {
        // 创建事件发布者
        MyEventPublisher publisher = new MyEventPublisher();

        // 注册几个监听器
        publisher.addListener(new MyEventListenerImpl("Listener 1"));
        publisher.addListener(new MyEventListenerImpl("Listener 2"));

        // 发布事件
        MyEvent event = new MyEvent("Hello, Event!");
        publisher.publishEvent(event);
    }
}

六、 运行结果

运行这段代码时,你将看到每个监听器都接收并处理了事件:

Listener 1 received event with message: Hello, Event!
Listener 2 received event with message: Hello, Event!

总结

通过这个简单的纯 Java 示例,我们实现了一个基本的事件发布和监听系统。这与 Spring Boot 的事件机制有相似之处,但 Spring 的实现更为复杂和强大,提供了同步/异步处理、事件过滤、排序等高级功能。

这个例子展示了观察者模式的基本用法,也让你了解了 Spring Boot 事件机制的底层原理。如果你对这个模式有更多的想法或问题,欢迎评论区留言

  • 7
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
很抱歉,作为AI语言模型,我无法在本地环境上运行代码,但是我可以为您提供一个简单的Spring Security的demo代码: 1. 添加依赖 ``` <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> ``` 2. 配置Spring Security ``` @Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Autowired public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { auth.inMemoryAuthentication() .withUser("user").password("password").roles("USER") .and() .withUser("admin").password("password").roles("USER", "ADMIN"); } @Override protected void configure(HttpSecurity http) throws Exception { http .authorizeRequests() .antMatchers("/admin/**").hasRole("ADMIN") .anyRequest().authenticated() .and() .formLogin() .loginPage("/login") .permitAll() .and() .logout() .logoutUrl("/logout") .permitAll(); } } ``` 3. 创建Controller ``` @Controller public class HomeController { @RequestMapping("/") public String home() { return "home"; } @RequestMapping("/admin") public String admin() { return "admin"; } @RequestMapping("/login") public String login() { return "login"; } } ``` 4. 创建视图 ``` <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Home Page</title> </head> <body> <h1>Welcome to the home page</h1> <p><a href="/admin">Admin Page</a></p> </body> </html> ``` ``` <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Admin Page</title> </head> <body> <h1>Welcome to the admin page</h1> <p><a href="/">Home Page</a></p> </body> </html> ``` ``` <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Login Page</title> </head> <body> <h1>Login</h1> <form method="post" action="/login"> <label for="username">Username:</label> <input type="text" id="username" name="username" required autofocus/> <br/> <label for="password">Password:</label> <input type="password" id="password" name="password" required/> <br/> <button type="submit">Login</button> </form> </body> </html> ``` 以上代码是一个简单的Spring Security的demo,通过配置和代码实现了基本的认证和授权功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值