spring 事件(Application Event)

spring 事件(Application Event)

spring 事件为bean 与 bean之间传递消息。一个bean处理完了希望其余一个接着处理.这时我们就需要其余的一个bean监听当前bean所发送的事件.

 

spring事件使用步骤如下:

1.先自定义事件:你的事件需要继承 ApplicationEvent

2.定义事件监听器: 需要实现 ApplicationListener

3.使用容器对事件进行发布

 

以下例子是场景是注册的时候发送邮件的一个场景:

先定义事件:

复制代码
package com.foreveross.service.weixin.test.springevent;

import org.springframework.context.ApplicationEvent;

/**
 * 自定义一个事件
 * @author mingge
 *
 */
public class DemoEvent extends ApplicationEvent{
    
    private String msg;
    
    private String email;

    public DemoEvent(Object source,String msg,String email) {
        super(source);
        this.msg=msg;
        this.email=email;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
    
}
复制代码

然后定义事件监听器:

复制代码
package com.foreveross.service.weixin.test.springevent;

import org.springframework.context.ApplicationListener;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;


/**
 * 定义一个事件监听类
 * @author mingge
 *
 */
@Component
public class DemoEventListener implements ApplicationListener<DemoEvent>{

    //使用注解@Async支持 这样不仅可以支持通过调用,也支持异步调用,非常的灵活,
    @Async
    @Override
    public void onApplicationEvent(DemoEvent event) {
        System.out.println("注册成功,发送确认邮件为:" + event.getEmail()+",消息摘要为:"+event.getMsg());  
    }

}
复制代码

再次使用容器对事件进行发布:

复制代码
package com.foreveross.service.weixin.test.springevent;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Component;

/**
 * 事件发布类
 * @author mingge
 *
 */
@Component
public class DemoEventPublisher {
    
    @Autowired
    private ApplicationContext applicationContext;
    
    public void pushlish(String msg,String mail){
        applicationContext.publishEvent(new DemoEvent(this, msg,mail));
    }
    
}
复制代码

最后就是测试了:

复制代码
package com.foreveross.service.weixin.test.springevent;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration
@ComponentScan("com.foreveross.service.weixin.test.springevent")
public class EventConfig {

}
复制代码
复制代码
package com.foreveross.service.weixin.test.springevent;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

/**
 * 事件测试类
 * @author mingge
 *
 */
public class EventTest {

    public static void main(String[] args) {
        AnnotationConfigApplicationContext context=new AnnotationConfigApplicationContext(EventConfig.class);
        DemoEventPublisher demoEventPublisher=context.getBean(DemoEventPublisher.class);
        demoEventPublisher.pushlish("张三1","565792147@qq.com");
        demoEventPublisher.pushlish("张三2","565792147@qq.com");
        demoEventPublisher.pushlish("张三3","565792147@qq.com");
        demoEventPublisher.pushlish("张三4","565792147@qq.com");
        demoEventPublisher.pushlish("张三5","565792147@qq.com");
        context.close();
    }
}
复制代码

 

参考:http://blog.csdn.net/it_man/article/details/8440737

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring事件机制和事务机制是两个不同的概念,但它们可以结合起来使用。 Spring事件机制是基于观察者模式实现的,可以让我们在应用程序中发布和监听事件。当某个事件被发布时,所有监听该事件的观察者都会接收到通知,并执行相应的逻辑。 在Spring中,我们可以使用@Transactional注解来开启事务。当一个方法被@Transactional注解修饰时,如果该方法执行过程中出现异常,则事务会回滚,保证数据的一致性。 当使用Spring事件机制和事务机制结合时,我们可以在事件监听器中进行数据库操作,并且使用@Transactional注解来保证数据库操作的一致性。具体实现方法如下: 1. 在需要发布事件的地方,使用ApplicationContext的publishEvent()方法来发布事件。 2. 在监听该事件的监听器中,使用@Transactional注解来保证数据库操作的一致性。 例如: ``` @Service public class UserService { @Autowired private ApplicationContext applicationContext; @Transactional public void addUser(User user) { // 添加用户到数据库 // 发布用户添加事件 applicationContext.publishEvent(new UserAddEvent(user)); } } @Component public class UserAddListener implements ApplicationListener<UserAddEvent> { @Autowired private UserRepository userRepository; @Override @Transactional public void onApplicationEvent(UserAddEvent event) { // 在事务中进行数据库操作 userRepository.save(event.getUser()); } } public class UserAddEvent extends ApplicationEvent { private User user; public UserAddEvent(User user) { super(user); this.user = user; } public User getUser() { return user; } } ``` 在上面的例子中,当调用UserService的addUser()方法时,会先将用户添加到数据库中,然后发布一个UserAddEvent事件。该事件被监听器UserAddListener监听到后,会在事务中将用户保存到数据库中。使用@Transactional注解来保证在事务中执行数据库操作,如果保存用户时出现异常,则事务会回滚,保证数据的一致性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值