這有點難以解釋...希望問題的領域一點都不含糊......如何指示Spring來自動裝配在緊密耦合的對象鏈
你可以看看代碼的想法...
ClassA.java
public class ClassA {
@Autowired
InterA abcd;
public void dododo() {
abcd.doit();
}
}
ClassB.java
@Component
public class ClassB implements InterA {
@Override
public void doit() {
System.out.println("hoo hoo");
}
}
ClassC.java
@Component("classc")
public class ClassC {
public void doFromAbove() {
ClassA cls = new ClassA();
cls.dododo();
}
}
接口InterA.java
public interface InterA {
public void doit();
}
配置ClassConfig.java(在同一封裝的其他Java類文件)
@Configuration
@ComponentScan
public class ClassConfig {
}
主要方法
public static void main(String[] args) {
try(AbstractApplicationContext appctx = new AnnotationConfigApplicationContext(ClassConfig.class)) {
ClassC obj = (ClassC) appctx.getBean("classc");
obj.doFromAbove();
}
}
當我執行的主要方法,在ClassA
的自動裝配Autowired場「ABCD」沒有得到注入,導致NullPointerException
當我宣佈ClassA
作爲它僅@Component
並得到它的豆...間接自動裝配沒有發生
我應該從ClassC
去耦ClassA
並使一切鬆耦合?
是否有任何簡單的註釋可以用來告訴Spring自動注入@Autowired字段,即使對象是以緊密耦合的方式創建的?
注意 請不要告訴我使用的ApplicationContext在ClassC
創造ClassA
豆。
任何Spring Geek誰可以找到答案?
我認爲在這種情況下Spring 101可能是合適的。因此,讓我們從那裏開始 - 如果您在應用程序中的任何位置使用'new' **,那麼您的錯誤是__錯誤。在Spring應用程序中,只有**的地方應該看到'new',它在配置類中向Spring解釋如何創建bean。它被稱爲_Dependency Injection_框架 - 您絕對必須** _inject dependencies_才能使用它。 –
此外,任何告訴你在'ClassC'中使用'ApplicationContext'來創建'ClassA'_'的bean的人也不理解DI。你永遠不應該這樣做。正確的做法是注入'Provider'並在需要時調用'get'。然後你告訴Spring'ClassA'是'PROTOTYPE'的作用域,所以每次創建一個新的實例。正如我所說 - 春天101. –
@BoristheSpider,我得到你的漂移......問題是我正在經歷的是將傳統的Java項目轉換爲Spring ...所以我想也許我們可以混合匹配緊密耦合的對象鬆散耦合的彈簧注入對象來完成春季轉換/遷移過程,代碼修改更少...我所描述的例子只有一個緊耦合......在一個層面上...應用Spring正確的方式似乎是一個很大的現有項目的痛苦 –