2016-10-07 17 views
13

Tôi đang cắm vào Spring vào ứng dụng web Java EE hiện có. Tôi có các dòng sau trong web.xml của tôi:Làm cho lò xo ServletContextListener nhận biết

<listener> 
    <listener-class>com.MyContextListener</listener-class> 
</listener> 

Và sau MyContextListener lớp?

public class MyContextListener implements ServletContextListener { 

    public void contextInitialized(ServletContextEvent event) { 
     //... 
    } 
} 

Tôi nên làm gì để thực hiện MyContextListener do Spring quản lý?


được sửa đổi:

giả định của tôi là: mùa xuân nên tạo mọi servlets và tất cả các cơ sở hạ tầng ứng dụng web để tất cả mọi thứ đã xảy ra trong contextInitialized phương pháp MyContextListener cần được xử lý bằng cách nào đó bởi Spring. Làm thế nào tôi có thể đạt được, bằng cách thực hiện một số giao diện tôi giả sử. Đúng nếu tôi đã sai lầm. Cảm ơn!

+0

Bạn có muốn đưa hạt đậu Xuân vào người nghe này không? –

+0

Tại sao bạn cần mùa xuân để nhận thức được người nghe này? Bạn có thể thêm thông tin về những gì bạn cần đạt được không? –

+0

Đây có phải là những gì bạn đang tìm kiếm không ?. http://stackoverflow.com/questions/8686507/how-to-add-a-hook-to-the-application-context-initialization-event thêm giao diện ApplicationListener và đăng ký một bean sẽ cho phép bạn xử lý vòng đời xuân. Sẽ rất tuyệt nếu bạn có thể cung cấp thêm một chút thông tin được đề cập về những gì bạn đang cố gắng đạt được. Hãy cho tôi biết –

Trả lời

4

Vâng,

Chúng tôi đã có một kịch bản tương tự cấu hình một thoát Jersey web ứng dụng các dịch vụ sử dụng Xuân cho dependency injection. Jersey webapp của chúng tôi đã mở rộng ContextLoaderListener như sau

public class XServletContextListener extends ContextLoaderListener { 
    ... 
    @Override 
    public void contextInitialized(ServletContextEvent arg0) { 
     super.contextInitialized(arg0); 
     .... 
    } 

    @Override 
    public void contextDestroyed(ServletContextEvent arg0) { 
     super.contextDestroyed(arg0); 
     .... 
    } 
} 

nơi ContextLoaderListener

import org.springframework.web.context.ContextLoaderListener; 

Chúng bao gồm các jersey xuân cầu với tất cả mùa xuân phụ thuộc bao gồm applicationContext. xml như sau

<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-4.0.xsd 
    http://www.springframework.org/schema/context 
    http://www.springframework.org/schema/context/spring-context-4.0.xsd"> 

    <context:component-scan base-package="com.xxx.*" /> 
    .... 
    .... 
</beans> 

Và rõ ràng là cần thiết để đảm bảo rằng XServletContextListener được bao gồm trong web.xml như sau

<context-param> 
    <param-name>contextConfigLocation</param-name> 
    <param-value>/WEB-INF/applicationContext.xml</param-value> 
</context-param> 
<listener> 
    <listener-class>com.xxx.**.XServletContextListener</listener-class> 
</listener> 

Tiếp theo là servletinit-param giá trị của nó và servlet ánh xạ. Bạn rõ ràng có thể áp dụng cấu hình chú thích thay cho ký tự xml trong trường hợp này bạn sẽ cần sử dụng chú thích WebListener.

Chúng tôi sử dụng một loạt các chú thích như

@Component for objects 
@Service for services 
@Repository for DAOs 
@Controller for controllers/resources 
@ContextConfiguration for tests 

Tất cả mọi thứ được nạp và autowired bởi Spring framework.

+0

tại sao bạn chọn 'áo'? OP đã không đề cập đến nó – Andrew

+0

Jersey chỉ là một lớp web, không có gì hơn (thay thế nó bằng spring-mvc như bạn ưa thích và nó sẽ không ảnh hưởng đến câu hỏi được hỏi). Dù sao, đây là một giải pháp tôi đã phát triển cho một trong những dự án của tôi đã sử dụng ** jersey ** và vì tôi đã tìm thấy giải pháp liên quan chặt chẽ đến câu hỏi đang được yêu cầu, do đó tôi đã chia sẻ nó ở đây.Giống như tôi đã nói, đề cập đến * áo * không có sự khác biệt – Raf

1

Chú thích nơi bạn tạo một phiên bản mới của MyContextListener với @Bean nếu sử dụng Java Configs with Spring Boot.

2

Hoặc chú thích các lớp học với @WebListener hoặc phương pháp với @Bean

5

Những gì tôi nên làm gì để làm cho MyContextListener được quản lý bởi Spring?

Tùy thuộc vào cách cấu hình bạn đang sử dụng. Dù sao, bạn nên nói trực tiếp với Spring để sử dụng lớp bạn đã khai báo. Điều đó có thể được thực hiện bằng cách sau:

@WebListener 
public class MyContextListener implements ServletContextListener { ... } 

Một lớp được đánh dấu bằng chú thích này (the Servlet 3.0 specification, 8.1.4) phải thực hiện một trong các giao diện

HttpSessionAttributeListener 
HttpSessionListener 
ServletContextAttributeListener 
ServletContextListener (+) 
ServletRequestAttributeListener 
ServletRequestListener 
HttpSessionIdListener 

mà nó thực hiện.

Cá nhân, tôi thích phương pháp tiếp cận dựa trên siêu chú thích giúp cấu hình của tôi ngắn hơn và ngắn gọn hơn.

Mùa xuân nên tạo tất cả servlet và tất cả cơ sở hạ tầng ứng dụng web để mọi thứ xảy ra theo phương pháp contextInitialized của MyContextListener sẽ được Spring xử lý bằng cách nào đó.

Có, Spring sẽ làm điều đó cho bạn nếu bạn cung cấp một số thông tin có thể giúp đăng ký/cấu hình/tạo/quản lý một cá thể.

Các thông tin có thể là meta-thông tin (một mẫu mà nói như thế nào để tạo ra một thể hiện, như BeanDefinition s) hoặc một ví dụ hoàn bản thân (thông thường, nó được thông qua theo chương trình đó, đến lượt nó, dẫn đến viết một số lượng lớn mã).

Tôi có thể đạt được như thế nào bằng cách triển khai một số giao diện mà tôi cho là.

Bạn đang thực hiện một giao diện để làm cho người nghe của bạn một người biết lắng nghe (một lớp mô tả các phương pháp cụ thể mà sẽ được gọi ở một số thời điểm). Bản thân Spring chịu trách nhiệm bảo đảm các cuộc gọi như vậy tại những điểm này thời gian, đặt một đối tượng trong cơ sở hạ tầng web hiện tại trước đây.

Các vấn đề liên quan