我有一個類(ABC類),通過調用構造函數實例化。 ABC類又有一個使用自動連線注入的助手類(Class XYZ)。彈簧自動裝配不從非彈簧管理類工作
Ours是一個基於Spring MVC的應用程序,在服務器啓動時我看不到任何異常。
但我仍然看到類XYZ爲空。是否因爲Class ABC沒有被Spring Container實例化?
在這種情況下,我該如何利用自動佈線?
謝謝。
我有一個類(ABC類),通過調用構造函數實例化。 ABC類又有一個使用自動連線注入的助手類(Class XYZ)。彈簧自動裝配不從非彈簧管理類工作
Ours是一個基於Spring MVC的應用程序,在服務器啓動時我看不到任何異常。
但我仍然看到類XYZ爲空。是否因爲Class ABC沒有被Spring Container實例化?
在這種情況下,我該如何利用自動佈線?
謝謝。
正確:您不能只在班上撥打new
並將其全部接通; Spring必須管理這個bean,才能完成它所有的魔法。
如果您可以發佈有關您的用例的更多詳細信息,我們可能會建議有用的選項。
總而言之,ABC沒有注入XYZ,因爲Spring並不管理ABC。 Spring不能配置它不知道的對象。
您可以通過使用@Service
或@Component
註釋來管理ABC。請注意,爲了使春季拿起這些註釋,春天必須有自動掃描功能開啓:
<context:component-scan base-package="com.mypackage.awesomeproject" />
自動連接將無法工作,因爲ABC類不是由Spring管理。您可以通過使用類定義上方的@Component註釋(@Component,@Service,@Controller等)之一,然後在您的應用程序上下文XML中使用context:component-scan,或者去老派和只需在應用程序上下文中直接定義bean。
ApplicationContext的背景=新 的ClassPathXmlApplicationContext(「路徑/到/的applicationContext:
如果由於某種原因,你不能讓春天管理ABC類,你可以使用類似加載ABC的應用程序上下文。 XML「);
,然後使用:
XYZ someXyz =(XYZ)context.getBean( 「MyXYZ」);
手動設置bean值。
第一個問題 - 是的,你有null,因爲不類彈簧 第二個問題開始 - 我認爲你可以使用AspectJ的支持http://static.springsource.org/spring/docs/3.2.x/spring-framework-reference/html/aop.html#aop-using-aspectj
您可以批註ABC
類@Configurable
註解。然後Spring IOC將向ABC
類注入XYZ
實例。它通常與AspectJ AnnotationBeanConfigurerAspect
一起使用。
沒有爲我工作。 – mafonya
您可以用這種方式在非簧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);
你可以使用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
...
}
}
Hi ibai, 期間只能得到null什麼是MyClass?它也是一個非彈簧管理對象。 我們可以在應用程序類中添加新的ABC()嗎? 謝謝。 – Sam
我相信你無法自動裝配其中。您需要通過一些其他的平均值來獲得XYZ的一個實例的引用保持不受Spring管理豆。如果它是一個Helper類,則使XYZ的方法靜態並使用它們使用類名。這就是我所做的。 – dharam
請參閱https://github.com/ahmedbhaila/non-managed-beans,我已經嘗試過,它的工作原理。 – Sam