2012-03-13 22 views
12

Tôi muốn tạo ra phương pháp sản xuất đậu của một mùa xuân đó là ý thức người gọi nó, vì vậy tôi đã bắt đầu với đoạn mã sau:Tương đương với Spring DI của InjectionPoint của CDI là gì?

@Configuration 
public class LoggerProvider { 

    @Bean 
    @Scope("prototype") 
    public Logger produceLogger() { 
     // get known WHAT bean/component invoked this producer 
     Class<?> clazz = ... 

     return LoggerFactory.getLogger(clazz); 
    } 
} 

Làm thế nào tôi có thể nhận được thông tin người muốn để có được những hạt đậu tiêm?

Tôi đang tìm một số tương đương với CDI's InjectionPoint trong thế giới mùa xuân.

Trả lời

6

Theo như tôi biết, Spring không có khái niệm như vậy.

Sau đó, chỉ điều có ý thức về điểm được xử lý là BeanPostProcessor.


Ví dụ:

@Target(PARAMETER) 
@Retention(RUNTIME) 
@Documented 
public @interface Logger {} 

public class LoggerInjectBeanPostProcessor implements BeanPostProcessor { 
    public Logger produceLogger() { 
     // get known WHAT bean/component invoked this producer 
     Class<?> clazz = ...  
     return LoggerFactory.getLogger(clazz); 
    } 


    @Override 
    public Object postProcessBeforeInitialization(final Object bean, 
      final String beanName) throws BeansException { 
     return bean; 
    } 

    @Override 
    public Object postProcessAfterInitialization(final Object bean, 
      final String beanName) throws BeansException { 

     ReflectionUtils.doWithFields(bean.getClass(), 
       new FieldCallback() { 
        @Override 
        public void doWith(final Field field) throws IllegalArgumentException, IllegalAccessException { 
         field.set(bean, produceLogger()); 
        } 
       }, 
       new ReflectionUtils.FieldFilter() { 
        @Override 
        public boolean matches(final Field field) { 
          return field.getAnnotation(Logger.class) != null; 
        } 
       }); 

     return bean; 
    } 
} 
+0

Cảm ơn Ralph! Ok, do đó, BeanPostProcessor' này được gọi bất cứ khi nào bất kỳ bean nào được tiêm vào bất cứ đâu. Có cách nào tôi có thể nhận ra ** những gì ** đậu là để được tiêm? Tôi có nghĩa là tôi đã nhận: 'postProcessBeforeInitialization (Object bean, String beanName)' trong đó 'bean' là một bean muốn tiêm được tạo (phần ** người ** mà tôi đã hỏi trong câu hỏi của tôi), và' beanName 'là tên' bean'. Bây giờ tôi không biết những gì lĩnh vực trong 'bean' muốn tiêm được thực hiện - nói cách khác tôi không biết nếu đậu tiêm là 'LoggerProvider' hoặc cái gì khác. –

+0

Là giá vé như tôi hiểu, bộ xử lý bài được gọi là afer một bean được tạo ra! (không tiêm bất cứ nơi nào). Ý tưởng là để thực hiện khuôn khổ tiêm nhỏ của riêng bạn trên đầu trang của Bean Post Processor. – Ralph

+0

Ok, vì vậy trình cài đặt 'BeanPostProcessor' sẽ được gọi bất cứ khi nào một bean được tạo ra. Vì vậy, ý tưởng của bạn là triển khai 'postProcessBeforeInitialization' và ví dụ: quét cho các trường có chú thích tùy chỉnh của tôi (giả sử '@ Logger') và, thông qua sự phản chiếu, khởi tạo trường như vậy bằng cách sử dụng logic tùy chỉnh của riêng tôi. Đây có phải là cách tiếp cận của bạn hoặc tôi đã làm phức tạp nó quá nhiều? Một lần nữa xin cảm ơn! –

15

mùa xuân 4.3.0 cho phép InjectionPoint và DependencyDescriptor thông số cho các phương pháp sản xuất đậu:

@Configuration 
public class LoggerProvider { 

    @Bean 
    @Scope("prototype") 
    public Logger produceLogger(InjectionPoint injectionPoint) { 
     Class<?> clazz = injectionPoint.getMember().getDeclaringClass(); 

     return LoggerFactory.getLogger(clazz); 
    } 
} 

Bằng cách này, the issue for this feature SPR-14033 liên kết đến a comment on a blog post nối cho câu hỏi này .

+0

Nếu tôi tiêm này vào đậu khác, mà cũng được scoped để nguyên mẫu, sau đó sẽ không này tạo ra một logger cho mỗi trường hợp của đậu đó, chứ không phải là chia sẻ một trường hợp tĩnh duy nhất? –

+1

@ RupertMadden-Abbott Khung khai thác gỗ thường lưu trữ logger. Ví dụ, xem câu hỏi này về khung đăng nhập SLF4J: [Chi phí của việc tạo một trình ghi nhật ký SLF4J trong các bối cảnh tĩnh và không tĩnh là gì?] (Http://stackoverflow.com/questions/10345109/whats-the-overhead-of -mreating-a-slf4j-logger-trong-static-vs-phi-static-context) –

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