Spring定義Bean的六種方式
一、xml 配置文件
這種方式在 SpringMVC 中是常用的方式,Spring 啟動(dòng)時(shí)會(huì)讀取配置文件,并將配置文件中配置好的類加入到 IOC 容器中。
使用?ClassPathXmlApplicationContext()?讀取配置并啟動(dòng)一個(gè) Spring IOC 容器。調(diào)用容器的?getBean()?方法返回需要的對(duì)象。
二、配置類
這種方式比較類似于第一種配置文件,但是這種更效率。
創(chuàng)建一個(gè)配置類,配合使用?@Bean?注解,以成員方法的形式返回 Bean 實(shí)例。
使用?AnnotationConfigApplicationContext()?讀取配置類并啟動(dòng)一個(gè) Spring IOC 容器。調(diào)用容器的?getBean()?方法返回需要的對(duì)象。
三、掃描包
通過(guò) @ComponentSacn 掃描包形式獲取 Bean,被掃描的包下的所有帶 @Component 注解的類都會(huì)被認(rèn)為是 Bean。
四、BeanDefinition 構(gòu)建
編程式使用 BeanDefinition 構(gòu)建 Bean,前三種方式也是基于底層 BeanDefinition 構(gòu)建出來(lái)的。
這種方式更復(fù)雜,也更底層。
五、FactoryBean 構(gòu)建
使用 FactoryBean 構(gòu)建特殊 Bean,使用 FactoryBean,Spring 會(huì)構(gòu)建兩個(gè) Bean,一個(gè)是外層類的類型,一個(gè)是返回 Bean 的類型,外層類型是通過(guò) Bean 名字前面加?&?符號(hào)獲取。
創(chuàng)建容器后,外層類型作為 Bean 的類型注冊(cè)到容器中,在調(diào)用?getBean()?方法時(shí),默認(rèn)返回?getObject()?返回的對(duì)象。
如果在 Bean 的名字前面加?&?,則可以獲取到外層類型。
FactoryBean 產(chǎn)生單個(gè) Bean,在 IOC 容器的基礎(chǔ)上給 Bean 的實(shí)現(xiàn)加上了一個(gè)簡(jiǎn)單工廠模式和裝飾模式,是一個(gè)可以生產(chǎn)對(duì)象和裝飾對(duì)象的工廠 Bean,由 Spring 管理后,生產(chǎn)的對(duì)象是由?getObject()?方法決定的。
六、registerBean 直接注冊(cè) Bean
在構(gòu)建 Bean 時(shí)使用 Supplier 初始化 Bean 的參數(shù),當(dāng)然也可以做一些邏輯操作。Supplier 可以簡(jiǎn)寫(xiě)到 lambda 表達(dá)式。