2016-05-26 21 views
2

我使用的組件上的@Async註釋我手動另一個類使用AutowireCapableBeanFactory實例:春天 - 在組件手動創建@Async不工作

AutowireCapableBeanFactory factory = applicationContext.getAutowireCapableBeanFactory(); 
factory.autowireBean(object); 
factory.initializeBean(object, "MyObject"); 

我的問題是,調用類object上的異步方法是手動創建Spring上下文,這意味着我無法在其中自動裝入object,並且@Async註釋在這種情況下似乎不起作用。

這裏是我的Spring上下文實例:

@Component 
@Scope("prototype") 
@ComponentScan({ "com.package.my" }) 
public class Application { 

    private static ApplicationContext applicationContext; 

    public Application() { 
     if (applicationContext == null) { 
      applicationContext = new AnnotationConfigApplicationContext(Application.class); 
     } 
    } 

} 

我用Proxy類使用AutowireCapableBeanFactory時具有自@Autowired在它自動連接我的對象是工作的罰款解決的問題。

這就是說,我對這個解決方案並不滿意,因爲它需要我創建一個沒有其他用途的中間類,而且我非常肯定可以在手動創建對象時使@Async註釋生效。

有沒有更好的方法來做到這一點?

感謝。

+0

不要創建手動創建對象(除非想要奇怪的內存問題,事務性怪異等,否則不會創建上下文的實例)。 –

+2

捕獲並使用'initializeBean'的返回值。 –

+0

@ M.Deinum我別無選擇,我的應用程序被用作另一個不是Spring應用程序的應用程序庫。 – AntoineB

回答

2

如果您確實沒有選擇,並且無法從ApplicationContext中聲明或檢索bean,那麼您可以要求ApplicationContext準備對象,就好像它是一個bean。

您正在使用的initializeBean方法實際上會返回一個值,該值是本身的Spring處理版本。例如,如果Spring在對象上應用自己的代理,它將返回代理。該javadoc狀態

返回:bean實例使用,無論是原件或包裹一個

所以捕捉它的返回值,並使用該

object = factory.initializeBean(object, "MyObject"); 
+0

完美工作,謝謝。 – AntoineB