2011-12-07 21 views
5

Có cách nào mùa xuân cụ thể trong khuôn khổ để thực hiện khởi tạo khi MVC tải lên không?Mùa xuân có cách tải lên mọi thứ khi ứng dụng tải lần đầu không? Ở cấp độ toàn cầu

Giả sử tôi cần tạo đối tượng chung dựa trên tệp cấu hình, có chỗ để làm điều này hay tôi chỉ cần tạo servlet của riêng mình và làm điều này trong oninit?

+0

Ba câu trả lời đầu tiên đều tốt và cung cấp các khía cạnh khác nhau của chương tham khảo này mà bạn nên đọc: http://static.springsource.org/spring/docs/current/spring-framework-reference/html/ beans.html # beans-factory-lifecycle –

Trả lời

5

Còn tiêu chuẩn @PostConstruct thì sao?

@Service 
class AnySpringBean { 

    @PostConstruct 
    public void init() { 
     //run when bean is created 
    } 

} 

Hoạt động trên @Controller cũng vậy.

UPDATE: Càng toàn cầu nơi sẽ được phân lớp ContextLoaderListener) và ghi đè contextInitialized() và sử dụng nó trong web.xml (xem user1076371answer). Tôi không thích cách tiếp cận này nhiều, nhưng ít nhất việc khởi tạo không gắn với bất kỳ bean Spring nào.

+0

Tôi đang tìm một địa điểm toàn cầu hơn, không cụ thể cho một bộ điều khiển thực sự, nhưng cho toàn bộ ứng dụng. – codecompleting

+0

@codecompleting: xem cập nhật của tôi –

+0

Hoặc tôi chỉ có thể làm điều này bằng tay sau đó bên ngoài của mùa xuân bằng cách sử dụng một bộ lọc phải không? một cái gì đó mà cháy trước khi điều khiển của tôi, là có thể? về khởi động ứng dụng? – codecompleting

0

Điều tốt nhất là để nó vào mùa xuân. Thêm các bean đối tượng toàn cục của bạn (có thể là các singletons, vv ..) vào ngữ cảnh ứng dụng của bạn. Đảm bảo Spring được khởi tạo khi ứng dụng được nạp bằng cách thêm ContextLoaderListener vào tệp tin web.xml.

<?xml version="1.0" encoding="UTF-8"?> 
<web-app version="2.4"> 

    <listener> 
     <listener-class> 
      org.springframework.web.context.ContextLoaderListener 
     </listener-class> 
    </listener> 

</web-app> 

Bạn có thể truy cập các đối tượng chung của mình từ WebApplicationContext ở bất kỳ đâu trong ứng dụng.

+0

vì vậy đề xuất của bạn giống như Chris? – codecompleting

+0

Đây là IMO đơn giản nhưng đơn giản hơn rất nhiều. Bạn không cần triển khai bất kỳ giao diện nào trong lớp hiện tại của mình. Hãy để chúng tôi nói rằng bạn muốn gọi một phương thức gọi là initializeSocketDaemon trong một lớp có tên là SocketMonitor, bạn sẽ thêm một bean như thế này . Với điều kiện bạn có người nghe như trên, Spring sẽ được tải lên khi khởi động ứng dụng web và lần lượt sẽ gọi phương thức này. – user1076371

4

Có giao diện ApplicationListener mà bạn có thể triển khai để móc vào sự kiện hoàn thành khởi động. Tôi sử dụng điều này trong ứng dụng của tôi để làm những việc sau khi tôi biết mùa xuân đã hoàn thành bắt đầu lên. Tôi có một vài lớp khác nhau mà tôi muốn khởi động các chủ đề nền sau khi hệ thống được "lên" và mỗi thực hiện giao diện này để làm công cụ khởi động cụ thể của họ.

Nó được gửi sau khi ứng dụng tổng thể được thực hiện, nhưng mỗi lần nghe lò xo nhận được sự kiện, vì vậy bạn có thể móc nó vào một số bean hiện có hoặc tạo một thứ như PostStartupBean chỉ tồn tại để thực hiện một phương pháp.

public void onApplicationEvent(ApplicationEvent applicationEvent) 
{ 
    if (applicationEvent instanceof ContextRefreshedEvent) 
    { 
     ..do stuff here.. 
    } 
} 
Các vấn đề liên quan