前言
在@Component
注解的類下,再使用了@Resource
或@Autowired
注解。如此操作會導致依賴注入失敗。
這是因為spring加載它們的順序不同,在使用@Component
注解將bean實例化到spring容器內(nèi)的時候,因為@Autowired
是在這個bean之中的,此時@Autowired
還未完成自動裝載,所以導致依賴注入的service為null
@Component和@Autowired或@Resource
在Spring應用程序中,@Component
注解用于將類標記為可自動掃描的組件。當Spring容器啟動時,會掃描帶有@Component
注解的類,并將它們實例化為bean。這些bean會被添加到Spring容器的bean工廠中,以便在應用程序中使用。
@Autowired
注解用于在Spring應用程序中進行依賴注入。當Spring容器創(chuàng)建帶有@Autowired
注解的bean時,會自動查找匹配的類型進行注入。如果找到多個匹配的類型,則會拋出異常。
@Resource
注解也可以用于在Spring應用程序中進行依賴注入。當Spring容器創(chuàng)建帶有@Resource
注解的bean時,會優(yōu)先使用名稱匹配進行注入。如果找不到匹配的名稱,則會使用類型匹配進行注入。
因此,在Spring應用程序中,@Component
注解的類會在@Autowired
或@Resource
注解的類之前被加載。@Autowired
注解會優(yōu)先使用類型匹配進行依賴注入,而@Resource
注解則會優(yōu)先使用名稱匹配進行依賴注入。
在使用@Component
、@Autowired
或@Resource
注解進行依賴注入時,還需要注意以下幾點:文章來源:http://www.zghlxwxcb.cn/news/detail-456523.html
- 如果希望使用
@Autowired
注解注入多個匹配的類型,可以使用@Qualifier
注解指定具體的bean名稱。 - 如果希望使用
@Autowired
或@Resource
注解注入非必需的依賴,可以使用@Autowired(required=false)
或@Resource(required=false)
。 - 如果希望使用
@Autowired
或@Resource
注解注入的依賴不存在,可以使用@Autowired(required=false)
或@Resource(required=false)
,并在代碼中進行相應的處理。 - 如果希望使用
@Autowired
或@Resource
注解注入的依賴可以為null,可以使用@Autowired(required=false)
或@Resource(required=false)
,并在代碼中進行相應的處理。 - 如果希望使用
@Autowired
或@Resource
注解注入的依賴可以為null,可以使用@Autowired(required=false)
或@Resource(required=false)
,并在代碼中進行相應的處理。
解決方法
@Component
public class Test {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
// @Autowired
// private UserServer userServer;
private static UserServer userServer;
@Autowired
public void setUserServer(UserServer userServer) {
Test.userServer = userServer;
}
}
把@Autowired
注解放在方法上會在類加載后自動注入這個方法的參數(shù),并執(zhí)行一遍方法。文章來源地址http://www.zghlxwxcb.cn/news/detail-456523.html
到了這里,關(guān)于使用@Component時再使用@Resource或@Autowired時注入失敗問題的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!