SpringBoot基礎篇Bean之基本定義與使用
我們知道在Spring中,有兩個非常有名的特性,依賴注入(DI)與切面(AOP),其中依賴注入其主要的作用,可以說就是維護Spring容器建立的Bean之間的依賴關係,簡單來說就是一個bean(假定名為A)持有另一個Bean(假定名為B)的引用作為成員變數b,則由Spring容器自動將B賦值給A的成員變數b
因此在想理解依賴注入,就有必要了解下建立和使用Bean的幾種姿勢;本篇博文作為基礎篇,將介紹
- bean的基本建立方式
- bean的常見使用姿勢
I. Bean的幾種建立方式
在SpringBoot的大環境下,基本上不再使用以前的xml配置,所以本篇博文也不再介紹以往Spring中,通過xml來宣告bean的使用方式
1. 註解方式
這種也是我們最常見的使用姿勢,一般就是在類上新增@Component
, @Service
等註解(@Controller
表示提供http介面的bean, @Configuration
表示配置類Bean)
新增上這種註解的類,會被Spring容器掃描載入,自動生成單例的bean,一個典型的例項如下
@Component
public class AnoDemoBean {
private String type = "AnoDemoBean";
public String getName(String name) {
return name + " _" + type;
}
}
如果在實際測試時,發現無法獲取上面的bean,就需要注意下bean的包路徑,是否在被你程式的掃描路徑包含
2. @Bean
定義方式
這種方式,主要是結合Configuration
來定義bean,首先是宣告一個配置類,然後再配置類中,通過返回bean物件的方法形式來宣告bean,一般使用姿勢如下
@Data
public class ConfigDemoBean {
private String type = "ConfigDemoBean";
public String getName(String name) {
return name + " _" + type;
}
}
@Configuration
public class BeanLoadConfig {
@Bean
public ConfigDemoBean configDemoBean() {
return new ConfigDemoBean();
}
}
需要說明的一點是BeanLoadConfig類本身也被Spring容器看為一個Bean
3. 工廠類方式
FactoryBean本質上也是一個Bean,但是可以通過他來生成你期待的Bean,在實際的業務場景中可能使用場景不多,但是在抽象的框架層面應用很廣,一個簡單的使用姿勢如
public class FacDemoBean {
private String type = "FacDemoBean";
public String getName(String name) {
return name + " _" + type;
}
}
public class DemoFactoryBean implements FactoryBean<FacDemoBean> {
@Override
public FacDemoBean getObject() throws Exception {
return new FacDemoBean();
}
@Override
public Class<?> getObjectType() {
return FacDemoBean.class;
}
@Override
public boolean isSingleton() {
return true;
}
}
@Configuration
public class BeanLoadConfig {
@Bean
public DemoFactoryBean demoFactoryBean() {
return new DemoFactoryBean();
}
@Bean
public FacDemoBean facDemoBean(DemoFactoryBean demoFactoryBean) throws Exception {
return demoFactoryBean.getObject();
}
}
II. Bean的使用姿勢
前面介紹瞭如何建立Bean,建立完之後,接著就是使用了,下面介紹最基本的幾種使用方式
1. Autowired
注入
將註解@Autowired
或者@Resource
新增到成員變數上,即表示這個成員變數會由Spring容器注入對應的Bean物件
@Autowired
private ConfigDemoBean configDemoBean;
由Spring容器依賴注入的方式,從程式碼上看,是不會找到有什麼地方主動的塞入了這個值,但是使用處卻可以直接使用,因此需要注意有可能會出現npe
2. Setter方法
和前面其實也差不多,只不過註解放在了setter方法上
private FacDemoBean facDemoBean;
@Autowired
private void setFacDemoBean(FacDemoBean facDemoBean) {
this.facDemoBean = facDemoBean;
}
3. 構造方法
顧名思義,就是在構造方法中傳入Bean物件來初始化
public class DemoController {
private AnoDemoBean anoDemoBean;
public DemoController(AnoDemoBean anoDemoBean) {
this.anoDemoBean = anoDemoBean;
}
}
這種方式的好處是可以避免潛在的NPE問題(後面將有博文專門提及),而且針對Bean不存在的情況,系統會丟擲異常,提早知道問題
4. 小結
本篇主要介紹了Bean的基本建立和使用姿勢,基本上也是我們在平常的業務開發中使用得最廣的方式了,是不是會這些就行了呢?業務做多了之後,隨之而來就會有一些疑問
- 提供的jar包給第三方使用,如何保證其他人能順利載入jar包中的bean?
- bean初始化的先後順序是怎樣的?
- 可以手動註冊一個Bean麼,改怎麼做?
- BeanFactory與FactoryBean的區別是啥,各自的典型應用場景又是什麼?
- 重名的Bean是否可以解決?
II. 其他
0. 專案
1. 一灰灰Blog
一灰灰的個人部落格,記錄所有學習和工作中的博文,歡迎大家前去逛逛
2. 宣告
盡信書則不如,以上內容,純屬一家之言,因個人能力有限,難免有疏漏和錯誤之處,如發現bug或者有更好的建議,歡迎批評指正,不吝感激
- QQ: 一灰灰/3302797840
3. 掃描關注
一灰灰blog
知識星球