2011-01-03 21 views
9

Chúng tôi đã quyết định sử dụng Dependency Injection với các chú thích JSR-330 cho các nỗ lực mô đun hóa tương lai của chúng tôi, và đã rất hài lòng với lần phát hàng đầu tiên dựa trên Guice 2 SVN. Bây giờ chúng ta cần đảm bảo và tài liệu thông qua các bài kiểm tra đơn vị mà chúng ta cần, cũng làm việc trong Spring khi được cấu hình theo chương trình (chúng tôi muốn hỗ trợ tái cấu trúc tương tự như với Guice do đó không có tệp XML). Tôi có vấn đề với @Provider@Inject @Named("foo") String nhưng tôi đã thực hiện đồng bằng @Inject làm việc với:Làm cách nào để định cấu hình JSR-330 @Provider và @Inject @Named ("foo") Chuỗi ** lập trình ** trong Spring?

ApplicationContext ctx = new AnnotationConfigApplicationContext(LIBL_Object.class, 
                   CORE_Provider.class); 
this.object = ctx.getBean(LIBL_Object.class); 

nơi LIBL_Object là lớp cơ sở để được tiêm vào, nhưng CORE_Provider không đăng ký như tôi hy vọng trong mùa xuân.

Việc thực hiện CORE_Provider là

package qa.jsr330.core; 

import javax.inject.Provider; 

public class CORE_Provider implements Provider<ProvidedInterface> { 
    @Override 
    public ProvidedInterface get() { 
     return new CORE_Provided(); 
    } 
} 

và tôi muốn nó tiêm vào

package qa.jsr330.core; 

import javax.inject.Inject; 

public class LIBL_Object { 

    private ProvidedInterface provided; 

    public ProvidedInterface getProvided() { 
     return provided; 
    } 

    @Inject 
    public void setProvided(ProvidedInterface provided) { 
     this.provided = provided; 
    } 
// Other stuff omitted. 
} 

Ngoài ra chúng tôi đã phát hiện ra rằng chúng ta có thể vượt qua giá trị cấu hình rất rõ ràng bằng cách sử dụng thẻ @Named. Mã này trông giống như:

String hostname; 
@Inject 
public void setHostname(@Named("as400.hostname") String hostname) { 
    this.hostname = hostname; 
} 

nơi thì chúng ta có thể đăng ký chuỗi này với Guice sử dụng

bindConstant().annotatedWith(Names.named("as400.hostname")).to(value); 

Vì vậy, hai câu hỏi là:

  • Làm thế nào để đăng ký lớp @Provider với mùa xuân 3 theo chương trình?
  • Làm cách nào để đăng ký chuỗi liên tục với Spring 3 để @Named chọn đúng cách?

Trả lời

5

Câu trả lời ngắn gọn là: không có cấu hình nào như cấu hình có lập trình của Spring.

Mặc dù cả Spring và Guice đều hỗ trợ JSR-330 API và Spring có thể được cấu hình mà không có XML ngay bây giờ, ý thức hệ của chúng vẫn rất khác nhau. Spring dựa vào cấu hình tĩnh, dưới dạng các tệp tin XML hoặc các lớp Java có chú thích. Do đó, nỗ lực đơn giản để điều chỉnh cấu hình kiểu Guice thành Spring có thể gây khó khăn.

Về vấn đề với Provider - Mùa xuân không hỗ trợ javax.inject.Provider trong cùng một cách như toProvider() ràng buộc trong Guice (bằng cách này, việc sử dụng này Provider không được xác định trong JSR-330 tài liệu). Do đó, có thể cần một số chú thích cụ thể theo mùa xuân, ví dụ:

@Configuration 
public class CORE_Provider implements Provider<ProvidedInterface> { 
     @Override @Bean 
     public ProvidedInterface get() { 
      return new CORE_Provided(); 
     } 
} 

Giá trị ràng buộc đến từ bên ngoài có thể khó do tính chất tĩnh của cấu hình Spring. Ví dụ: trong trường hợp của bạn, bạn có thể thực hiện như sau:

AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(); 
ctx.register(IBL_Object.class); 
ctx.register(CORE_Provider.class); 
ctx.registerBeanDefinition("as400.hostname", 
    BeanDefinitionBuilder.rootBeanDefinition(String.class) 
     .addConstructorArgValue(value).getBeanDefinition()); 
ctx.refresh(); 
+1

Cảm ơn bạn! Các "as400.hostname" tiêm công trình - đó là tuyệt vời - nhưng CORE_Provider subclass tôi đã viết với các chú thích bạn đề nghị, không được chọn (nhưng tôi có thể đăng ký một thể hiện của giao diện, mà sau đó được tiêm). Tôi nhận được "Không phù hợp với loại đậu ..." ngoại lệ từ mùa xuân. Tôi bị thiếu bụi pixie nào? –

+0

> không có thứ gì như cấu hình có lập trình của Spring ... Tôi không chắc chắn ý bạn là gì bởi "programmatic", nhưng mã ví dụ của bạn nơi bạn cấu hình AnnotationConfigApplicationContext từ Java có vẻ lập trình cho tôi? –

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