<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                # Spring – 應用事件 > 原文: [https://howtodoinjava.com/spring-core/how-to-publish-and-listen-application-events-in-spring/](https://howtodoinjava.com/spring-core/how-to-publish-and-listen-application-events-in-spring/) 了解在 Spring 應用程序中創建基于[發布者-訂閱者](https://howtodoinjava.com/jms/jms-publish-subscribe-message-example/)的事件。 Spring 創建應用程序事件,發布它們然后在事件處理器中監聽提供了內置支持。 要創建/監聽應用程序事件,需要遵循一些簡單的準則: 1. **事件**應該擴展`ApplicationEvent` 2. **發布者**應該注入`ApplicationEventPublisher`對象 3. **監聽器**應該實現`ApplicationListener`接口 ## 1\. 為什么是 Spring 事件 有時在 Spring 應用程序中,您可能需要**添加用于監聽特定應用程序事件**的功能,以便可以根據應用程序邏輯處理這些事件。 這些事件的示例可以是添加/刪除員工時; 或某種事務完成或回滾。 您始終可以將事件處理代碼編寫為現有應用程序代碼中的另一種方法,但是它會與您現有的代碼緊密結合,并且您以后將沒有太多處理方法來更改它(假設您不想為這些事件處理這些事件)。 一定的時間)。 如果可以通過應用程序上下文文件**配置事件處理器**,則在大多數情況下,您無需更改應用程序代碼以及事件處理器代碼。 任何時候您需要關閉事件處理; 或者,您想要為該事件添加另一個事件處理器,那么只需更改上下文文件的配置即可。 聽起來不錯 !! 在基于 Spring 事件的通信模型中,**發送方組件僅發布事件,而不知道誰將是**。 實際上,**可能有多個接收器組件**。 同樣,接收者也不必知道誰在發布事件。 **監聽器可以同時監聽來自不同發送者的多個事件。 這樣,發送方和接收方組件松散耦合。** 讓我們學習,**如何在您的 Spring 應用程序**中實現此發布和監聽事件。 ## 2\. 發布和監聽 Spring 應用程序事件 #### 2.1. 創建自定義應用程序事件類 所有事件類都必須擴展`ApplicationEvent`類。 `EmployeeEvent.java` ```java public class EmployeeEvent extends ApplicationEvent { private static final long serialVersionUID = 1L; private String eventType; private EmployeeDTO employee; //Constructor's first parameter must be source public EmployeeEvent(Object source, String eventType, EmployeeDTO employee) { //Calling this super class constructor is necessary super(source); this.eventType = eventType; this.employee = employee; } public String getEventType() { return eventType; } public EmployeeDTO getEmployee() { return employee; } } ``` #### 2.2. 發布者 – 實現`ApplicationEventPublisherAware`接口 任何實現`ApplicationEventPublisherAware`接口的 bean,都可以使用其`publishEvent()`方法將事件發送給監聽器。 `EmployeeManagerImpl.java` ```java @Service ("employeeManager") public class EmployeeManagerImpl implements EmployeeManager, ApplicationEventPublisherAware { @Autowired private EmployeeDAO dao; private ApplicationEventPublisher publisher; //You must override this method; It will give you acces to ApplicationEventPublisher public void setApplicationEventPublisher(ApplicationEventPublisher publisher) { this.publisher = publisher; } public EmployeeDTO createNewEmployee() { EmployeeDTO employee = dao.createNewEmployee(); //publishing the veent here publisher.publishEvent(new EmployeeEvent(this, "ADD", employee)); return employee; } } ``` #### 2.3. 訂閱者/監聽器 – 實現`ApplicationListener`接口 為了使 bean 監聽某些事件,它必須實現`ApplicationListener`接口并以`onApplicationEvent()`方法處理事件。 實際上,Spring 會將所有事件通知給監聽器,因此您必須自己過濾事件。 如果使用泛型,Spring 將僅傳遞與泛型類型參數匹配的消息。 在此示例中,我使用泛型代碼僅監聽`EmployeeEvent`。 `UserEventsProcessor.java` ```java public class UserEventsProcessor implements ApplicationListener<EmployeeEvent> { public void onApplicationEvent(EmployeeEvent event) { EmployeeEvent employeeEvent = (EmployeeEvent) event; System.out.println("Employee " + employeeEvent.getEventType() + " with details : " + employeeEvent.getEmployee()); // Do more processing as per application logic } } ``` #### 2.4. 在應用程序上下文文件中配置 Bean `applicationContext.xml` ```java <context:component-scan base-package="com.howtodoinjava.demo" /> <bean class="com.howtodoinjava.demo.processors.UserEventsProcessor" /> ``` #### 2.5. 示例 `TestSpringContext.java` ```java public class TestSpringContext { @SuppressWarnings("resource") public static void main(String[] args) throws Exception { ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); EmployeeController controller = context.getBean(EmployeeController.class); controller.createNewEmployee(); } } ``` 觀察輸出。 `Console` ```java INFO: Loading XML bean definitions from class path resource [applicationContext.xml] Employee ADD with details : Employee [id=1, firstName=Lokesh, lastName=Gupta, type=null] ``` 很棒。 我們現在可以收聽事件,然后可以按照自己的方式進行處理。 > 請注意,應用程序上下文本身還會發布容器事件,例如`ContextClosedEvent`,`ContextRefreshedEvent`和`RequestHandledEvent`。 如果您的任何 bean 希望收到這些事件的通知,則可以實現`ApplicationListener`接口。 ## 3\. 本示例中使用的其他類文件 這里的`EmployeeDTO`類如下所示: `EmployeeDTO.java` ```java public class EmployeeDTO { private Integer id; private String firstName; private String lastName; private String designation; public EmployeeDTO(String designation) { this.id = -1; this.firstName = "dummy"; this.lastName = "dummy"; this.designation = designation; } public EmployeeDTO() { // TODO Auto-generated constructor stub } //Setters and Getters @Override public String toString() { return "Employee [id=" + id + ", firstName=" + firstName + ", lastName=" + lastName + ", type=" + designation + "]"; } } ``` `EmployeeDAO.java` ```java public interface EmployeeDAO { public EmployeeDTO createNewEmployee(); } ``` `EmployeeDAOImpl.java` ```java @Repository ("employeeDao") public class EmployeeDAOImpl implements EmployeeDAO { public EmployeeDTO createNewEmployee() { EmployeeDTO e = new EmployeeDTO(); e.setId(1); e.setFirstName("Lokesh"); e.setLastName("Gupta"); return e; } public void initBean() { System.out.println("Init Bean for : EmployeeDAOImpl"); } public void destroyBean() { System.out.println("Init Bean for : EmployeeDAOImpl"); } } ``` `EmployeeManager.java` ```java public interface EmployeeManager { public EmployeeDTO createNewEmployee(); } ``` 學習愉快!
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看