[英]Spring @autowired do not work if all classes are not in the same package
[英]Find all classes that are not @Autowired
我有一個使用注釋的大型spring web應用程序。 但是,有些類使用@ component / service進行注釋,但不會從調用它們的位置進行自動裝配。 相反,使用新的運算符。
我想找出使用new運算符的所有用戶定義類的實例。
基本上,我創建了一個新的Http包裝類(spring組件),我從應用程序的多個位置調用它。 有些地方它的工作原理是因為它的自動連接是有效的,因為包含類和鏈開頭的類是由spring管理的。 但是有些地方它不起作用,因為調用鏈中的一個類是使用new實例化的,而不是Spring管理的。 所以我想解決這個問題並使這些類也被春季管理。
我說的是100多個課程,所以請建議一個可以在3-4個小時內完成的工具或方法,以防止人為錯誤。 我用eclipse。
例:
@Component
public class MyHttpClient {
public int execute() {
...
}
}
@Component
public class UtilC {
@Autowired
private MyHttpClient client;
public int methodC() {
// When methodC is called from A, it works
// but when called from B, it gives NullPointerException
client.execute();
}
}
@Component
public class UtilB {
private UtilC c = new UtilC();
public int methodB() {
c.methodC();
}
}
@Component
public class UtilA {
@Autowired
private UtilC c;
public int methodA() {
c.methodC();
}
}
請不要建議:
@Component
public class UtilC {
@Autowired
private MyHttpClient client;
public int methodC() {
try {
client.execute();
} catch(NullPointerException npe) {
new MyHttpClient.execute();
}
}
}
如何搜索所有已實例化的用戶定義類,如新的UtilC
使用Google反射查找使用@Autowired
注釋的所有類
Reflections reflections = new Reflections("org.home.xxx");
Set<Class<?>> annotated = reflections.getTypesAnnotatedWith(org.springframework.beans.factory.annotation.Autowired.class);
Set
中沒有出現的類沒有注釋。
解決這個問題的一種方法是使用aspectj(編譯時編織)。 例如,以下方面允許編譯器為使用@XmlRootElement用法注釋的類的ctor創建錯誤(但在運行時,容器當然可以反射性地調用它)
import javax.xml.bind.annotation.XmlRootElement;
public aspect CtorError {
declare error : call ((@XmlRootElement *).new(..)) : "ctor called";
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.