2009-08-18 34 views
13

Hiện nay thẻ jsp 2.0 của tôi rằng cần đậu mùa xuân sử dụng mã này:Làm thế nào để tiêm đậu mùa xuân vào một JSP 2.0 SimpleTag?

ac = WebApplicationContextUtils.getWebApplicationContext(servletContext); 
ac.getBeansOfType(MyRequestedClass.class); 

Các tôi chỉ nhận được đậu phù hợp đầu tiên.

Mã này hoạt động tốt, nhưng có nhược điểm không mong muốn mà tôi dành khoảng một nửa thời gian hiển thị trang tìm kiếm đậu mùa xuân, vì điều này xảy ra mỗi khi thẻ được gọi. Tôi đã suy nghĩ có thể đưa đậu vào phạm vi ứng dụng hoặc ít nhất là phạm vi phiên. Nhưng cách xử lý vấn đề này thực sự là cách thông minh nhất?

+0

'[http://stackoverflow.com/questions/3445908/is-there- một thanh lịch-cách-để-tiêm-một-mùa xuân-quản lý-đậu-thành-một-java-tùy-đơn giản] [1] 'có một câu trả lời tốt cho việc này. [1]: http://stackoverflow.com/questions/3445908/is-there-an-elegant-way-to-inject-a-spring-managed-bean-into-a-java- tùy chỉnh đơn giản – Angus

Trả lời

11

Suy nghĩ đầu tiên của tôi là, bạn có chắc chắn các cuộc gọi đến mùa xuân là tốn kém? Công cụ này được tối ưu hóa khá nhiều, do đó hãy chắc chắn rằng đó thực sự là một vấn đề trước khi cố gắng tối ưu hóa nó.

Giả sử nó được một vấn đề, sau đó một sự thay thế là exposeContextBeansAsAttributesexposedContextBeanNames thuộc tính của InternalResourceViewResolver. Bạn có thể sử dụng một hoặc khác (nhưng không phải cả hai) để lộ một số hoặc tất cả các bean của bạn như là các thuộc tính JSP.

Điều này làm tăng khả năng thực sự đưa đậu Xuân vào các lớp thẻ của bạn. Ví dụ, trong bối cảnh mùa xuân của bạn, bạn có thể có:

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
    <property name="exposeContextBeansAsAttributes" value="true"/> 
</bean> 

<bean id="myBean" class="com.x.MyClass"/> 

JSP của bạn:

<MyTag thing="${myBean}"/> 

SO nếu MyTag định nghĩa một thuộc tính thing loại MyClass, đậu myBean mùa xuân nên được tiêm như một JSP bình thường thuộc tính.

+0

Có, chúng tương đối đắt tiền. Đặc biệt là vì các thẻ được sử dụng trong các vòng lặp. Chúng tôi đang nói về 1-200 cuộc gọi đến logic nói trên bằng cách sử dụng 60-70% thời gian thực hiện của tôi. Phần còn lại của mã là sạch sẽ và thanh lịch. – krosenvold

8

Cách đơn giản hơn là sử dụng chú thích @Configurable trên lớp thẻ của bạn, điều này sẽ làm cho Spring tự động giới hạn các phụ thuộc khi thẻ được khởi tạo. Bất kỳ phụ thuộc bắt buộc nào cũng có thể được gắn thẻ với chú thích @AutoWired và Spring sẽ nối dây phụ thuộc ngay cả khi thẻ không được khởi tạo trong vùng chứa Spring.

+0

Bạn có thể mở rộng không? Cảm ơn –

5

Cách khác để đạt được điều này là sử dụng thuộc tính tĩnh để giữ phụ thuộc. Cũng giống như dưới đây:

public class InjectedTag extends SimpleTagSupport { 
//In order to hold the injected service, we have to declare it as static 
    private static AService _service; 
/***/ 
@Override 
public void doTag() throws IOException {  
      getJspContext().getOut(). 
      write("Service injected: " + _service + "<br />");  
} 
public void setService(AService service) { 
     _service = service;  
} 
} 

Trong bạn ApplicationContext, bạn phải đăng ký cả hai để thẻ JSP có thể nhận được một cơ hội để được khởi xướng bởi mùa xuân. Chúng ta Tới với sự kỳ diệu ...

<bean id="aService" class="com.foo.AService"> 
    <!-- configure the service. --> 
</bean> 
<bean class="com.foo.InjectedTag" > 
    <property name="service"><ref local="aService"/></property> 
</bean> 

mát huh, bây giờ aService có thể nhìn thấy trong thẻ JSP của chúng tôi :)

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