???????Bean(類)包裝的是一個 Object,把Bean理解為類的代理或代言人(實際上確實是通過反射毛秘、代理來實現(xiàn)的)纯趋,這樣它就能代表類擁有該擁有的東西了
?IOC容器
IOC: ioc強(qiáng)調(diào)由第三方容器根據(jù)客戶的需求堪滨,創(chuàng)建對象,然后根據(jù)客戶供的方法將對象傳遞給客戶
容器的本質(zhì): 它就是一個map集合,鍵:id 值:容器創(chuàng)建的對象
DI: 強(qiáng)調(diào)第三方創(chuàng)建對象以后 通過什么方法將對象傳遞過去SpringIOC
XML文件配置方式
一、Bean的創(chuàng)建衰猛、獲取
1、 <bean id="boyId" class="com.wtu.spring.ioc.type1.Boy">
<property name="name1" value="value1" />
<property name="name2" value="value2" />
</bean>
id:對該Bean的唯一標(biāo)識
class:類的全路徑
2刹孔、通過中間類的靜態(tài)方法創(chuàng)建
<bean id="ClassID" class="com.wtu.spring.bean.create2.Middle"
factory-method="getInstance" />
factory-method:通過中間類的哪個函數(shù)來創(chuàng)建對象
3啡省、通過中間類的非靜態(tài)方法創(chuàng)建
首先注冊中間類
<bean id="middleId" class="com.wtu.spring.bean.create3.Middle"/>
//依據(jù)中間類來創(chuàng)建對象
<bean id="ClassID"
factory-bean="middleId"
factory-method="getInstance"/>
factory-bean:引用中間類的對象
factory-method:中間類構(gòu)建對象的方法名稱
4、獲取Bean對象
//啟動IOC容器
//ClassPathXmpApplicationContext(String... configLocations);
ApplicationContext ac = new ClassPathXmlApplicationContext("xmlPath:從src開始");
Class class = (Class) ac.getBean("CLassID");
二髓霞、bean的繼承
含義:一個Bean可以繼承另一個bean的屬性
<bean id="parentID" class="parentClass">
<property name="name" value="value"/>
</bean>
<bean id="sonID" class="sonClass" parent="parentID">
<propertym name="name" value="value"/>
</bean>
parent:父親的ID
三卦睹、Bean的單例和多例模式
scope="prototype" 多例
默認(rèn)情況下時單例
四、Bean的創(chuàng)建的時間
lazy-init="true" 懶漢式
lazy-init="false" 餓漢式
在單例模式下,lazy-init的設(shè)置才有用,默認(rèn)情況下是餓漢式方库,即當(dāng)IOC創(chuàng)建后立馬創(chuàng)建相關(guān)對象
在多例模式下,lazy-init的設(shè)置沒有用结序,直到getBean("ID");時才創(chuàng)建對象
五、Spring DI
強(qiáng)調(diào)的是給Bean的屬賦值纵潦。通常將Bean的屬性以Set的方式賦值給對象的屬性
1徐鹤、屬性: 基本數(shù)據(jù)類型
<bean id="boyId" class="com.wtu.spring.ioc.type1.Boy">
<property name="name1" value="value1">/<property>
<property name="name2" value="value2">/<property>
</bean>
2、屬性: 類類型
<bean id="dateId" class="java.util.Date">
<property name="name" ref="dateId"/>
3邀层、屬性: 集合
<property name="list">
<list>
<value>value1</value>
<value>value2</value>
</list>
</property>
<property name="name">
<set>
<value>value1</value>
<value>value2</value>
</set>
</property>
<property>
<map>
<entry key="key1">
<value>value1</value>
</entry>
<entry key="key2">
<value>value2</value>
</entry>
</map>
</property>
注解方式
用注解來向Spring容器中注冊Bean,需要在applicationCOntext.xml注冊
<!--首先開啟spring注解的功能 -->
<context:annotation-config/>
<!-- 讓springIOC容器自動去掃描某一個包 創(chuàng)建該包下的bean對象 -->
<context:component-scan base-package="com.wtu.spring.di.annotation2"></context:component-scan>
當(dāng)該包下的某個類的頭上帶有注解{@Component/@Repository/@Service/Controller}就會將該
類作為Bean注冊到Spring容器中
@Controller 對應(yīng)表現(xiàn)層的Bean凳干,即Action
@Service 對應(yīng)業(yè)務(wù)層Bean
@Repository 對應(yīng)數(shù)據(jù)訪問層Bean
@Component 各層均適用(不推薦)
這四個注解形式在默認(rèn)情況下,生成的Bean的ID(Key)為首字母小寫的類名
也可指定名字eg:@Controller(value="XXX")
@Scope("prototype")只當(dāng)該Bean可以產(chǎn)生多個對象,默認(rèn)是單例
注入: 成員變量
@Resource(name="ClassID") 指定已經(jīng)注冊Bean對象的ID,默認(rèn)按屬性名來查找Bean(ByName)
@Autowired 依據(jù)成員對量的類型在IOC容器中查找Bean對象(ByType)
XML文件配置和注解形式各有優(yōu)缺點被济。
當(dāng)需要注冊的Bean對象來自第三方時,只能通過XML文件配置來實現(xiàn)
擴(kuò)展:
輔助
Spring Bean的生命周期