1截驮、Spring Ioc 控制反轉(zhuǎn)【大工廠】
- IoC 控制反轉(zhuǎn)
Spring IoC:Inversion of Control ,控制反轉(zhuǎn)。通過(guò)IoC容器來(lái)管理所有java對(duì)象的實(shí)例化和初始化定枷,控制對(duì)象與對(duì)象之間的依賴關(guān)系,即java Bean届氢,類似于使用關(guān)鍵new創(chuàng)建對(duì)象欠窒。
老流程:一個(gè)類調(diào)用其他類的屬性或方法,通過(guò)new object()的方式將后者的對(duì)象創(chuàng)建出來(lái)退子,然后開(kāi)始調(diào)用屬性或方法岖妄。
Spring中,JAVA對(duì)象創(chuàng)建的控制權(quán)掌握在IoC容器中寂祥,步驟:
1荐虐、開(kāi)發(fā)人員通過(guò)XML配置文件、注解丸凭、JAVA配置類等方式福扬,對(duì)java對(duì)象進(jìn)行定義,比如在XML配置文件中使用<bean>標(biāo)簽惜犀、在JAVA類中使用@component注解等忧换。
2、Spring啟動(dòng)向拆,IoC容器會(huì)自動(dòng)根據(jù)對(duì)象定義進(jìn)行創(chuàng)建和管理亚茬,即Spring Bean。
3浓恳、當(dāng)我們使用某個(gè)Bean時(shí)刹缝,可以直接從IoC容器中獲取,而不需要手動(dòng)通過(guò)代碼創(chuàng)建颈将。 - 依賴注入(DI)
依賴注入:DI,Dependency Injection梢夯。在面向?qū)ο笾校瑢?duì)象和對(duì)象的關(guān)系是依賴的關(guān)系晴圾。 - IoC容器的兩種實(shí)現(xiàn)
IoC容器的底層就是一個(gè)Bean工廠颂砸。Spring框架提供了兩種不同類型的IoC容器,即BeanFactory和ApplicationContext死姚。
2人乓、Spring Bean定義【產(chǎn)品】
由Spring IoC容器管理的對(duì)象成為Bean,根據(jù)Spring配置文件中的信息創(chuàng)建。
Spring配置文件支持兩種格式:XML文件格式和Properties文件格式都毒。
- Properties
配置文件主要是以key-value鍵值對(duì)的形式存在色罚,只能賦值。 - XML
配置文件采用樹(shù)形結(jié)構(gòu)账劲,結(jié)構(gòu)清晰戳护。
Beans.xml配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<bean id="helloWorld" class="net.biancheng.c.HelloWorld">
<property name="message" value="Hello World!"/>
</bean>
</beans>
3金抡、Spring Bean屬性注入
非常詳細(xì)且寫(xiě)的很好的文章:http://c.biancheng.net/spring/attr-injection.html
Bean屬性注入,就是將屬性注入到Bean中的過(guò)程腌且,既可以是普通屬性梗肝,也可以是一個(gè)對(duì)象(Bean).
Spring主要通過(guò)2種方式進(jìn)行Bean屬性注入:
- 構(gòu)造函數(shù)注入
- setter注入(設(shè)值注入)
Spring注入集合:
1、構(gòu)造函數(shù)注入
使用構(gòu)造函數(shù)注入铺董,大致步驟如下:
1巫击、在Bean中添加一個(gè)有參構(gòu)造函數(shù),構(gòu)造函數(shù)內(nèi)的每一個(gè)參數(shù)代表一個(gè)需要注入的屬性
2柄粹、在Spring的XML配置文件中喘鸟,通過(guò)<beans>及其展示<bean>對(duì)Bean進(jìn)行定義
3匆绣、在<bean>元素內(nèi)使用<constructor-arg>
元素驻右,對(duì)構(gòu)造函數(shù)內(nèi)的屬性進(jìn)行賦值,bean的構(gòu)造函數(shù)內(nèi)有多少參數(shù)崎淳,就需要使用多少個(gè)<constructor-arg>元素堪夭。
2、setter注入
使用setter方法拣凹,將屬性值注入到Bean的屬性中森爽,大致步驟如下:
1、在Bean中提供一個(gè)默認(rèn)的無(wú)參構(gòu)造函數(shù)(在沒(méi)有其他帶參構(gòu)造函數(shù)的情況下嚣镜,可省略)爬迟,并為所有需要注入的屬性提供一個(gè)setXxx()
方法
2、在Spring的XML配置文件中菊匿,使用<bean>及其子元素<bean>對(duì)Bean進(jìn)行定義
3付呕、在<bean>元素內(nèi)使用<property>
元素對(duì)各個(gè)屬性進(jìn)行賦值
#1、構(gòu)造函數(shù)注入
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<bean id="student" class="net.biancheng.c.Student">
<constructor-arg name="id" value="2"></constructor-arg>
<constructor-arg name="name" value="李四"></constructor-arg>
<constructor-arg name="grade" ref="grade"></constructor-arg>
</bean>
<bean id="grade" class="net.biancheng.c.Grade">
<constructor-arg name="gradeId" value="4"></constructor-arg>
<constructor-arg name="gradeName" value="四年級(jí)"></constructor-arg>
</bean>
</beans>
#2跌捆、setter注入(設(shè)值注入)
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<bean id="student" class="net.biancheng.c.Student">
<!--使用 property 元素完成屬性注入
name: 類中的屬性名稱徽职,例如 id,name
value: 向?qū)傩宰⑷氲闹?例如 學(xué)生的 id 為 1,name 為張三
-->
<property name="id" value="1"></property>
<property name="name" value="張三"></property>
<property name="grade" ref="grade"></property>
</bean>
<bean id="grade" class="net.biancheng.c.Grade">
<property name="gradeId" value="3"></property>
<property name="gradeName" value="三年級(jí)"></property>
</bean>
</beans>
#3佩厚、內(nèi)部bean
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<bean id="employee" class="net.biancheng.c.Employee">
<property name="empNo" value="001"></property>
<property name="empName" value="小王"></property>
<property name="dept">
<!--內(nèi)部 Bean-->
<bean class="net.biancheng.c.Dept">
<property name="deptNo" value="004"></property>
<property name="deptName" value="技術(shù)部"></property>
</bean>
</property>
</bean>
</beans>