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ī)則,默認是類名首字母變小寫,可以自己修改。
Spring 主要提供了 4 種內(nèi)置的注解來聲明 Bean。它們分別是
@Controller (聲明為控制層組件的Bean)、
@Service (聲明為業(yè)務(wù)邏輯層組件的 Bcan)、
@Repository (聲明為數(shù)據(jù)訪間層組件的當(dāng)對組件的層次難以定位的時候使用
@Component 注解來聲明。Bean)
Spring 提供了4個注解,這些注解的作用與XML定義 Bean 的作用一樣,都是將組件交給Spring 容器管理。組件的名稱默認是類名 (首字母變小寫),可以自己修改。
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 注解,方法名默認就是 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é)的詳細內(nèi)容,更多關(guān)于Spring Bean配置方式的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
使用JAVA8 filter對List多條件篩選的實現(xiàn)
這篇文章主要介紹了使用JAVA8 filter對List多條件篩選的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03
Spring中@Autowired和@Resource注解的使用區(qū)別詳解
這篇文章主要介紹了Spring中@Autowired和@Resource注解的使用區(qū)別詳解,@Autowired默認根據(jù)type進行注入,找到與指定類型兼容的?Bean?并進行注入,如果無法通過type匹配到對應(yīng)的?Bean?的話,會根據(jù)name進行匹配,如果都匹配不到則拋出異常,需要的朋友可以參考下2023-11-11
在SpringBoot項目中如何實現(xiàn)線程池的動態(tài)監(jiān)控
Spring Boot因其簡便、高效的特點廣受開發(fā)者喜愛,在復(fù)雜的業(yè)務(wù)場景下,如何確保Spring Boot應(yīng)用的高性能和穩(wěn)定性成為了一個關(guān)鍵問題,其中,線程池的管理策略直接影響到系統(tǒng)的吞吐量和資源利用效率,本文將重點探討在Spring Boot項目中,如何實現(xiàn)線程池的動態(tài)監(jiān)控2023-10-10
Spring Boot中HTTP請求參數(shù)轉(zhuǎn)換和請求體JSON反序列化的區(qū)別解析
本文主要介紹了SpringBoot中HTTP請求參數(shù)轉(zhuǎn)換和請求體JSON反序列化的區(qū)別,本文結(jié)合實例代碼給大家介紹的非常詳細,感興趣的朋友跟隨小編一起看看吧2025-12-12

