2013-08-21 144 views
5

我有一個類(ABC類),通過調用構造函數實例化。 ABC類又有一個使用自動連線注入的助手類(Class XYZ)。彈簧自動裝配不從非彈簧管理類工作

Ours是一個基於Spring MVC的應用程序,在服務器啓動時我看不到任何異常。

但我仍然看到類XYZ爲空。是否因爲Class ABC沒有被Spring Container實例化?

在這種情況下,我該如何利用自動佈線?

謝謝。

+0

我相信你無法自動裝配其中。您需要通過一些其他的平均值來獲得XYZ的一個實例的引用保持不受Spring管理豆。如果它是一個Helper類,則使XYZ的方法靜態並使用它們使用類名。這就是我所做的。 – dharam

+0

請參閱https://github.com/ahmedbhaila/non-managed-beans,我已經嘗試過,它的工作原理。 – Sam

回答

2

正確:您不能只在班上撥打new並將其全部接通; Spring必須管理這個bean,才能完成它所有的魔法。

如果您可以發佈有關您的用例的更多詳細信息,我們可能會建議有用的選項。

1

總而言之,ABC沒有注入XYZ,因爲Spring並不管理ABC。 Spring不能配置它不知道的對象。

您可以通過使用@Service@Component註釋來管理ABC。請注意,爲了使春季拿起這些註釋,春天必須有自動掃描功能開啓:

<context:component-scan base-package="com.mypackage.awesomeproject" /> 
5

自動連接將無法工作,因爲ABC類不是由Spring管理。您可以通過使用類定義上方的@Component註釋(@Component,@Service,@Controller等)之一,然後在您的應用程序上下文XML中使用context:component-scan,或者去老派和只需在應用程序上下文中直接定義bean。

ApplicationContext的背景=新 的ClassPathXmlApplicationContext(「路徑/到/的applicationContext:

如果由於某種原因,你不能讓春天管理ABC類,你可以使用類似加載ABC的應用程序上下文。 XML「);

,然後使用:

XYZ someXyz =(XYZ)context.getBean( 「MyXYZ」);

手動設置bean值。

0

您可以批註ABC@Configurable註解。然後Spring IOC將向ABC類注入XYZ實例。它通常與AspectJ AnnotationBeanConfigurerAspect一起使用。

+1

沒有爲我工作。 – mafonya

10

您可以用這種方式在非簧bean類

public class ApplicationContextUtils implements ApplicationContextAware { 

    private static ApplicationContext ctx; 

    @Override 
    public void setApplicationContext(ApplicationContext appContext) 
     throws BeansException { 
    ctx = appContext; 

    } 

    public static ApplicationContext getApplicationContext() { 
    return ctx; 
    } 
} 

使用Spring bean的,現在你可以通過getApplicationContext ApplicationContext的對象()這個方法。

從ApplicationContext中,你可以得到的Spring bean對象是這樣的:

ApplicationContext appCtx = ApplicationContextUtils 
    .getApplicationContext(); 
String strFromContext = (String) appCtx.getBean(beanName); 
+0

如何設置appContext? – CrazyJavaLearner

+0

Spring容器將注入該對象。 –

+0

是的。我知道了。感謝您的回覆。 – CrazyJavaLearner

2

你可以使用Spring的@Configurable註解中要自動裝配其他bean類。 此外,您需要使用@EnableSpringConfigured註釋任何配置bean,以便Spring知道您的可配置bean。

@EnableSpringConfigured documentation

公共@interface EnableSpringConfigured 信號在當前應用程序上下文依賴注入適用於被實例化的Spring bean工廠外的非管理類(一般類與@Configurable註解)。 與Spring的XML元素中的功能類似。通常與@EnableLoadTimeWeaving結合使用。

@Configurable(autowire = Autowire.BY_TYPE) 
public class ABC { 
    @Autowire private XYZ xyz; 
    ... 
} 

@Configuration 
@EnableSpringConfigured 
public class Application { 
    ... 
} 

public class MyClass { 
    public void doSomething() { 
     ABC abc = new ABC(); // XYZ is successfully autowired 
     ... 
    } 
} 
+0

Hi ibai, 期間只能得到null什麼是MyClass?它也是一個非彈簧管理對象。 我們可以在應用程序類中添加新的ABC()嗎? 謝謝。 – Sam