Spring Bean配置方式總結(jié)
SpringBean是Spring中最基本的組成單元,Spring 官方文檔對 Bean 的解釋是這樣的:
In Spring, the objects that form the backbone of your application and that are managed by theSpring loC container are called beans. A bean is an object that is instantiated, assembled, and managedby a Spring IoC container.
翻譯過來就是:
在Spring中,構(gòu)成應(yīng)用程序主并由SpringIoC容器管理的對象被稱為Bean。Bean是一個由SpringIoC容器實例化、組裝和管理的對象。
從官方定義中,我們可以提取出以下信息
1)Bean 是對象,一個或者多個不限定
2)Bean 托管在Spring 中一個叫作IoC的容器中
3)我們的程序是由一個個 Bean 構(gòu)成的。
Spring 是通過聲明式配置的方式來定義 Bean的,所有創(chuàng)建Bean需要的前置依賴或者參數(shù)都通過配置文件先聲明,Spring 啟動以后會解析這些聲明好的配置內(nèi)容。
那么,我們該如何定義Spring 中的 Bean呢?一般來說,Spring Bean的定義配置有3種方法。
1基于XML的方式配置,這種配置方式主要適用于以下兩類場景
(1)Bean 實現(xiàn)類來自第三方類庫,比如 DataSource 等。
(2)需要定義命名空間的配置,如 context、aop、mvc等。
舉個例子,來看一段代碼。
<beans> <import resource="resource1.xml"/>//導(dǎo)入其他配置文件Bean 的定義 <import resource="resource2,xmI" /> <bean id="userService" class="com.gp.s.UserService" init-method="init" destory-method="destory"> </bean> <bean id="message”class="java.lang.String"> <constructor-arg index="o" value="test"></constructor-arg> </bean> </beans>
這段代碼是標(biāo)準(zhǔn)的 Spring 配置內(nèi)容,首先導(dǎo)入一個叫作 resourcel.xm標(biāo)準(zhǔn)配置文件。然后,導(dǎo)入第二個標(biāo)準(zhǔn)配置文件resource2.xml。接著,定義一個叫作 userService的 Bean,對應(yīng)的類是 com.gp.s.UserService,并且聲明了在userService 實例化之后要用init0方法,在userService 銷毀之后調(diào)用destory0方法。
2基于注解掃描的方式配置,這種配置方式主要適用于開發(fā)中需要引用的類,如ControleService、Dao等,配置代碼如下。
<context:component-scan base-package="com.gp.s"> <!-- 包含的目標(biāo)類--> <context:include-filter type="regex” expression="com.gp.s.mall.*"/> <!-- 排除的目標(biāo)類--> <context;exclude-filter type="aspectj" expression="com.gp.s.mall.*Controller+"/> </context:component-scan>
在這段配置中,context:component-scan 相當(dāng)于使用了 Spring 內(nèi)置的掃描注解的組@ComponentScan ,聲明了需要掃描的基礎(chǔ)包路 com.gp.s ,把所有com.gp.s.mall 下面的子包全部納入掃描范圍,并且排除了 com.gp.s.mall包面所有以Controller 結(jié)尾或者包含 Controller 結(jié)尾的類
使用 Spring 容器管理組件的 beanName 規(guī)則,默認(rèn)是類名首字母變小寫,可以自己修改。
Spring 主要提供了 4 種內(nèi)置的注解來聲明 Bean。它們分別是
@Controller (聲明為控制層組件的Bean)、
@Service (聲明為業(yè)務(wù)邏輯層組件的 Bcan)、
@Repository (聲明為數(shù)據(jù)訪間層組件的當(dāng)對組件的層次難以定位的時候使用
@Component 注解來聲明。Bean)
Spring 提供了4個注解,這些注解的作用與XML定義 Bean 的作用一樣,都是將組件交給Spring 容器管理。組件的名稱默認(rèn)是類名 (首字母變小寫),可以自己修改。
3基于Java類的配置,這種配置方式主要適用于以下兩類場景。
(1)需要通過代碼控制對象創(chuàng)建邏輯的場景。
(2)實現(xiàn)零配置,消除XML 配置文件的場景
同樣還是舉個例子,來看一段代碼:
@Configurationpublic class BeansConfiguration { @Bean public Student student(){ Student student = new Student();student.setName("三"); student.setTeacher(teacher()); return student; } @Bean public Teacher teacher(){ Teacher teacher= new Teacher(); teacher.setName("Tom"); return teacher; } }
通過分析這段代碼,可以了解到使用基于類的配置需要以下步驟。
1)在 BeansConfiguration 類上配置@Configuration 注解,表示將 BeansConfiguration 類定義為Bean的元數(shù)據(jù)。
2)在方法上使用@Bean 注解,方法名默認(rèn)就是 Bean 的名稱,方法返回值就是 Bean 的實例
3)過AmnolationConfgApplicationContext 或子類來啟動 Spring 容器,從而加載這些已聲明好的注解配置。
總結(jié)一下,定義 Spring Bcan 的3 種方式分別是:基于XML 的方式配置、基于注解掃播方式配置、基于元數(shù)據(jù)類的配置。
那么Bcan 的配置定義好以后,Spring 又是如何加載這些 Bean 配置并創(chuàng)建 Bean 實例的哪:
Spring 解析這些聲明好的配置內(nèi)容,將這些配置內(nèi)容都轉(zhuǎn)化為 BeanDefinition 對多BeanDefinilion 中幾平保存了配置文件中聲明的所有內(nèi)容,再將 BeanDefinition 保存bcanDcfinitionMap中,以beanName 作為key,以BeanDefinition 對象作為value。之后,Spring容器根據(jù) beanName找到對應(yīng)的 BeanDefinition,再去選擇具體的創(chuàng)建策略。
以上就是Spring Bean配置方式總結(jié)的詳細(xì)內(nèi)容,更多關(guān)于Spring Bean配置方式的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
基于Java的Socket編寫的C/S聊天程序?qū)崿F(xiàn)
這篇文章主要介紹了基于Java的Socket編寫的C/S聊天程序?qū)崿F(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03Java中static關(guān)鍵字的作用和用法詳細(xì)介紹
這篇文章主要介紹了Java中static關(guān)鍵字的作用和用法詳細(xì)介紹,本文講解了static變量、靜態(tài)方法、static代碼塊、static和final一塊用等內(nèi)容,需要的朋友可以參考下2015-01-01Java編程實現(xiàn)對象克?。◤?fù)制)代碼詳解
這篇文章主要介紹了Java編程實現(xiàn)對象克隆(復(fù)制)代碼詳解,涉及了克隆的原因,如何實現(xiàn)克隆,克隆的一般步驟,深克隆與淺克隆的介紹等相關(guān)內(nèi)容,具有一定借鑒價值,需要的朋友可以參考下。2017-11-11MyEclipse去除網(wǎng)上復(fù)制下來的代碼帶有的行號(正則去除行號)
這篇文章主要介紹了MyEclipse去除網(wǎng)上復(fù)制下來的代碼帶有的行號(正則去除行號)的相關(guān)資料,需要的朋友可以參考下2017-10-10Mybatis中使用updateBatch進(jìn)行批量更新
這篇文章主要介紹了Mybatis中使用updateBatch進(jìn)行批量更新的相關(guān)資料,有逐條更新,sql批量更新等,具體實例代碼大家參考下本文2018-04-04