2013-07-16 27 views
5

Trong ứng dụng kế thừa rất lớn, tôi có giao diện và lớp học làm không triển khai các giao diện đó.Mùa xuân: Ủy quyền cho trình bao bọc proxy tùy chỉnh cho giao diện tiêm

Giao diện được tạo dựa trên lớp sao cho chữ ký giống nhau (ngoại trừ giao diện thêm một ngoại lệ khác lên trên) và tên giống nhau (do đó dễ tìm tên lớp từ tên giao diện).

Để thực hiện giao diện, chúng tôi thực hiện một loạt các cuộc gọi xử lý và ghi nhật ký nhưng về cơ bản hãy sử dụng java.lang.reflect.Proxy để ủy quyền cho lớp học. Đơn giản hóa nó trông như thế này:

// This will create a proxy and invoke handler that calls HelloWorld.doSomething 
HelloWorldInterface i = MyProxyUtil.getInstance(HelloWorldInterface.class); 
i.doSomething(); 

public interface HelloWorldInterface { 
    public void doSomething() throws Exception; 
} 

public class HelloWorld { 
    public void doSomething() { 
    //something 
    } 
} 

Có thể với chế biến mùa xuân chú thích, để quát @Autowire tất cả các lĩnh vực loại *Interface và có sử dụng lò xo MyProxyUtil.getInstance(*Interface.class) để tiêm thực hiện?

như vậy mà

@Autowire HelloWorldInterface a; 

HelloWorldInterface b = MyProxyUtil.getInstance(HelloWorldInterface.class); 

@Autowire AnotherInterface c; 

AnotherInterface d = MyProxyUtil.getInstance(AnotherInterface.class); 


a == b 
c == d 

Trả lời

9

Có, bạn cần triển khai AutowireCandidateResolver.

Ví dụ:

public class ProxyAutowiredCandidateResolver extends SimpleAutowireCandidateResolver { 

    @Override 
    public Object getSuggestedValue(DependencyDescriptor descriptor) { 
     String dependencyClassName = descriptor.getDependencyType().getSimpleName(); 
     if (dependencyClassName.endsWith("Interface")) { 
      return MyProxyUtil.getInstance(descriptor.getDependencyType()); 
     } 

     return super.getSuggestedValue(descriptor); 
    } 

} 

Bạn có thể sử dụng một BeanFactoryPostProcessor để cấu hình nó trong bối cảnh ứng dụng:

public class AutowireCandidateResolverConfigurer implements BeanFactoryPostProcessor { 

    private AutowireCandidateResolver autowireCandidateResolver; 

    public void postProcessBeanFactory(
      ConfigurableListableBeanFactory beanFactory) throws BeansException { 
     DefaultListableBeanFactory bf = (DefaultListableBeanFactory) beanFactory; 
     bf.setAutowireCandidateResolver(autowireCandidateResolver); 


    } 

    public AutowireCandidateResolver getAutowireCandidateResolver() { 
     return autowireCandidateResolver; 
    } 

    public void setAutowireCandidateResolver(

      AutowireCandidateResolver autowireCandidateResolver) { 
     this.autowireCandidateResolver = autowireCandidateResolver; 
    } 

} 

<bean id="autowireCandidateResolverConfigurer" class="AutowireCandidateResolverConfigurer"> 
     <property name="autowireCandidateResolver"> 
      <bean class="ProxyAutowiredCandidateResolver" /> 
     </property> 
</bean> 
+0

Xin lỗi, tôi đang gặp khó khăn trong việc tìm ra cách bạn thực sự định cấu hình để sử dụng? Tôi sẽ thêm gì vào applicationContext.xml của mình? –

+0

@casenelson bạn có thể sử dụng một 'BeanFactoryPostprocessor' để cấu hình' AutowireCandidateResolver' –

+0

Có vấn đề với việc tiêm Môi trường với giải pháp của bạn -> https: // github.com/mariuszs/env-is-null – MariuszS

1

Nếu tôi đọc sách này một cách chính xác, bạn sẽ có thể xác định chúng trong một lớp JavaConfig @Configuration chú thích và sau đó sử dụng chúng ở những nơi khác.

Từ các tài liệu (Spring):

@Configuration 
public class AppConfig { 
    @Bean 
    public MyService myService() { 
     return new MyServiceImpl(); 
    } 
} 

Bạn có thể làm điều gì đó tương tự:

@Configuration 
public class InterfaceConfig { 
    @Bean 
    public HelloWorldInterface helloWorldInterface() { 
     return MyProxyUtil.getInstance(HelloWorldInterface.class); 
    } 
} 

Vào thời điểm đó, mùa xuân sẽ sử dụng định nghĩa bất cứ khi nào đậu đó là cần thiết.

Bạn phải liên kết trong lớp @Configuration bằng cách nào đó (quét đường dẫn lớp, lập trình, v.v.), nhưng điều đó phụ thuộc vào cách bạn thiết lập ngữ cảnh ứng dụng của mình.

Tôi nghĩ điều này sẽ hiệu quả. Tôi đã sử dụng JavaConfig một chút, nhưng không bao giờ khá như thế này. Nhưng có vẻ hợp lý.

+0

Nó không thực sự thiết thực đối với tôi để xác định mỗi một trong những hạt cà phê trong cấu hình (Có hàng trăm). Thay vào đó, tôi đang tìm một cách để giải quyết tất cả các giao diện có tên kết thúc bằng Giao diện thông qua MyProxyUtil. –

+0

Tôi không bắt được phần đó. Nếu nó là tất cả các di sản, nó sẽ không khó để viết một kịch bản để tạo ra mã một lần duy nhất. Câu trả lời của Jose nghe có vẻ thú vị, tôi không quen với điều đó. Các proxy đã được quản lý mùa xuân chưa? Bạn đang cố gắng làm bất cứ điều gì với họ mà sẽ yêu cầu họ được mùa xuân quản lý nếu không? – Jafoy

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