更多Spring文章,歡迎點擊 一灰灰Blog-Spring專題java
咱們知道在Spring中,有兩個很是有名的特性,依賴注入(DI)與切面(AOP),其中依賴注入其主要的做用,能夠說就是維護Spring容器建立的Bean之間的依賴關係,簡單來講就是一個bean(假定名爲A)持有另外一個Bean(假定名爲B)的引用做爲成員變量b,則由Spring容器自動將B賦值給A的成員變量bgit
所以在想理解依賴注入,就有必要了解下建立和使用Bean的幾種姿式;本篇博文做爲基礎篇,將介紹github
<!--more-->spring
在SpringBoot的大環境下,基本上再也不使用之前的xml配置,因此本篇博文也再也不介紹以往Spring中,經過xml來聲明bean的使用方式框架
這種也是咱們最多見的使用姿式,通常就是在類上添加@Component
, @Service
等註解(@Controller
表示提供http接口的bean, @Configuration
表示配置類Bean)ide
添加上這種註解的類,會被Spring容器掃描加載,自動生成單例的bean,一個典型的實例以下spring-boot
@Component public class AnoDemoBean { private String type = "AnoDemoBean"; public String getName(String name) { return name + " _" + type; } }
若是在實際測試時,發現沒法獲取上面的bean,就須要注意下bean的包路徑,是否在被你程序的掃描路徑包含學習
@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容器看爲一個Beanui
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(); } }
前面介紹瞭如何建立Bean,建立完以後,接着就是使用了,下面介紹最基本的幾種使用方式
Autowired
注入將註解@Autowired
或者@Resource
添加到成員變量上,即表示這個成員變量會由Spring容器注入對應的Bean對象
@Autowired private ConfigDemoBean configDemoBean;
由Spring容器依賴注入的方式,從代碼上看,是不會找到有什麼地方主動的塞入了這個值,可是使用處卻能夠直接使用,所以須要注意有可能會出現npe
和前面其實也差很少,只不過註解放在了setter方法上
private FacDemoBean facDemoBean; @Autowired private void setFacDemoBean(FacDemoBean facDemoBean) { this.facDemoBean = facDemoBean; }
顧名思義,就是在構造方法中傳入Bean對象來初始化
public class DemoController { private AnoDemoBean anoDemoBean; public DemoController(AnoDemoBean anoDemoBean) { this.anoDemoBean = anoDemoBean; } }
這種方式的好處是能夠避免潛在的NPE問題(後面將有博文專門說起),並且針對Bean不存在的狀況,系統會拋出異常,提前知道問題
本篇主要介紹了Bean的基本建立和使用姿式,基本上也是咱們在日常的業務開發中使用得最廣的方式了,是否是會這些就好了呢?業務作多了以後,隨之而來就會有一些疑問
一灰灰的我的博客,記錄全部學習和工做中的博文,歡迎你們前去逛逛
盡信書則不如,以上內容,純屬一家之言,因我的能力有限,不免有疏漏和錯誤之處,如發現bug或者有更好的建議,歡迎批評指正,不吝感激
一灰灰blog
知識星球