2013-07-04 32 views
8

Bây giờ trực tiếp đến quan điểm của tôi,Làm thế nào để khởi tạo ứng dụng vào mùa xuân?

Trong JSP tôi sẽ làm quá trình khởi tạo các ứng dụng của tôi như thế nào,

<%! public void jsp_init(){ 

     //Initialise the domain server to create protocol 
     //Create the logging file 
}%> 

Bây giờ tôi đang đi để xây dựng lại ứng dụng trước đây của tôi Servlets-Spring 3.2.

Tôi làm cách nào để thực hiện điều này với Spring 3.2?

Một trong số colleague của tôi cho biết tôi làm điều này initialization with Constructor of the Spring Controller.

Vì tôi đã tạo bean cho controller class trong applicationContext.xml và tôi đang tải tệp applicationContext.xml withe ContextLoadListner trong web.xml.

Đây có phải là cách khởi tạo đúng không?

Còn khoảng ApplicationListener vào mùa xuân?

Cách tốt nhất để khởi tạo ứng dụng ở số spring 3.2 là gì?

Hy vọng người dùng ngăn xếp của chúng tôi sẽ đưa ra giải pháp tốt.

Trả lời

8

mùa xuân sẽ làm rất nhiều điều này cho bạn nếu cấu hình đúng. Nếu bạn thực sự cần thực thi mã (so với sử dụng thứ gì đó sẽ tự động định cấu hình giống như Log4J), tôi khuyên bạn nên đăng ký InitializingBean và ghi đè afterPropertiesSet. Sau đó bạn sẽ thêm nét đậu này vào file applicationContext.xml:

<bean id="initializer" class="com.myproject.MyInitializer" /> 

Kết quả là, mùa xuân sẽ gọi phương thức khi ứng dụng đã được khởi tạo đầy đủ. Bạn có thể sử dụng chú thích @PostConstruct trên một bean đã được đăng ký với ngữ cảnh ứng dụng, nhưng không đảm bảo phần còn lại của ứng dụng sẽ được khởi tạo khi phương thức đó được gọi. Nếu bạn muốn nó chạy khi mọi thứ đã được thiết lập, phương thức khởi tạo Bean là cách để đi.Tôi đã sử dụng chiến lược này để bắt đầu một ổ cắm máy chủ, vv cần thiết để chạy độc lập với vòng đời yêu cầu web.

+0

cảm ơn cho reply.wat của bạn về ý kiến ​​của bạn với câu trả lời. http://stackoverflow.com/questions/8686507/how-to-add-a-hook-to-the-application-context-initialization-event –

+0

@KitePlayer Điều đó cũng có hiệu quả. Nó phụ thuộc vào việc bạn cần được thông báo về nhiều loại sự kiện ứng dụng hay chỉ là khởi động. –

+0

Tôi cần phải làm một số nhiệm vụ, chỉ một lần sau khi tomcat của tôi bắt đầu ... cách tốt nhất cho việc này là gì? –

0

Bạn có thể làm điều này bằng cách có một bean với @PostConstruct và tiêm trong servlet-config của bạn vào mùa xuân. Hãy xem mã here và một trong các dòng ở dưới cùng.

<beans:bean id="PlayerImportDaoImpl" 
     class="com.footieview.app.importer.dao.PlayerImportDaoImpl" /> 

Điều này sẽ chèn hạt này khi khởi động phương thức trên bean này có chú thích @PostConstruct - điều này có nghĩa là khi khởi động phương thức này được gọi.

6

Tại sao bạn tự khởi tạo ứng dụng mùa xuân? Mùa xuân sẽ làm tự động cho bạn: Đây là cách bạn nói với máy chủ của bạn để khởi tạo mùa xuân:

<context-param> 
    <param-name>contextConfigLocation</param-name> 
    <param-value>/WEB-INF/app.xml</param-value> 
    </context-param> 

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

Điều này sẽ xảy ra trong tất cả các deploymentand đậu được định nghĩa sẽ được khởi tạo (tùy thuộc vào sự lười biếng). Nếu bạn thực sự muốn làm điều gì đó một lần đậu được khởi tạo, trước khi sử dụng sau đó sử dụng InitializingBean Ví dụ sẽ là

