javascript
Spring5参考指南:Bean的创建
文章目錄
- Spring容器中的Bean
- Bean的命名
- Bean的實例化
Spring容器中的Bean
Bean在Spring中就是一個業(yè)務組件,我們通過創(chuàng)建各種Bean來完成最終的業(yè)務邏輯功能。
在容器內(nèi)部,每個bean的定義可以被表示為BeanDefinition,通過BeanDefinition可以獲得bean的很多信息包括:包名,bean的作用域,生命周期,bean的引用和依賴等。
通過ApplicationContext的getBeanFactory()方法,能夠獲得DefaultListableBeanFactory的實現(xiàn)。實現(xiàn)類有兩個方法可以將用戶自定義的bean注冊到Spring容器中。兩個方法是:
-
registerSingleton(String beanName, Object singletonObject)
-
registerBeanDefinition(String beanName, BeanDefinition beanDefinition)
其中,registerSingleton通過bean名字,和bean實例在注冊。registerBeanDefinition則通過bean名字和beanDefinition來注冊。
如果想自己構(gòu)建beanDefinition比較麻煩,他需要實現(xiàn)的方法比較多。
使用方式如下:
// create and configure beans ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");//從ApplicationContext 中獲取 DefaultListableBeanFactory DefaultListableBeanFactory beanFactory=(DefaultListableBeanFactory)context.getBeanFactory();BeanDefinition beanDefinition=beanFactory.getBeanDefinition("daoA");System.out.println(beanDefinition.getBeanClassName());DaoC daoC=new DaoC();//將daoC注冊到spring容器中beanFactory.registerSingleton("daoC", daoC);//也可以注冊beanDefinition // beanFactory.registerBeanDefinition();//從Spring容器中獲取到剛剛手動注冊的bean System.out.println(context.getBean("daoC"));Bean的命名
Bean可以通過id和name屬性來命名,id是全局唯一的,name可以有多個,可以通過逗號,分號或者空格來區(qū)分多個name。
當然id和name不是必須的,如果你不指定bean的標志符,SPring容器會為你自動分配一個。這種沒有名字的Bean一般用在內(nèi)部bean或者自動裝載的情況。
bean命名一般采用開頭小寫的駝峰模式。如:accountManager, accountService, userDao, loginController等。
使用也可以為bean定義別名,一般用在大型系統(tǒng)中,將引入的外部bean和自身的系統(tǒng)命名保持一致。
<alias name="myApp-dataSource" alias="subsystemA-dataSource"/> <alias name="myApp-dataSource" alias="subsystemB-dataSource"/>如果你使用Java配置,那么可以使用@Bean來為Bean命名。
Bean的實例化
實例化bean一般有3種方式,通過構(gòu)造函數(shù)實例化,通過靜態(tài)工程方法實例化,通過實例的工廠方法實例化。
一般來說我們使用構(gòu)造函數(shù)在Spring容器中創(chuàng)建bean。這個和用new創(chuàng)建bean并將其注入到Spring容器中在本質(zhì)上是一樣的。
工廠方法用的比較少,如果我們需要每次生成一個新的對象時候,就可以考慮使用工廠方法了。工廠方法在后面的作用域范圍一文中,我們還會詳細的講解怎么使用。
構(gòu)造函數(shù)實例化
在Spring中,bean的構(gòu)造函數(shù)跟普通構(gòu)造函數(shù)沒有什么區(qū)別,最常見的就是無參構(gòu)造函數(shù):
<bean id="exampleBean" class="examples.ExampleBean"/>當然也可以創(chuàng)建帶參數(shù)的構(gòu)造函數(shù):
<bean id="petStore" class="com.flydean.services.PetStoreService"><constructor-arg ref="accountDao"/></bean>靜態(tài)工廠方法
靜態(tài)工廠方法通過class屬性指定包含靜態(tài)工廠方法的類,使用名為factory-method的屬性指定工廠方法本身的名稱。
這個指定的方法用來返回需要的實例。
<!-- factory method --><bean id="clientService"class="com.flydean.services.ClientService"factory-method="createInstance"/>ClientService的代碼如下:
public class ClientService {private static ClientService clientService = new ClientService();private ClientService() {}/*** 工廠方法,必須是靜態(tài)方法* @return*/public static ClientService createInstance() {return clientService;} }大家注意,這里的createInstance方法必須是靜態(tài)的。
實例工廠方法
和靜態(tài)工廠方法一樣,實例工廠方法只不過是使用實例中的方法來創(chuàng)建相應的bean對象。
這樣在factory-bean定義工廠bean實例,在factory-method中定義需要創(chuàng)建bean的方法:
<!--factory bean--><bean id="serviceLocator" class="com.flydean.services.DefaultServiceLocator"></bean><bean id="serviceA"factory-bean="serviceLocator"factory-method="createServiceAInstance"/><bean id="serviceB"factory-bean="serviceLocator"factory-method="createServiceBInstance"/>DefaultServiceLocator代碼如下:
public class DefaultServiceLocator {private static ServiceA serviceA = new ServiceA();private static ServiceB serviceB = new ServiceB();public ServiceA createServiceAInstance() {return serviceA;}public ServiceB createServiceBInstance() {return serviceB;} }本篇文章的代碼請參照bean-creation 中的bean-creation部分。
更多精彩內(nèi)容且看:
- 區(qū)塊鏈從入門到放棄系列教程-涵蓋密碼學,超級賬本,以太坊,Libra,比特幣等持續(xù)更新
- Spring Boot 2.X系列教程:七天從無到有掌握Spring Boot-持續(xù)更新
- Spring 5.X系列教程:滿足你對Spring5的一切想象-持續(xù)更新
- java程序員從小工到專家成神之路(2020版)-持續(xù)更新中,附詳細文章教程
更多內(nèi)容請參考:flydean的博客
總結(jié)
以上是生活随笔為你收集整理的Spring5参考指南:Bean的创建的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spring5参考指南:IOC容器
- 下一篇: Spring5参考指南:依赖注入