2017-01-12 21 views
1

Spring constructor injection of SLF4J logger - how to get injection target class?春ブーツ:BeanFactoryPostProcessorのpostProcessBeanFactory

と呼ば得ていないが、私は同様の機能が、春ブーツでを達成したいです。

私はこの質問のために与えられた解決策を試してみましたが、私の春ブートアプリケーション内で呼び出されることは決してありません BeanFactoryPostProcessorpostProcessBeanFactory方法は以下

は、メソッドの実装であるようだ。

@SuppressWarnings("unused") 
public class LoggerBeanFactoryPostProcessor implements BeanFactoryPostProcessor { 
    @Override 
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { 
     String [] beanClasses = beanFactory.getBeanDefinitionNames(); 
     for(String beanName : beanClasses){ 
      Object beanObject = beanFactory.getBean(beanName); 
      if(beanObject.getClass().isAnnotationPresent(Loggable.class)){ 
       try { 
        Field loggerField = beanObject.getClass().getDeclaredField("logger"); 
        loggerField.setAccessible(true); 
        loggerField.set(beanObject, LoggerFactory.getLogger(beanObject.getClass())); 
       }catch (NoSuchFieldException | IllegalAccessException e){ 
        e.printStackTrace(); 
       } 
      } 
     } 
    } 
+0

このクラスをBeanとして設定に追加しましたか? –

+0

@KenBekov正確に私はこれをSpring Bootプロジェクトに追加する必要がありますか? –

+0

これをあなたの設定に 'public static' '@ Bean'メソッドとして追加してください。クラスを追加するだけで何も行いません。 –

答えて

1

春がいることを知っている必要があります新しいBeanFactoryPostProcessorを追加したので、BeanFactoryPostProcessorを設定としてBeanとして宣言する必要があります。

<bean class="your.package.LoggerBeanFactoryPostProcessor" /> 

そしてJavaConfig用:

@Bean 
public static BeanFactoryPostProcessor loggerBeanFactoryPostProcessor() { 
    return new LoggerBeanFactoryPostProcessor(); 
} 

注:XML設定については BeanFactoryPostProcessor静的戻るあなたのJavaConfigでメソッドを作成してください。あなたが他の春に関連するいくつかの機能を使用するまではうまく動作しません。たとえば、プロパティ@Valueを使用すると動作しません。 documentationから

静的としてこの方法をマークすることによって、それは、このよう 上記ライフサイクルの競合を回避する、その宣言@Configurationクラスの インスタンス化を招くことなく起動することができます。ただし、静的な@Bean メソッドは、上記の のようにスコープとAOPのセマンティクスについては拡張されません。これはBFPPのケースでは、他の@Beanメソッドによって通常参照される ではないので、これはうまくいきます。

+0

DefaultListableBeanFactoryでXmlBeanDefinitionReaderを使用すると、XMLメソッドのBeanFactoryPostProcessorが呼び出されず、理由を特定できません。 –

+0

@YuJiaaoは、コード例とすべての詳細とで別の質問を投稿するかもしれませんか? –

+0

新しい質問と、githubの例を投稿します。https://stackoverflow.com/questions/48640952/how-to-call-beanfactorypostprocessor-postprocessbeanfactory-method-when-use-spri –