2012-03-13 17 views
12

Vorrei creare metodo produttore di fagioli di una primavera che è consapevole che ha invocato, così ho iniziato con il seguente codice:Qual è l'equivalente DI di Spring di InjectionPoint di CDI?

@Configuration 
public class LoggerProvider { 

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

     return LoggerFactory.getLogger(clazz); 
    } 
} 

Come posso ottenere le informazioni che vuole ottenere il fagiolo iniettato?

Sto cercando un equivalente di CDI's InjectionPoint nel mondo di primavera.

risposta

6

Per quanto ne so, la primavera non ha un tale concetto.

Quindi solo la cosa che è a conoscenza del punto che viene elaborato è un BeanPostProcessor.


Esempio:

@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

Grazie Ralph! Ok, quindi questo 'BeanPostProcessor' viene invocato ogni volta che un bean viene iniettato ovunque. C'è un modo in cui posso riconoscere ** quale ** bean deve essere iniettato? Voglio dire che ho ottenuto: 'postProcessBeforeInitialization (Object bean, String beanName)' dove 'bean' è un bean che vuole l'iniezione da realizzare (la ** parte ** che ho chiesto nella mia domanda), e' beanName 'è il nome' bean'. Ora non so quale campo nel 'bean' vuole che sia fatta l'iniezione - in altre parole non so se il bean iniettato è' LoggerProvider' o qualcos'altro. –

+0

Per quanto ho capito, il post processore viene invocato dopo che un bean è stato creato! (non iniettato da nessuna parte). L'idea era di implementare il proprio framework di iniezione di piccole dimensioni sopra quel post processor di bean. – Ralph

+0

Ok, quindi l'implementatore 'BeanPostProcessor' verrà chiamato ogni volta che viene creato un bean. Quindi, la tua idea era di implementare 'postProcessBeforeInitialization' e ad es. scansionare i campi che hanno la mia annotazione personalizzata (diciamo '@ Logger') e, attraverso la riflessione, inizializzare tale campo usando la mia logica personalizzata. Era questo il tuo approccio o l'ho complicato troppo? Grazie ancora! –

15

Spring 4.3.0 consente InjectionPoint e DependencyDescriptor parametri per i metodi di fagioli produzione:

@Configuration 
public class LoggerProvider { 

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

     return LoggerFactory.getLogger(clazz); 
    } 
} 

proposito, the issue for this feature SPR-14033 collegamenti a a comment on a blog post che collega a questa domanda .

+0

Se lo inserisco in un altro bean, anch'esso con ambito di prototipazione, non creerà un logger per ogni istanza di quel bean, piuttosto che condividere una singola istanza statica? –

+1

@ RupertMadden-Abbott Il framework di registrazione normalmente memorizza nella cache i logger. Ad esempio, vedi questa domanda sul framework di registrazione SLF4J: [Qual è l'overhead della creazione di un logger SLF4J in contesti statici o non statici?] (Http://stackoverflow.com/questions/10345109/whats-the-overhead-of -creare-a-SLF4J-logger-in-static-vs-non-statico-context) –

Problemi correlati