2013-05-09 47 views
1

我使用名爲非靜態的記錄器根據類名稱:我可以自動裝配指定的記錄器嗎?

protected Logger logger = LoggerFactory.getLogger(getClass()); 

我可以在某種程度上配置彈簧,將使用@Autowired設置適當的記錄?

@Autowired 
protected Logger logger; 

我可以使用工廠方法進行記錄器初始化,但我不知道如何傳遞類名作爲參數。對於基於setter的依賴注入,Spring必須知道類名,因爲它擁有對bean的引用。我能以某種方式訪問​​它嗎?有另一種方法嗎?

+0

這是否還有其他目的? – 2013-05-09 14:45:46

+0

我只是好奇春天是否可以以更方便的方式處理記錄器依賴關係(就像lombok一樣)。 – Kojotak 2013-05-09 15:49:00

回答

0

你可以用@注入和注入它BeanFactoryPostProcessor

@Inject 
Logger logger; 

你可以在這裏找到更多的細節: Using java annotation to inject logger dependency

+0

我認爲這是正確的答案。我最近使用了Spring的後置處理器來處理其他事情,從後面的角度來看,這正是我一直在尋找的東西。 – Kojotak 2014-06-26 07:04:45

0

您可以使用@Qualifier註釋。當然,這意味着您已經將Logger對象添加到您的應用程序上下文中。

導入這個配置到你的應用環境將允許你這樣做:

@Configuration 
public class LoggerConfig { 
    @Bean 
    public Logger myClassLogger() { 
     return LoggerFactory.getLogger(MyClass.class); 
    } 

    @Bean 
    public Logger myOtherClassLogger() { 
     return LoggerFactory.getLogger(MyOtherClass.class); 
    } 
} 

,然後在類,使用Logger

@Component 
public class MyClass { 
    @Autowired 
    @Qualifier("myClassLogger") 
    private Logger logger; 

    //... 
} 

@Component 
public class MyOtherClass { 
    @Autowired 
    @Qualifier("myOtherClassLogger") 
    private Logger logger; 

    //... 
} 
0

爲了使記錄器可注射@Autowired,您必須具有一個配置類,您可以在其中配置所有使用的豆類@Autowired。該課程將標有@Configuration。您必須在您的配置中輸入以下@Bean

@Configuration 
public class WebConfiguration { 

    @Bean 
    @Scope("prototype") 
    public Logger produceLogger(InjectionPoint injectionPoint) { 
     Class<?> classOnWired = injectionPoint.getMember().getDeclaringClass(); 
     return LoggerFactory.getLogger(classOnWired); 
    } 
} 
相關問題