一.spring的框架結(jié)構(gòu)
IOC(Inversion of Control控制反轉(zhuǎn)):傳統(tǒng)的方法是組件(一個(gè)個(gè)類(lèi))向容器獲取自己所需要的資源(依賴(lài)的類(lèi))泽腮,容器返回所需要的類(lèi)給它褐墅⌒梢辏控制反轉(zhuǎn)(IOC)實(shí)現(xiàn)的方法是偿凭,容器先把所有資源收集起來(lái)(首先你需要注冊(cè)了這些資源(bean)),收集起來(lái)之后就需要整理這些資源之間的依賴(lài)關(guān)系魂迄,這樣我才能知道你需要啥,我才能給你這些東西。最后容器就將不同組件所需要的資源送給他們橱健,而你要做的僅僅是選擇一種合適方式來(lái)接受我給你的資源。
DI(Dependency Injection依賴(lài)注入):我們的組件需要以一種什么樣的方式來(lái)接受你給的資源呢贞远?通常我們會(huì)使用事先定義好的set方法來(lái)對(duì)資源進(jìn)行注入畴博。
DL(Dependency Lookup依賴(lài)查找):這個(gè)當(dāng)前實(shí)體主動(dòng)去尋找某個(gè)服務(wù)注冊(cè)地查找其依賴(lài)的那些服務(wù)。
spring的三種依賴(lài)注入方式:
第一種:屬性注入(下面的案例就是)蓝仲,屬性注入就是通過(guò)set方法注入bean的屬性值或依賴(lài)對(duì)象俱病,屬性注入使用xml中的<property>元素,name屬性用來(lái)指定bean 的屬性名稱(chēng)袱结,value用來(lái)指定屬性的值亮隙。這種為最常用的方式。(后期通過(guò)javaConfig的形式來(lái)進(jìn)行收集和注冊(cè)垢夹,不在是使用xml文件)溢吻。
第二種:構(gòu)造器注入,就是通過(guò)使用構(gòu)造方法注入bean的屬性值還有依賴(lài)對(duì)象,直接保證在bean實(shí)例化之后可以使用促王。在xml中<constructor-tag>元素里面聲明犀盟,沒(méi)有name屬性。
第三種:工廠的方式注入蝇狼,很少使用所以不提阅畴。另一種字面值注入,字面值的意思就是可以用字符串表示的值迅耘〖妫基本數(shù)據(jù)類(lèi)型及其封裝類(lèi)、String等類(lèi)型都可以采取字面值注入的方式颤专。若字面值中包含特殊字符纽哥,可以使用把字面值包裹起來(lái)。
舉個(gè)例子:我們需要準(zhǔn)備的以下類(lèi),所需要的資源和組件
// 接口? HelloWorld? 【資源】
public interface HelloWorld{
? ? ? public void sayHello();
}
//繼承 HelloWorld接口的實(shí)現(xiàn)類(lèi) ?('"控制臺(tái)輸出Spring say Hello!") ?【資源】
public class SpringHelloWorld implements HelloWorld {
? ? ? ?public void sayHello()? {
? ? ? ? ? System.out.println("Spring say Hello!");
? ? ? ? }
}
// 繼承 HelloWorld接口的實(shí)現(xiàn)類(lèi)? ('"控制臺(tái)輸出Structs2 say Hello!") 【資源】
public class StrutsHelloWorld ?implements HelloWorld {
? ? ? public void sayHello()? {
? ? ? ? ? ? ? ? System.out.println("Structs2 say Hello!");
? ? ? }
}
//? 以上兩個(gè)類(lèi)都繼承同一個(gè)接口栖秕,方法里的具體實(shí)現(xiàn)不同? 【組件】
// 服務(wù)類(lèi) HelloWorldService
public class HelloWorldService { ??
// 定義一個(gè)HelloWorld接口類(lèi)型的變量
? ? ? ?private HelloWorld helloWorld;
// 構(gòu)造函數(shù) HelloWorldService
? ? ? ?public HelloWorldService()? {
? ? ? ?}
//重點(diǎn)? 我們需要 定義get,set方法 春塌,使得spring 框架中的 IOC (控制反轉(zhuǎn)) 能夠?qū)elloWorldService 進(jìn)行管理
? ? ? public void setHelloWorld(HelloWorld helloWorld) {
? ? ? ? ? ? this.helloWorld = helloWorld;
? ? }
? ? ? public HelloWorld getHelloWorld() {
? ? ? ? ? ? return this.helloWorld;
? ? ?}
}
//我們需要對(duì)HelloWorldService 和HelloWorld 之間進(jìn)行管理 還需要借助bean.xml文件(主要功能是注冊(cè)資源,并聲明好組件之間的關(guān)系)
<beanid="springHelloWorld"
? ? ? class="com.yiibai.tutorial.spring.helloworld.impl.SpringHelloWorld"></bean>? ? <!-- springHelloWorld類(lèi)的具體所在上下文路徑-->
<beanid= " strutsHelloWorld"
? ? ? class="com.yiibai.tutorial.spring.helloworld.impl.StrutsHelloWorld"> <bean> ??
<beanid = "helloWorldService"
? ? ? class = " com.yiibai.tutorial.spring.helloworld.HelloWorldService" ? ?<!--同樣是類(lèi)的上下路徑-->
? ? ? <propertyname = "helloWorld" ,ref = "springHelloWorld"/>?
<bean>
?
propertyname 是屬性名累魔,用來(lái)聲明創(chuàng)建HelloWorldService的時(shí)候摔笤,對(duì)應(yīng)創(chuàng)建的具體類(lèi)是springHelloWorld ?。
最后是主函數(shù)的調(diào)用
// 類(lèi)HelloProgram 主方法
public class HelloProgram {
? public static void main(String[] args) {
? ? ?ApplicationContext context =
? ? ?new ClassPathXmlApplicationContext("beans.xml");? ? ? ? ? //ClassPathXmlApplicationContext使用此方法可以獲得HelloWorldService的 ? ? ? HelloWorldService service = ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//路勁
? ? ?(HelloWorldService) context.getBean("helloWorldService");
? ? HelloWorld hw= service.getHelloWorld(); ? ? ? ? ?
? ? ?hw.sayHello();
? ? ?}
}