Spring淺入淺出——不吹牛逼不裝逼
前言:
今天決定要開始總結(jié)框架了,雖然以前總結(jié)過兩篇,但是思維是變化的,而且也沒有什么規(guī)定說總結(jié)過的東西就不能再總結(jié)了,是吧。這次總結(jié)我命名為淺入淺出,主要在于理解框架核心,輕松愉快使用框架。
?
核心思想
我們都學(xué)了面向?qū)ο?,在生活中,?dāng)人們需要一件東西時(shí),第一反應(yīng)就是找東西,例如想吃面包,現(xiàn)在有兩種情況,第一種是沒有面包店,第二種是有面包店。第一種情況就是我們之前一直遇到的情況,在沒有面包店的情況下,最直觀的做法可能就是你按照自己的口味制作面包,也就是一個(gè)面包需要主動(dòng)制作,誰想吃了就自己New。而我主要說的是第二種情況,就是有面包店,你想吃面包的時(shí)候找到面包店,把自己的口味告訴店家,店家就可以給你做符合你口味的面包了。注意:你并沒有制作面包,而是由店家制作,但是完全符合你的口味。
?
這是一個(gè)很生活的例子,大家都明白,但這里包含了Spring中很重要的思想——控制反轉(zhuǎn),就是把制作面包的主動(dòng)權(quán)交給店家,面包就是對(duì)象,店家相當(dāng)于一個(gè)大容器,你想要什么對(duì)象,就讓大容器去給你生產(chǎn),這就是控制反轉(zhuǎn)思想。
?
再詳細(xì)點(diǎn),當(dāng)某個(gè)Java對(duì)象(調(diào)用者,例如你)需要調(diào)用另一個(gè)Java對(duì)象(被調(diào)用者,即被依賴對(duì)象,例如面包)時(shí),在傳統(tǒng)編程模式下,調(diào)用者通常會(huì)采用“New
被調(diào)用者”的代碼方式來創(chuàng)建對(duì)象(例如你自己制作面包)。這種方式會(huì)增加調(diào)用者與被調(diào)用者之間的耦合性,不利于后期代碼的升級(jí)和維護(hù)。
?
當(dāng)Spring框架出現(xiàn)后,對(duì)象的實(shí)例不再由調(diào)用者來創(chuàng)建,而是由
Spring容器(例如面包店)來創(chuàng)建。Spring容器會(huì)負(fù)責(zé)控制程序之間的關(guān)系(例如面包店負(fù)責(zé)控制你與面包的關(guān)系),而不是由調(diào)用者的程序代碼直接控制。這樣,控制權(quán)由調(diào)用者轉(zhuǎn)移到Spring容器,控制權(quán)發(fā)生了反轉(zhuǎn),這就是Spring的控制反轉(zhuǎn)。
?
在之前,我們需要用構(gòu)造方法或者set()方法給一些成員變量賦值,從Spring容器角度來看,Spring容器負(fù)責(zé)將被依賴對(duì)象賦值給調(diào)用者的成員變量,相當(dāng)于為調(diào)用者注入它所依賴的實(shí)例,這就是Spring的依賴注入。
?
綜上所述,控制反轉(zhuǎn)是一種通過描述(在Spring中可以是XML或注解)并通過第三方去產(chǎn)生或獲取特定對(duì)象的方式。在Spring中實(shí)現(xiàn)控制反轉(zhuǎn)的是IoC容器,其實(shí)現(xiàn)方法是依賴注入。
?
?
Spring IoC容器
看完上面所述,我們知道實(shí)現(xiàn)控制反轉(zhuǎn)的是Spring IoC容器。Spring
IoC容器的設(shè)計(jì)主要是基于BeanFactory和ApplicationContext兩個(gè)接口。
?
先說BeanFactory,它提供了完整的IoC服務(wù)支持,是一個(gè)管理Bean的工廠,主要負(fù)責(zé)初始化各種Bean。BeanFactory接口有多個(gè)實(shí)現(xiàn)類,其中比較常用的是org.springframework.beans.factory.xml.XmlBeanFactory,該類會(huì)根據(jù)XML配置文件中的定義來裝配Bean.由于BeanFactory實(shí)例加載Spring配置文件在實(shí)際開發(fā)中并不多見,只需了解即可,我也不過多解說了。
?
再說ApplicationContext,它是BeanFactory的子接口,也稱為應(yīng)用上下文,ApplicationContext接口除了包含BeanFactory的所有功能以外,還添加了對(duì)國際化、資源訪問、事件傳播等內(nèi)容的支持。創(chuàng)建ApplicationContext接口實(shí)例通常有三種方法:
1、 通過ClassPathXmlApplicationContext創(chuàng)建
2、 通過FileSystemXmlApplicatonContext創(chuàng)建
3、 通過Web服務(wù)器實(shí)例化ApplicationContext容器
?
作為一個(gè)初學(xué)者,我覺得先會(huì)用第一種就可以了,所以我主要解說第一種,別的等你自己入門后自己看,我只做引導(dǎo)。
?
ClassPathXmlApplicationContext將從類路徑目錄(src根目錄)中尋找指定的XML配置文件,如下代碼:
?
public class Test { public static void main(String[] args) {
//初始化SPring容器,加載配置文件 ApplicationContext appCon = new
ClassPathXmlApplicationContext("spring-config.xml"); //通過容器獲得test實(shí)例 TestDao tt
= (TestDao) appCon.getBean("test"); tt.sayHello(); } }
?
?
依賴注入的類型
在Spring中實(shí)現(xiàn)IoC容器的方法是依賴注入,依賴注入的作用是在使用Spring框架創(chuàng)建對(duì)象時(shí)動(dòng)態(tài)地將其所依賴的對(duì)象(例如屬性值)注入Bean組件中,Spring框架的依賴注入通常有兩種實(shí)現(xiàn)方式,一種是使用構(gòu)造方法注入,另一種是使用屬性的setter方法注入。具體且看實(shí)例演示
?
?
實(shí)例演示
一、在pom.xml中導(dǎo)入相應(yīng)模塊
<dependencies> <dependency> <groupId>junit</groupId>
<artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope>
</dependency> <dependency> <groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId> <version>3.1.0</version>
</dependency> <dependency> <groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId> <version>1.2</version> </dependency> <dependency>
<groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId>
<version>1.2</version> </dependency> <!--spring核心依賴--> <dependency>
<groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId>
<version>5.1.38</version> </dependency> <dependency>
<groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId>
<version>5.1.5.RELEASE</version> </dependency> <dependency>
<groupId>org.springframework</groupId> <artifactId>spring-context</artifactId>
<version>5.1.5.RELEASE</version> </dependency> <dependency>
<groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId>
<version>5.1.5.RELEASE</version> </dependency> <dependency>
<groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId>
<version>5.1.5.RELEASE</version> </dependency> <dependency>
<groupId>org.springframework</groupId> <artifactId>spring-web</artifactId>
<version>5.1.5.RELEASE</version> </dependency> <dependency>
<groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId>
<version>5.1.5.RELEASE</version> </dependency> <dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId> <version>5.1.5.RELEASE</version>
</dependency> <dependency> <groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId> <version>5.1.5.RELEASE</version>
</dependency> </dependencies>
?
?
二、創(chuàng)建TestDao
package com.my.dao; public interface TestDao { public void sayHello(); }
?
三、創(chuàng)建TestDaoImpl
package com.my.dao.impl; import com.my.dao.TestDao; public class TestDaoImpl
implements TestDao { @Override public void sayHello() {
System.out.println("Hello Spring!!!"); } }
四、創(chuàng)建spring-config.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"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi: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
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd "> <bean
id="testDIDao" class="com.my.dao.impl.TestDaoImpl"/> </beans>
五、測(cè)試Test
package com.my.test; import com.my.dao.TestDao; import
com.my.dao.impl.TestDaoImpl; import com.my.service.TestService; import
org.springframework.context.ApplicationContext; import
org.springframework.context.support.ClassPathXmlApplicationContext; public
class Test { public static void main(String[] args) { //調(diào)用者自己創(chuàng)建對(duì)象 TestDao
testDao = new TestDaoImpl(); testDao.sayHello(); //初始化SPring容器,加載配置文件
ApplicationContext appCon = new
ClassPathXmlApplicationContext("spring-config.xml"); //通過容器獲得test實(shí)例 TestDao tt
= (TestDao) appCon.getBean("testDIDao"); tt.sayHello(); } }
六、測(cè)試結(jié)果
?
?
七、創(chuàng)建TestService
package com.my.service; public interface TestService { public void sayHello();
}
?
八、創(chuàng)建TestServiceImpl
package com.my.service.impl; import com.my.dao.TestDao; import
com.my.service.TestService; public class TestServiceImpl implements TestService
{ private TestDao testDao; //構(gòu)造方法,用于實(shí)現(xiàn)依賴注入接口對(duì)象TestDao public
TestServiceImpl(TestDao testDao) { this.testDao = testDao; } @Override public
void sayHello() { testDao.sayHello(); } }
九、在spring-config.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"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi: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
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd ">
<!--將指定類TestDaoImpl配置給Spring,讓Spring創(chuàng)建其實(shí)例--> <bean id="testDIDao"
class="com.my.dao.impl.TestDaoImpl"/> <!--使用構(gòu)造方法注入--> <bean id="testDIService"
class="com.my.service.impl.TestServiceImpl" >
<!--將TestDIDao注入到TestDIServiceImpl類的屬性testDao上--> <constructor-arg index="0"
ref="testDIDao"/> </bean> </beans>
十、測(cè)試Test
package com.my.test; import com.my.dao.TestDao; import
com.my.dao.impl.TestDaoImpl; import com.my.service.TestService; import
org.springframework.context.ApplicationContext; import
org.springframework.context.support.ClassPathXmlApplicationContext; public
class Test { public static void main(String[] args) { //調(diào)用者自己創(chuàng)建對(duì)象 TestDao
testDao = new TestDaoImpl(); testDao.sayHello(); //初始化SPring容器,加載配置文件
ApplicationContext appCon = new
ClassPathXmlApplicationContext("spring-config.xml"); //通過容器獲得test實(shí)例 TestDao tt
= (TestDao) appCon.getBean("testDIDao"); tt.sayHello();
//通過容器獲取TestService實(shí)例,測(cè)試構(gòu)造方法注入 TestService testService =(TestService)
appCon.getBean("testDIService"); testService.sayHello(); } }
?
十一、測(cè)試結(jié)果
?
?
十二、使用屬性的setter方法注入
package com.my.service.impl; import com.my.dao.TestDao; import
com.my.service.TestService; public class TestServiceImpl implements TestService
{ private TestDao testDao; //添加testDao屬性的setter方法,用于實(shí)現(xiàn)依賴注入 public void
setTestDao(TestDao testDao){ this.testDao=testDao; } @Override public void
sayHello() { testDao.sayHello(); } }
?
十三、在spring-config.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"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi: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
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd ">
<!--將指定類TestDaoImpl配置給Spring,讓Spring創(chuàng)建其實(shí)例--> <bean id="testDIDao"
class="com.my.dao.impl.TestDaoImpl"/> <!--使用setter方法注入--> <bean
id="testDIService" class="com.my.service.impl.TestServiceImpl">
<!--調(diào)用TestDIServiceImpl類的setter方法,將TestDao注入到TestServiceImpl類的屬性testDao上-->
<property name="testDao" ref="testDIDao"></property> </bean> </beans>
十四、測(cè)試Test
package com.my.test; import com.my.dao.TestDao; import
com.my.dao.impl.TestDaoImpl; import com.my.service.TestService; import
org.springframework.context.ApplicationContext; import
org.springframework.context.support.ClassPathXmlApplicationContext; public
class Test { public static void main(String[] args) { //調(diào)用者自己創(chuàng)建對(duì)象 TestDao
testDao = new TestDaoImpl(); testDao.sayHello(); //初始化SPring容器,加載配置文件
ApplicationContext appCon = new
ClassPathXmlApplicationContext("spring-config.xml"); //通過容器獲得test實(shí)例 TestDao tt
= (TestDao) appCon.getBean("testDIDao"); tt.sayHello();
//通過容器獲取TestService實(shí)例,測(cè)試setter方法注入 TestService testService =(TestService)
appCon.getBean("testDIService"); testService.sayHello(); } }
?
十五、測(cè)試結(jié)果
?
?
?
?
注入說明
在Src根目錄下創(chuàng)建Spring配置文件spring-config.xml(文件名隨意,注意后綴.xml)。在配置文件中,constructor-arg元素用于定義類構(gòu)造方法的參數(shù),index用于定義參數(shù)的位置,ref指定某個(gè)實(shí)例的引用,如果參數(shù)是常量值,ref由value代替。
?
特別鏈接
看完此篇后你覺得理解了,可以看看我以前寫的這幾篇博客,會(huì)有幫助的
《沒有無緣無故的編程 <https://www.cnblogs.com/zyx110/p/11297822.html>》
https://www.cnblogs.com/zyx110/p/11297822.html
<https://www.cnblogs.com/zyx110/p/11297822.html>
《路過別錯(cuò)過 <https://www.cnblogs.com/zyx110/p/11271820.html>》
https://www.cnblogs.com/zyx110/p/11271820.html
<https://www.cnblogs.com/zyx110/p/11271820.html>
《spring框架知多少 <https://www.cnblogs.com/zyx110/p/11022891.html>》
https://www.cnblogs.com/zyx110/p/11022891.html
<https://www.cnblogs.com/zyx110/p/11022891.html>
《用IDEA開發(fā)Spring程序 <https://www.cnblogs.com/zyx110/p/11023218.html>》
https://www.cnblogs.com/zyx110/p/11023218.html
<https://www.cnblogs.com/zyx110/p/11023218.html>
?
?
結(jié)束語
此篇Spring淺入淺出到此結(jié)束,作此篇是為了讓初學(xué)者放下心理枷鎖,先理解,其實(shí)挺好理解的,等你有信心后自己學(xué)習(xí)就可以了,希望能對(duì)一些朋友有所幫助,加油。
?
?
?
*****************************************************************************************************
我的博客園地址:https://www.cnblogs.com/zyx110/ <https://www.cnblogs.com/zyx110/>
轉(zhuǎn)載請(qǐng)說明出處
我不能保證我所說的都是對(duì)的,但我能保證每一篇都是用心去寫的,我始終認(rèn)同“分享的越多,你的價(jià)值增值越大”,歡迎大家關(guān)注我的技術(shù)分享“Java匹馬行天下”和學(xué)習(xí)心得分享“匹馬行天下”,在分享中進(jìn)步,越努力越幸運(yùn),人生贏在轉(zhuǎn)折處,改變從現(xiàn)在開始!
支持我的朋友們記得點(diǎn)波推薦哦,您的肯定就是我前進(jìn)的動(dòng)力。
?
熱門工具 換一換
感谢您访问我们的网站,您可能还对以下资源感兴趣:
调教肉文小说-国产成本人片免费av-空姐av种子无码-在线观看免费午夜视频-综合久久精品激情-国产成人丝袜视频在线观看软件-大芭区三区四区无码-啊啊好爽啊啊插啊用力啊啊-wanch视频网-国产精品成人a免费观看