MyBean implements InitializingBean{ 
    afterPropertiesSet() { 

     //do here 
    } 

} 
+0

Nó có thể không phải là một ý tưởng tốt để khởi tạo ứng dụng thông qua 'ContextLoaderListener'. Tốt hơn là cấu hình 'DispatcherServlet' của bạn và ủy nhiệm các tác vụ cụ thể thông qua' ContextLoaderListener' chỉ khi bạn cần bối cảnh. –

+0

Tại sao ý tưởng tồi? Spring framework chính nó đi kèm với người nghe này và khuyên bạn nên sử dụng nó để tải nó. 'DispatcherServlet' là cho mvc và mvc nhỏ hơn 10% của chính khung công tác, nếu tôi không muốn sử dụng mvc thì sao? – Elbek

2

ContextLoaderListener là loại bootstrapper để khởi động Spring WebApplicationContext trong khi ApplicationListener có nhiều mức độ ứng dụng java hơn là ở ngữ cảnh ứng dụng web.

ContextLoaderListener là một công cụ tuyệt vời và tiêu chuẩn để bối cảnh hóa ứng dụng của bạn nếu nó có nhiều bộ lọc servlet/servlet được ánh xạ tới các dịch vụ khác nhau trên DispatcherServlet hoặc. Về cơ bản, nó rất tiện lợi để có người nghe cho các servlet khác nhau của các ứng dụng như vậy để bạn có thể có ngữ cảnh chi tiết.

Tôi không biết bản chất của ứng dụng bạn đang xây dựng nhưng tôi cho rằng bạn đang cố gắng một cái gì đó cơ bản cho bây giờ. Nếu đây là trường hợp, và ngay cả trong trường hợp bạn có một thiết lập phức tạp hơn, tốt hơn là tải khi khởi động một bộ điều khiển mà sẽ chăm sóc các thói quen khởi tạo chính của bạn bao gồm bối cảnh hóa của bạn. Bạn có thể dùng đậu khiển mà bạn có với một cái gì đó như thế này trong web.xml của bạn:

<servlet> 
    <servlet-name>your-servlet</servlet-name> 
    <servlet-class> 
     org.springframework.web.servlet.DispatcherServlet 
    </servlet-class> 
    <load-on-startup>1</load-on-startup> 
</servlet> 

servelt này cũng có thể được ánh xạ và gọi bất cứ khi nào bạn đọc một mẫu url nhất định Ví dụ:

@RequestMapping("/welcome")   
    public ModelAndView helloWorld() 

Và trong deployment descriptor web, bit này cũng giống như bạn ánh xạ servlets của bạn với các dịch vụ khác như mùa xuân Xuân An:

<servlet-mapping> 
    <servlet-name>crunchify</servlet-name> 
    <url-pattern>*.html</url-pattern> 
</servlet-mapping> 

Vì vậy, bạn không thực sự cần phải sử dụng các nhà xây dựng của bộ điều khiển và bạn cũng không cần phải sử dụng ContextLoaderListener hoặc các trình nghe khác cho các tác vụ khởi tạo đơn giản. Tuy nhiên, thật dễ dàng để tìm hiểu trường hợp sử dụng của họ vì bạn sẽ cần nó khi mở rộng ứng dụng của bạn.

Đọc thêm về servlet phối ở đây:

http://static.springsource.org/spring/docs/3.2.x/javadoc-api/org/springframework/web/servlet/DispatcherServlet.html

+0

nếu anh ta không muốn sử dụng mvc, nhưng anh ta muốn tải mùa xuân? – Elbek

+0

Ông nói rằng ông đã thực hiện một bộ điều khiển và có lẽ hầu hết đã đi theo cách mvc rồi. Xem thêm chi tiết về vấn đề này tại đây [link] (http://syntx.co/languages-frameworks/difference-between-loading-context-via-dispatcherservlet-and-contextloaderlistener/): "Đó là cách tốt nhất để giữ một sự tách biệt rõ ràng giữa các dịch vụ trung cấp như các thành phần logic nghiệp vụ và các lớp truy cập dữ liệu (thường được định nghĩa trong ApplicationContext) và các thành phần liên quan đến web chẳng hạn như bộ điều khiển và phân giải xem (được định nghĩa trong WebApplicationContext trên mỗi Servatcher). " –

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