網(wǎng)站備案被注銷了怎么辦江蘇企業(yè)網(wǎng)站建設(shè)
今天遇到一個對我來說很奇葩的錯誤,我想在Service中注入bean,我這里使用了@Autowired和@Resource都不能注入,導致初始化失敗,使用了getBean()方法就可以注入。從來沒有遇到過這個問題。后來我查詢了一下,才明白了原理。我的getBean()方法如下:
@Service
public class BeanUtils implements ApplicationContextAware {private static ApplicationContext applicationContext;@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {this.applicationContext = applicationContext;}public static <T> T getBean(Class<T> clazz) {return applicationContext.getBean(clazz);}
}
@Autowired
特性:
這是Spring框架提供的注解,支持自動依賴注入。
可以應用于構(gòu)造函數(shù)、方法、字段等。
注入方式:
按類型注入:Spring會在容器中查找與類型匹配的Bean。
可結(jié)合@Qualifier:如果存在多個同類型的Bean,可以使用@Qualifier來指定具體的Bean。
required屬性:
默認情況下,@Autowired的required屬性為true,即要求必須找到對應的Bean。如果找不到,Spring會拋出異常。
設(shè)置為false后,如果找不到對應的Bean,注入的字段會被賦值為null。
@Autowired 和 @Resource 的區(qū)別
@Autowired
-
特性:
- 這是Spring框架提供的注解,支持自動依賴注入。
- 可以應用于構(gòu)造函數(shù)、方法、字段等。
-
注入方式:
- 按類型注入:Spring會在容器中查找與類型匹配的Bean。
- 可結(jié)合
@Qualifier
:如果存在多個同類型的Bean,可以使用@Qualifier
來指定具體的Bean。
-
required
屬性:- 默認情況下,
@Autowired
的required
屬性為true
,即要求必須找到對應的Bean。如果找不到,Spring會拋出異常。 - 設(shè)置為
false
后,如果找不到對應的Bean,注入的字段會被賦值為null
。
- 默認情況下,
@Resource
-
特性:
- 這是來自Java EE的注解,常用于JNDI資源的注入。
- 也可以用于字段或方法。
-
注入方式:
- 按名稱優(yōu)先:默認情況下,
@Resource
會首先根據(jù)字段名查找Bean。如果找不到,再按類型查找。 - 如果使用
name
屬性,可以顯式指定要注入的Bean名稱。
- 按名稱優(yōu)先:默認情況下,
-
沒有
required
屬性:@Resource
沒有類似@Autowired
的required
屬性,無法控制注入失敗時的行為。
為什么有時注解無法注入Bean?
-
注入時機:
- Spring的依賴注入發(fā)生在容器啟動時,如果在構(gòu)造器中試圖注入的Bean尚未初始化,可能導致注入失敗。這在Bean之間相互依賴時尤為明顯。
-
作用域問題:
- 如果一個單例Bean試圖注入一個原型Bean,Spring可能只會注入單例Bean的一個實例,而不是每次調(diào)用都獲取一個新的原型Bean。這種情況下,使用
getBean
可以獲取最新的原型實例。
- 如果一個單例Bean試圖注入一個原型Bean,Spring可能只會注入單例Bean的一個實例,而不是每次調(diào)用都獲取一個新的原型Bean。這種情況下,使用
-
條件性注入:
- 使用
@Profile
、@Conditional
等注解時,某些Bean可能會因條件未滿足而未被創(chuàng)建,導致注入失敗。這時手動調(diào)用getBean
可以獲取已經(jīng)創(chuàng)建的Bean。
- 使用
-
依賴順序:
- 在復雜的依賴關(guān)系中,可能會出現(xiàn)注入順序問題。如果一個Bean依賴于另一個尚未創(chuàng)建的Bean,Spring可能無法正確處理這類依賴,導致注入失敗。手動調(diào)用
getBean
可以避開這個問題。
- 在復雜的依賴關(guān)系中,可能會出現(xiàn)注入順序問題。如果一個Bean依賴于另一個尚未創(chuàng)建的Bean,Spring可能無法正確處理這類依賴,導致注入失敗。手動調(diào)用
示例
@Service
public class A {@Autowiredprivate B b; // 如果B尚未初始化,這里可能會失敗public void doSomething() {// 使用b的功能}
}@Service
public class B {@Autowiredprivate A a; // A依賴B,可能導致循環(huán)依賴
}