一年又一年铅忿,字節(jié)跳動(dòng) Lark(飛書) 研發(fā)團(tuán)隊(duì)又雙叒叕開始招新生啦觉啊!
【內(nèi)推碼】:GTPUVBA
【內(nèi)推鏈接】:https://job.toutiao.com/s/JRupWVj
【招生對(duì)象】:20年9月后~21年8月前 畢業(yè)的同學(xué)
【報(bào)名時(shí)間】:6.16-7.16(提前批簡(jiǎn)歷投遞只有一個(gè)月抓住機(jī)會(huì)哦!)
【畫重點(diǎn)】:提前批和正式秋招不矛盾跋选!面試成功颓屑,提前鎖定Offer仗岸;若有失利,額外獲得一次面試機(jī)會(huì)奕删,正式秋招開啟后還可再次投遞俺泣。
點(diǎn)擊進(jìn)入我的博客
更多章節(jié)
Spring詳解1.概述
Spring詳解2.理解IoC容器
Spring詳解3.Bean的裝配
Spring詳解4.容器內(nèi)幕
Spring詳解5.AOP
Spring詳解6.基于AspectJ的AOP
Spring詳解7.Spring MVC
Spring詳解8.Spring DAO
1 Spring容器與Bean配置信息
Bean配置信息
Bean配置信息是Bean的元數(shù)據(jù)信息,它由一下4個(gè)方面組成:
- Bean的實(shí)現(xiàn)類
- Bean的屬性信息完残,如數(shù)據(jù)庫的連接數(shù)伏钠、用戶名、密碼谨设。
- Bean的依賴關(guān)系熟掂,Spring根據(jù)依賴關(guān)系配置完成Bean之間的裝配。
- Bean的行為信息铝宵,如生命周期范圍及生命周期各過程的回調(diào)函數(shù)打掘。
Bean元數(shù)據(jù)信息
Bean元數(shù)據(jù)信息在Spring容器中的內(nèi)部對(duì)應(yīng)物是一個(gè)個(gè)BeanDefinition形成的Bean注冊(cè)表,Spring實(shí)現(xiàn)了Bean元數(shù)據(jù)信息內(nèi)部表示和外部定義之間的解耦鹏秋。
Spring支持的配置方式
Spring1.0僅支持基于XML的配置尊蚁,Spring2.0新增基于注解配置的支持,Spring3.0新增基于Java類配置的支持侣夷,Spring4.0則新增給予Groovy動(dòng)態(tài)語言配置的支持横朋。
2 基于XML的配置
2.1 理解XML與Schema
<?xml version="1.0" encoding="utf-8" ?>
<beans (1)xmlns="http://www.springframework.org/schema/beans"
(2)xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:(3)context=(4)"http://www.springframework.org/schema/context"
xsi:(5)schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
</beans>
- (1)處是默認(rèn)命名空間,無命名空間前綴的元素屬于默認(rèn)命名空間百拓。
- (2)xsi標(biāo)準(zhǔn)命名空間琴锭,用于指定自定義命名空間的Schema文件
- (3)自定義命名空間的簡(jiǎn)稱晰甚,可以任意命名
- (4)自定義命名空間的全稱,必須在xsi命名空間為其指定空間對(duì)應(yīng)的Schema文件决帖,可以任意命名厕九,習(xí)慣上用文檔發(fā)布機(jī)構(gòu)的相關(guān)網(wǎng)站目錄。
- (5)為每個(gè)命名空間指定Schema文件位置地回,
詳解xmlns
- 定義:xml namespace的縮寫扁远,可譯為“XML命名空間”。
- 作用:防止XML文檔含有相同的元素命名沖突刻像,如<table>既可以表示表格畅买,又可以表示桌子。如果增加了命名空間如<table>和<t:table>就可以使兩者區(qū)分開來细睡。
- 使用:
xmlns:namespace-prefix="namespaceURI"
谷羞,其中namespace-prefix為自定義前綴,只要在這個(gè)XML文檔中保證前綴不重復(fù)即可溜徙;namespaceURI是這個(gè)前綴對(duì)應(yīng)的XML Namespace的定義湃缎。
理解xsi:schemaLocation
xsi:schemaLocation定義了XML Namespace和對(duì)應(yīng)的 XSD(Xml Schema Definition)文檔的位置的關(guān)系。它的值由一個(gè)或多個(gè)URI引用對(duì)組成萌京,兩個(gè)URI之間以空白符分隔(空格和換行均可)雁歌。第一個(gè)URI是定義的 XML Namespace的值,第二個(gè)URI給出Schema文檔的位置知残,Schema處理器將從這個(gè)位置讀取Schema文檔靠瞎,該文檔的targetNamespace必須與第一個(gè)URI相匹配。例如:
<beans
xsi:schemaLocation="http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
</beans>
這里表示Namespace為http://www.springframework.org/schema/context的Schema的位置為http://www.springframework.org/schema/context/spring-context.xsd求妹。
2.2 使用XML裝配Bean
直接裝配Bean
<!--id不可以配置多個(gè): context.getBean("myBean1, myBean2")-->
<bean class="com.ankeetc.spring.MyBean" id="myBean1, myBean2"/>
<!--context.getBean("myBean1") == context.getBean("myBean2")-->
<bean class="com.ankeetc.spring.MyBean" name="myBean1, myBean2"/>
- id:用于表示一個(gè)Bean的名稱乏盐,在容器內(nèi)不能重復(fù);不可以配置多個(gè)id制恍。
- name:用于表示一個(gè)Bean的名稱父能,在容器內(nèi)不能重復(fù);可以配置多個(gè)名稱净神,用
,
分割何吝;id和name可以都為空,此時(shí)則可以通過獲取全限定類名來獲取Bean鹃唯。 - class:全限定類名
靜態(tài)工廠方法裝配
- 靜態(tài)工廠無需創(chuàng)建工廠類示例就可以調(diào)用工廠類方法爱榕。
- factory-method:工廠方法
public class MyBeanFactory {
public static MyBean createMyBean() {
return new MyBean();
}
}
<bean id="myBean" class="com.ankeetc.spring.MyBeanFactory" factory-method="createMyBean"/>
非靜態(tài)工廠方法裝配
- 非靜態(tài)工廠方法必須首先定義一個(gè)工廠類的Bean,然后通過factory-bean引用工廠類實(shí)例坡慌。
- factory-bean:指向定義好的工廠Bean
public class MyBeanFactory {
public MyBean createMyBean() {
return new MyBean();
}
}
<bean id="myBeanFactory" class="com.ankeetc.spring.MyBeanFactory"/>
<bean id="myBean" factory-bean="myBeanFactory" factory-method="createMyBean"/>
Bean的繼承和依賴
- parent:通過設(shè)置<bean>標(biāo)簽的parent屬性黔酥,子<bean>將自動(dòng)繼承父<bean>的配置信息。
- depends-on:通過設(shè)置<bean>標(biāo)簽的depends-on屬性,Spring允許顯示的設(shè)置當(dāng)前Bean前置依賴的Bean跪者,確保前置依賴的Bean在當(dāng)前Bean實(shí)例化之前已經(jīng)創(chuàng)建好棵帽。
自動(dòng)裝配autowire
<beans>元素提供了一個(gè)default-autowire屬性可以全局自動(dòng)匹配全封,默認(rèn)為no翘瓮。<bean>元素提供了一個(gè)指定自動(dòng)裝配類型的autowire屬性,可以覆蓋<beans>元素的default-autowire屬性箕宙,該屬性有如下選項(xiàng):
自動(dòng)裝配類型 | 說明 |
---|---|
no | 顯式指定不使用自動(dòng)裝配忘衍。 |
byName | 如果存在一個(gè)和當(dāng)前屬性名字一致的 Bean仗谆,則使用該 Bean 進(jìn)行注入。如果名稱匹配但是類型不匹配淑履,則拋出異常。如果沒有匹配的類型藻雪,則什么也不做秘噪。 |
byType | 如果存在一個(gè)和當(dāng)前屬性類型一致的 Bean ( 相同類型或者子類型 ),則使用該 Bean 進(jìn)行注入勉耀。byType 能夠識(shí)別工廠方法指煎,即能夠識(shí)別 factory-method 的返回類型。如果存在多個(gè)類型一致的 Bean便斥,則拋出異常至壤。如果沒有匹配的類型,則什么也不做枢纠。 |
constructor | 與 byType 類似像街,只不過它是針對(duì)構(gòu)造函數(shù)注入而言的。如果當(dāng)前沒有與構(gòu)造函數(shù)的參數(shù)類型匹配的 Bean晋渺,則拋出異常镰绎。使用該種裝配模式時(shí),優(yōu)先匹配參數(shù)最多的構(gòu)造函數(shù)木西。 |
default | 根據(jù) Bean 的自省機(jī)制決定采用 byType 還是 constructor 進(jìn)行自動(dòng)裝配畴栖。如果 Bean 提供了默認(rèn)的構(gòu)造函數(shù),則采用 byType八千;否則采用 constructor 進(jìn)行自動(dòng)裝配吗讶。 |
通過util命名空間配置集合類型的Bean
<util:list></util:list>
<util:set></util:set>
<util:map></util:map>
2.3 使用XML依賴注入
屬性配置
- Bean有一個(gè)無參數(shù)的構(gòu)造器
- 屬性有對(duì)應(yīng)的Setter函數(shù)
- 屬性命名滿足JavaBean的屬性命名規(guī)范
<bean class="com.ankeetc.spring.MyBean" id="myBean">
<property name="prop" value="prop"/>
</bean>
構(gòu)造方法
- constructor-arg中的type和index可以沒有,只要能保證可以唯一的確定對(duì)應(yīng)的構(gòu)造方法即可
- type中基本數(shù)據(jù)類型和對(duì)應(yīng)的包裝類不能通用
- 循環(huán)依賴:如果兩個(gè)Bean都采用構(gòu)造方法注入恋捆,而且都通過構(gòu)造方法入?yún)⒁脤?duì)方照皆,就會(huì)造成循環(huán)依賴導(dǎo)致死鎖。
<bean class="com.ankeetc.spring.MyBean" id="myBean">
<constructor-arg type="java.lang.String" index="0" value="abc"/>
<constructor-arg type="int" index="1" value="10"/>
</bean>
2.4 注入?yún)?shù)
字面值
- 基本數(shù)據(jù)類型及其封裝類鸠信、String都可以采取字面值注入纵寝。
- 特殊字符可以使用
<![CDATA[]]>
節(jié)或者轉(zhuǎn)義序列
引用其他Bean
<ref>元素可以通過以下三個(gè)屬性引用容器中的其他Bean:
- bean:通過該屬性可以引用同一容器或父容器的Bean,這是最常見的形式。
- local:通過該屬性只能引用同一配置文件中定義的Bean爽茴,它可以利用XML解析器自動(dòng)檢驗(yàn)引用的合法性葬凳,以便在開發(fā)編寫配置時(shí)能夠及時(shí)發(fā)現(xiàn)并糾正配置的錯(cuò)誤。
- parent:引用父容器中的Bean室奏,如<ref parent="car">的配置說明car的Bean是父容器中的Bean火焰。
內(nèi)部Bean
- 內(nèi)部Bean只會(huì)被當(dāng)前Bean引用,不會(huì)被容器中其他的Bean引用
- 內(nèi)部Bean即使提供了id胧沫、name昌简、scope也會(huì)被忽略,Scope默認(rèn)為prototype類型绒怨。
<bean id="prop" class="com.ankeetc.spring.Prop">
<property name="value" value="1314"/>
</bean>
<bean id="myBean" class="com.ankeetc.spring.MyBean">
<property name="prop">
<!--內(nèi)部Bean即使提供了id纯赎、name、scope也會(huì)被忽略-->
<bean id="prop" class="com.ankeetc.spring.Prop">
<property name="value" value="520"/>
</bean>
</property>
</bean>
null值
- 使用
<null/>
代表null值
級(jí)聯(lián)屬性
- Spring支持級(jí)聯(lián)屬性如
prop.value
南蹂,而且支持多層級(jí)聯(lián)屬性 - 級(jí)聯(lián)屬性必須有初始值犬金,否則會(huì)拋出
NullValueInNestedPathException
public class MyBean {
// 必須初始化
private Prop prop = new Prop();
public Prop getProp() {
return prop;
}
public void setProp(Prop prop) {
this.prop = prop;
}
}
<bean id="myBean" class="com.ankeetc.spring.MyBean">
<property name="prop.value" value="1314"/>
</bean>
集合類型屬性
- List、Set六剥、Map:通過<list><set><map><entry>等標(biāo)簽可以設(shè)置List晚顷、Set、Map的屬性
- Properties:可以通過<props><prop>等標(biāo)簽設(shè)置Properties的屬性疗疟,Properties屬性的鍵值都只能是字符串该默。
- 集合合并:子Bean可以繼承父Bean的同名屬性集合元素,并且使用merge屬性選擇是否合并策彤,默認(rèn)不合并栓袖。
<bean id="parentBean" class="com.ankeetc.spring.MyBean">
<property name="list">
<list>
<value>1314</value>
</list>
</property>
</bean>
<bean id="myBean" class="com.ankeetc.spring.MyBean" parent="parentBean">
<property name="list">
<list merge="true">
<value>520</value>
</list>
</property>
</bean>
2.5 多配置文件整合
- 可以通過ApplicationContext加載多個(gè)配置文件,此時(shí)多個(gè)配置文件中的<bean>是可以互相訪問的锅锨。
- 可以通過XML中的<import>將多個(gè)配置文件引入到一個(gè)文件中叽赊,這樣只需要加載一個(gè)配置文件即可。
2.6 Bean的作用域
類型 | 說明 |
---|---|
singleton | 在Spring IoC容器中僅存在一個(gè)Bean實(shí)例必搞,Bean以單實(shí)例的方式存在 |
prototype | 每次從容器中調(diào)用Bean時(shí)必指,都返回一個(gè)新的實(shí)例 |
request | 每次HTTP請(qǐng)求都會(huì)創(chuàng)建一個(gè)新的Bean,該作用域僅適用于WebApplicationContext環(huán)境 |
session | 同一個(gè)HTTP session共享一個(gè)Bean恕洲,不同的HTTP session使用不同的Bean塔橡,該作用域僅適用于WebApplicationContext環(huán)境 |
globalSession | 同一個(gè)全局Session共享一個(gè)Bean,一般用于Portlet環(huán)境霜第,該作用域僅適用于WebApplicationContext環(huán)境 |
singleton作用域
- 無狀態(tài)或者狀態(tài)不可變的類適合使用單例模式
- 如果用戶不希望在容器啟動(dòng)時(shí)提前實(shí)例化singleton的Bean葛家,可以使用lazy-init屬性進(jìn)行控制
- 如果該Bean被其他需要提前實(shí)例化的Bean所引用,那么Spring將會(huì)忽略lazy-init的設(shè)置
prototype作用域
- 設(shè)置為scope="prototype"之后泌类,每次調(diào)用getBean()都會(huì)返回一個(gè)新的實(shí)例
- 默認(rèn)情況下癞谒,容器在啟動(dòng)時(shí)不會(huì)實(shí)例化prototype的Bean
- Spring容器將prototype的Bean交給調(diào)用者后就不再管理它的生命周期
Web應(yīng)用環(huán)境相關(guān)的Bean作用域
見后續(xù)章節(jié)
作用域依賴的問題
見后續(xù)章節(jié)
3 FactoryBean
由于實(shí)例化Bean的過程比較負(fù)責(zé),可能需要大量的配置,這是采用編碼的方式可能是更好的選擇弹砚。Spring提供了FactoryBean工廠類接口双仍,用戶可以實(shí)現(xiàn)該接口定制實(shí)例化Bean的邏輯。當(dāng)配置文件中<bean>的class屬性配置的是FactoryBean的子類時(shí)桌吃,通過getBean()返回的不是FactoryBean本身朱沃,而是getObject()方法所返回的對(duì)象,相當(dāng)于是FactoryBean#getObject()代理了getBean()方法茅诱。
-
T getObject() throws Exception;
:返回由FactoryBean創(chuàng)建的Bean實(shí)例逗物,如果isSingleton()返回的是true,該實(shí)例會(huì)放到Spring容器的實(shí)例緩存池中瑟俭。 -
Class<?> getObjectType();
:返回該FactoryBean創(chuàng)建的Bean的類型 -
boolean isSingleton();
:創(chuàng)建的Bean是singleton的還是prototype
/**
* 實(shí)現(xiàn),分割的方式配置 KFCCombo 屬性
*/
public class KFCFactoryBean implements FactoryBean<KFCCombo> {
private String prop;
public String getProp() {
return prop;
}
// 接受,分割的屬性設(shè)置信息
public void setProp(String prop) {
this.prop = prop;
}
// 實(shí)例化KFCCombo
public KFCCombo getObject() throws Exception {
KFCCombo combo = new KFCCombo();
String[] props = prop.split(",");
combo.setBurger(props[0]);
combo.setDrink(props[1]);
return combo;
}
public Class<?> getObjectType() {
return KFCCombo.class;
}
// true則放進(jìn)容器緩存池翎卓,false則每次都調(diào)用getObject()方法返回新的對(duì)象
public boolean isSingleton() {
return false;
}
}
<bean id="combo" class="com.ankeetc.spring.KFCFactoryBean">
<property name="prop" value="ZingerBurger, PepsiCola"/>
</bean>
4 基于注解的配置
4.1 支持的注解
@Component:在Bean的實(shí)現(xiàn)類上直接標(biāo)注,可以被Spring容器識(shí)別
@Repository:用于對(duì)DAO實(shí)現(xiàn)類進(jìn)行標(biāo)柱
@Service:用于對(duì)Service實(shí)現(xiàn)類進(jìn)行標(biāo)注
@Controller:用于對(duì)Controller實(shí)現(xiàn)類進(jìn)行標(biāo)注
4.2 掃描注解定義對(duì)Bean
Spring提供了一個(gè)context命名空間摆寄,用于掃描以注解定義Bean的類莲祸。
<!--生命c(diǎn)ontext命名空間-->
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.0.xsd">
<context:component-scan base-package="com.ankeetc.spring"/>
</beans>
base-package屬性
- 指定一個(gè)需要掃描的基類包,Spring容器會(huì)掃描這個(gè)包下的所有類椭迎,并提取標(biāo)注了相關(guān)注解的Bean。
resource-pattern屬性
- 如果不希望掃描base-package下的所有類田盈,可以使用該屬性提供過濾
- 該屬性默認(rèn)是
**/*.class
畜号,即基包下的所有類
<context:exclude-filter>與<context:include-filter>
- <context:exclude-filter>:表示要排除的目標(biāo)類
- <context:include-filter>:表示要包含的目標(biāo)類
- <context:component-scan>可以有多個(gè)上述兩個(gè)子元素;首先根據(jù)exclude-filter列出需要排除的黑名單允瞧,然后再根據(jù)include-filter流出需要包含的白名單简软。
類別 | 示例 | 說明 |
---|---|---|
annotation | com.ankeetc.XxxAnnotation | 所有標(biāo)注了XxxAnnotation的類。該類型采用目標(biāo)類是否標(biāo)志了某個(gè)注解進(jìn)行過濾述暂。 |
assignable | com.ankeetc.XxService | 所有繼承或擴(kuò)展XXXService的類痹升。該類型采用目標(biāo)類是否繼承或者擴(kuò)展了某個(gè)特定類進(jìn)行過濾 |
aspectj | com.ankeetc..*Service+ | 所有類名以Service結(jié)束的類及繼承或者擴(kuò)展他們的類。該類型采用AspectJ表達(dá)式進(jìn)行過濾 |
regex | com.ankeetc.auto..* | 所有com.ankeetc.auto類包下的類畦韭。該類型采用正則表達(dá)式根據(jù)目標(biāo)類的類名進(jìn)行過濾 |
custom | com.ankeetc.XxxTypeFilter | 采用XxxTypeFilter代碼方式實(shí)現(xiàn)過濾規(guī)則疼蛾,該類必須實(shí)現(xiàn)org.springframework.core.type.TypeFilter接口 |
use-default-filters屬性
- use-default-filters屬性默認(rèn)值為true,表示會(huì)對(duì)標(biāo)注@Component艺配、@Controller察郁、@Service、@Reposity的Bean進(jìn)行掃描转唉。
- 如果想僅掃描一部分的注解皮钠,需要將該屬性設(shè)置為false。
<!-- 僅掃描標(biāo)注了@Controller注解的類-->
<context:component-scan base-package="com.ankeetc.spring" use-default-filters="false">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
4.3 自動(dòng)裝配
@Component
public class KFCCombo {
@Autowired
private PepsiCola cola;
@Autowired
private Map<String, Cola> colaMap;
@Autowired
private List<ZingerBurger> burgerList;
private ZingerBurger burger;
@Autowired
public void setBurger(@Qualifier(value = "zingerBurger") ZingerBurger burger) {
this.burger = burger;
}
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"classpath:/beans.xml"});
KFCCombo combo = context.getBean(KFCCombo.class);
}
}
interface Cola {}
@Order(value = 1)
@Component
class CocaCola implements Cola {}
@Order(value = 2)
@Component
class PepsiCola implements Cola {}
@Component(value = "zingerBurger")
class ZingerBurger {
}
@Autowired注解
- 使用該注解可以按類型自動(dòng)裝配對(duì)應(yīng)的Bean
- 沒有找到對(duì)應(yīng)的Bean則會(huì)拋出NoSuchBeanDefinitionException異常
- 使用required=false屬性可以設(shè)置即使找不到對(duì)應(yīng)的Bean(即為null)也不會(huì)拋出異常
- @Autowired可以對(duì)類成員變量及方法入?yún)⑦M(jìn)行標(biāo)注
@Quaifiler
- 如果容器中有一個(gè)以上匹配的Bean時(shí)赠法,可以按照Bean名字查找對(duì)應(yīng)的Bean
- @Quaifiler需要與@Autowired配合使用
對(duì)集合類進(jìn)行標(biāo)注
- 可以使用@Autowired對(duì)集合類進(jìn)行標(biāo)注麦轰,Spring會(huì)講容器中按類型匹配對(duì)所有Bean注入進(jìn)來
- 可以使用@Order指定加載順序,值越小的越先加載
@Lazy延遲加載
- 可以使用@Lazy實(shí)現(xiàn)延遲加載,不會(huì)立即注入屬性值款侵,而是延遲到調(diào)用此屬性對(duì)時(shí)候才會(huì)注入屬性值末荐。
@Resource和@Inject
- Spring支持JSR-250中@Resource注解和JSR-330的@Inject注解
- @Resource采用的是按照名稱加載的方式,它要求提供一個(gè)Bean名稱的屬性喳坠,如果屬性為空鞠评,則自動(dòng)采用標(biāo)注處的變量名或方法名作為Bean的名稱。
- @Inject是按照類型匹配注入Bean的壕鹉。
- 由于這兩個(gè)注解功能沒有@Autowired功能強(qiáng)大剃幌,一般不需要使用。
4.4 Bean作用范圍及生命周期
- 注解配置的Bean默認(rèn)作用范圍為singleton晾浴,可以使用@Scope顯示指定作用范圍
- 可以使用@PostConstruct和@PreDestroy注解來達(dá)到init-method和destroy-method屬性的功能负乡。
- @PostConstruct和@PreDestroy注解可以有多個(gè)
5 基于Java類的配置
5.1 @Configuration注解
- JavaConfig是Spring的一個(gè)子項(xiàng)目,旨在通過Java類的方式提供Bean的定義信息脊凰。
- 普通的POJO標(biāo)注了@Configuration注解抖棘,就可以被Spring容器提供Bean定義信息。
- @Configuration注解本身已經(jīng)標(biāo)注了@Component注解狸涌,所以任何標(biāo)注了@Configuration的類都可以作為普通的Bean切省。
5.2 @Bean注解
- @Bean標(biāo)注在方法上,用于產(chǎn)生一個(gè)Bean
- Bean的類型由方法的返回值的類型確定帕胆,Bean名稱默認(rèn)與方法名相同朝捆,也可以顯示指定Bean的名稱。
- 可以使用@Scope來控制Bean的作用范圍懒豹。
5.3 啟動(dòng)Spring容器
通過@Configuration類啟動(dòng)Spring容器
- 可以直接設(shè)置容器啟動(dòng)要注冊(cè)的類
- 可以向容器中注冊(cè)新的類芙盘,注冊(cè)了新的類要記得refresh
- 可以通過@Import將多個(gè)配置類組裝稱一個(gè)配置類
public class Main {
public static void main(String[] args) {
// (1)可以直接設(shè)置容器啟動(dòng)要加載的類
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(DaoConfig.class);
// (2)可以向容器中注冊(cè)新的類
((AnnotationConfigApplicationContext) applicationContext).register(ServiceConfig.class);
// (3)注冊(cè)了新的類要記得refresh
((AnnotationConfigApplicationContext) applicationContext).refresh();
}
}
@Configuration
class DaoConfig {
@Bean
public String getStr() {
return "1314";
}
}
@Configuration
@Import(DaoConfig.class)
// (4)可以通過@Import將多個(gè)配置類組裝稱一個(gè)配置類
class ServiceConfig {
}
通過XML配置文件引用@Configuration的配置
標(biāo)注了@Configureation的配置類本身也是一個(gè)bean,它可以被Spring的<context:component-scan>掃描到脸秽。如果希望將此配置類組裝到XML配置文件中儒老,通過XML配置文件啟動(dòng)Spring容器,僅在XML文件中通過<context:component-scan>掃描到相應(yīng)的配置類即可记餐。
<context:component-scan base-package="com.ankeetc.spring" resource-pattern="Config.class"/>
通過@Configuration配置類引用XML配置信息
在標(biāo)注了@Configuration的配置類中驮樊,可以通過@ImportResource引入XML配置文件。
@Configuration
@ImportResource("classpath:beans.xml")
public class Config {
}