2011-10-25 11 views
7

Sau đây là tình huống:Tải ngữ cảnh mùa xuân trong ứng dụng dựa trên EJB

Tôi có một lớp kinh doanh, đó là một dự án EJB. Trong thực tế, chỉ có một EJB được tạo ra. EJB này chịu trách nhiệm hiển thị các lớp dịch vụ cho các lớp khác, gọi EJB. Tôi muốn giới thiệu mùa xuân (để sử dụng tính năng DI) trong lớp này.

Quan tâm của tôi là, cách tốt nhất để tải ngữ cảnh mùa xuân trong lớp nghiệp vụ này là gì, để bối cảnh mùa xuân không được tải đi lặp lại, bất cứ khi nào EJB được gọi?

(Trong một dự án Web, có là một lợi thế chứ không phải để cấu hình bối cảnh mùa xuân trong contextLoaderListener, và nó được nạp một lần duy nhất khi ứng dụng được bắt đầu)

Tôi đã nghĩ đến việc bao gồm cả mùa xuân trong cùng lớp vì :

  1. Định cấu hình phụ thuộc của tất cả các lớp DAO và dịch vụ và tiêm chúng bất cứ khi nào cần thiết.
  2. Để sử dụng hỗ trợ mùa xuân cho ngủ đông trong lớp doanh nghiệp.
  3. Dễ kiểm tra đơn vị, bằng cách tiêm các thuộc tính vào các lớp và mô phỏng giống nhau. Không cần phải chạy các lớp khác một lần nữa và một lần nữa, để kiểm tra các lớp/phương thức kinh doanh của tôi.
  4. Để có thể sử dụng AOP (Lập trình hướng Aspect) cho Ghi nhật ký và kiểm tra mức phương thức.

Vui lòng giúp tôi đề xuất cách tốt nhất để tải ngữ cảnh mùa xuân trong dự án EJB. Tôi cũng muốn biết, nếu có bất kỳ lựa chọn thay thế nào nếu tôi có thể tải cùng một máy chủ ứng dụng (tôi đang sử dụng máy chủ ứng dụng Web sphere).

Cảm ơn và Kính trọng,

Jitendriya Dash

+0

EJB 3.1 không có khuôn khổ phun depencency riêng của nó, và CDI sẽ được tích hợp tốt hơn Tôi chỉ cần một DI nhẹ? – Ralph

Trả lời

0

Đánh dấu các EJB được như một Singleton (@Singleton). Và lưu trữ bối cảnh mùa xuân trong một biến trong bean này, sau khi nó được tạo ra một lần, để bạn có thể trả về cùng một bối cảnh lặp đi lặp lại.

2

Spring nên được định cấu hình như một phần của ứng dụng theo cách thông thường mà bạn luôn thiết lập. Sau đó, bạn cần truy cập các bean Spring từ lớp EJB. Để truy cập (chuyển thể from this post), tạo một bean mùa xuân như sau:

@Component 
public class SpringApplicationContext implements ApplicationContextAware { 
    private static ApplicationContext CONTEXT; 
    public void setApplicationContext(ApplicationContext context) throws BeansException { 
     CONTEXT = context; 
    } 
    public static Object getBean(String beanName) { 
     return CONTEXT.getBean(beanName); 
    } 
} 

Sau đó, để gọi đậu trong câu hỏi từ các ứng dụng kế thừa:

SomeService someService = (SomeService)SpringApplicationContext.getBean("someServiceImpl"); 

Bối cảnh mùa xuân được khởi tạo một lần, và bạn Lớp EJB có thể truy cập theo ý muốn.

2

Đối với EJB3, Spring khuyên bạn nên sử dụng EJB3 Injection Interceptor. Về cơ bản bạn xác định bối cảnh mùa xuân của bạn bằng cách sử dụng một ContextSingletonBeanFactoryLocator đòi hỏi phải tạo ngữ cảnh mùa xuân của bạn trong một beanContextRef.xml trong đường dẫn lớp của bạn. Có lẽ là một phần của EAR của bạn. SpringBeanAutowiringInterceptor đưa bean của bạn vào EJB của bạn.