2013-12-17 117 views
2

我們遇到了有關Spring @Configurable註解的問題。編譯時編織(AspectJ)和儀器按預期工作時,我的項目中的所有內容都正確設置。Spring @Configurable Spring Singleton bean構造函數

但問題如下。我們正在構建一些巧妙的記錄器,可能會在春季範圍之外初始化。因此,我們決定把它@Configurable

@Configurable 
public class Logger(){ 
    @Autowired A a; 
} 

我們想要使用Spring @Controller,這是定義無狀態(單身),這裏面記錄儀,所以我們有:

@Controller 
public class Controller { 
    Logger l = new Logger(); 
} 

但由於控制器是singleton,那麼Spring會在初始加載時初始化其內容,並且由於記錄器在其構造函數中,因此它在完成上下文本身構造之前被初始化,因此其屬性A永遠不會被初始化。以下相當具有說明性的警告信息被打印出來:

2013.12.16 18:49:39.853 [main] DEBUG o.s.b.f.w.BeanConfigurerSupport - 
BeanFactory has not been set on BeanConfigurerSupport: 
Make sure this configurer runs in a Spring container. 
Unable to configure bean of type [Logger]. Proceeding without injection. 

有什麼辦法解決這個問題。

在此先感謝。

回答

0

,而不是直接在initlization自動裝配依賴關係,做到這一點後使用@PostConstruct回調手動:

@Configurable 
public class Logger() { 
    @Autowired private ApplicationContext appCtx; 
    private A a; 
    @PostConstruct private void init() { 
     this.a = appCtx.getBean(A.class); 
    } 
} 

這工作,因爲ApplicationContext總是首先初始化,始終可用於注射。但是,這會讓您的代碼意識到Spring。

更好的解決方案是不使用@Configurable,而是使用Spring管理的工廠來創建新的Logger

+0

您確定這可行嗎?我目前無法驗證它,但在我看來,它與我的代碼存在同樣的問題。 ApplicationContext不會被自動裝配,因爲它現在還沒有準備好(上下文正在初始化,並且在構建Logger之前無法初始化,因爲Logger是Controller單例bean的一部分)。因此AnnotationBeanConfigurerAspect將無法訪問ApplicationContext,並且無法自動裝載它。 – malejpavouk

相關問題