Spring

程序的耦合

耦合:程序間的依賴關(guān)系
包括:類之間的依賴乘凸,方法之間的依賴
解耦:降低程序見的依賴關(guān)系
實(shí)際開發(fā)中,應(yīng)該做到編譯期不依賴,運(yùn)行時(shí)才依賴

解耦的思路:

第一步,使用反射來創(chuàng)建對(duì)象何陆,而避免使用new關(guān)鍵字
第二部,通過讀取配置文件來獲取要?jiǎng)?chuàng)建的對(duì)象全限定類名

//1.注冊驅(qū)動(dòng)
//DriverManager.registerDriver(new com.mysql.jabc.DriverI());依賴于jar包豹储,如果缺少則會(huì)在編譯期時(shí)就報(bào)錯(cuò)
Class.forName("com.mysql.jdbc.Driver");//一個(gè)字符串
//2.獲取連接
Connection conn=DriverManager.getConnection(url:"jdbc:mysql://localhost:3306");
//3.獲取操作數(shù)據(jù)庫的預(yù)處理對(duì)象
PreparedStatement pstm=conn.prepareStatement(sql:"select * from emp");
//4.執(zhí)行SQL贷盲,得到結(jié)果集
ResultSet rs=pstm.executeQuery();
//5.遍歷結(jié)果集
while(rs.nest()){
  System.out.println(rs.getString(columnLabel:"enam"));
}
//6.釋放資源
rs.close();
pstm.close();
conn.close();

創(chuàng)建Bean對(duì)象的工廠

Bean:在計(jì)算機(jī)英語中,有可重用組件的含義剥扣。
JavaBean:用Java語言編寫的可重用組件巩剖。
JavaBean > 實(shí)體類
它就是創(chuàng)建我們的service和dao對(duì)象的。
第一個(gè):需要一個(gè)配置文件來配置我們的service和dao配置的內(nèi)容:唯一標(biāo)識(shí)=全限定類名(key=value)
第二個(gè):通過讀取配置文件中配置的內(nèi)容钠怯,反射和創(chuàng)建對(duì)象
配置文件可以是xml也可以是properties

獲取spring的Ioc核心容器佳魔,并根據(jù)id獲取對(duì)象

ApplicationContext的三個(gè)常用實(shí)現(xiàn)類:

ClassPathXmlApplicationContext:它可以加載類路徑下的配置文件,要求配置文件必須在類路徑下晦炊,不在的話加載不了吃引。
FileSystemXmlApplicationContext:它可以加載磁盤任意路徑下的配置文件(必須有訪問權(quán)限)
AnnotationConfigApplicationContext:它是用于讀取注解創(chuàng)建容器的,

核心容器的兩個(gè)接口引發(fā)出的問題

ApplicationContext:
單例對(duì)象適用
它在構(gòu)建核心容器時(shí)刽锤,創(chuàng)建對(duì)象采取的策略是采用立即加載的方式,也就是說朦佩,只要一讀取完配置文件馬上就創(chuàng)建配置文件中的對(duì)象并思。
BeanFactory:
多例對(duì)象適用
它在構(gòu)建核心容器時(shí),創(chuàng)建對(duì)象采取的策略時(shí)采用延遲加載的方式语稠,也就是說宋彼,什么時(shí)候根據(jù)id獲取對(duì)象了,什么時(shí)候才真正的創(chuàng)建對(duì)象仙畦。

//1.獲取核心容器對(duì)象
ApplicationContext ac=new ClassPathXmlApplicationContext("bean.xml");
//2.根據(jù)id獲取bean對(duì)象
IAccountService as=(IAccountService)ac.getBean("accountService");
IAccountDao ad=ad.getBean("accountDao.class");
//BeanFactory
Resource resource=new ClassPathResource("bean.xml");
BeanFactory factory=new XmlBeanFactory(resource);
IAccountService as=(IAccountService)ac.getBean("accountService");

把對(duì)象的創(chuàng)建交給spring來管理

spring對(duì)bean的管理細(xì)節(jié)
1.創(chuàng)建bean的三種方式
2.bean對(duì)象的作用范圍
3.bean對(duì)象的生命周期

創(chuàng)建Bean的三種方式

第一種方式:使用默認(rèn)構(gòu)造函數(shù)創(chuàng)建
在spring的配置文件中使用bean標(biāo)簽输涕,配以id和class屬性之后,且沒有其他屬性和標(biāo)簽時(shí)慨畸,采用的就是默認(rèn)構(gòu)造函數(shù)創(chuàng)建bean對(duì)象莱坎,此時(shí)如果類中沒有默認(rèn)構(gòu)造函數(shù),則對(duì)象無法創(chuàng)建

<bean id="accountService" class="com.neusoft.service.imp.AccountServiceImp"></bean>
這種就沒有默認(rèn)無參構(gòu)造方法寸士,不能創(chuàng)建

第二種方式:使用普通工廠中的方法創(chuàng)建對(duì)象
先配置一個(gè)類交給spring檐什,再使用某個(gè)類中的方法創(chuàng)建對(duì)象碴卧,并存入spring容器

<bean id="instanceFactory" class="com.neusoft.factory.InstanceFactory"></bean>
<bean id="accountService" factory-bean="instanceFactory" factory-method="getAccountService"></bean>

第三種方式:使用工廠中的靜態(tài)方法創(chuàng)建對(duì)象
使用某個(gè)類中的靜態(tài)方法創(chuàng)建對(duì)象,并存入spring容器

<bean id="accountService" class="com.neusoft.factory.StaticFactory" factory-method="getAccountService"></bean>

bean的作用范圍類調(diào)整

bean標(biāo)簽的scope屬性
作用:用于指定bean的作用范圍
取值:
singleton:單例的(默認(rèn)值)
prototype:多例的
request:作用于web應(yīng)用的請(qǐng)求范圍
session:作用于web應(yīng)用的會(huì)話范圍
global-session:作用于集群環(huán)境的會(huì)話范圍(全局會(huì)話范圍)乃正,當(dāng)不是集群環(huán)境時(shí)住册,就是session

bean對(duì)象的生命周期

單例對(duì)象
出生:當(dāng)容器創(chuàng)建時(shí),對(duì)象出生
活著:只要容器還在瓮具,對(duì)象一直活著
死亡:容器銷毀荧飞,對(duì)象消亡
總結(jié):單例對(duì)象的生命周期和容器相同

<bean id="accountService" class="com.neusoft.service.impl.AccountServiceImpl" scope="singleton" init-method="init" destory-method="destory"></bean>
//獲取核心容器對(duì)象
//在這一步時(shí)就已經(jīng)創(chuàng)建了對(duì)象
 ApplicationContext ac=new ClassPathXmlApplicationContext("bean.xml");
        
IAccountService as=(IAccountService) ac.getBean("accountService");

運(yùn)行結(jié)果

無銷毀的原因:
main方法是一切方法的入口,當(dāng)main方法執(zhí)行完以后名党,里面所有內(nèi)存全部釋放叹阔,包括容器也被釋放了,所以容器還沒來得及調(diào)用銷毀方法就已經(jīng)消失了兑巾,所以需要手動(dòng)提交銷毀方法:ac.close()
報(bào)紅

這是因?yàn)槲覀冊谇懊嬲{(diào)用的是接口

ApplicationContext ac=new ClassPathXmlApplicationContext("bean.xml");

由于多態(tài)条获,我們無法使用在ClassPathXmlApplicationContext中的方法,所以使用本類即可

ClassPathXmlApplicationContext ac=new ClassPathXmlApplicationContext("bean.xml");
public class AccountServiceImpl implements IAccountService
{
//    @Autowired
    @Resource(name = "accountDao")
    private IAccountDao accountDao=null;

    public AccountServiceImpl(){
        System.out.println("對(duì)象創(chuàng)建了");
    }

    public void init(){
        System.out.println("對(duì)象已初始化");
    }

    public void destory(){
        System.out.println("對(duì)象已銷毀");
    }

多例對(duì)象
出生:當(dāng)我們使用對(duì)象時(shí)spring框架為我們創(chuàng)建
活著:對(duì)象在使用過程中就一直活著
死亡:當(dāng)對(duì)象長時(shí)間不用蒋歌,且沒有別的對(duì)象引用時(shí)帅掘,由Java的垃圾回收器回收

//1.獲取核心容器對(duì)象
ApplicationContext ac=new ClassPathXmlApplicationContext("bean.xml");
//2.根據(jù)id獲取bean對(duì)象
//在這一步時(shí)才創(chuàng)建對(duì)象
IAccountService as=(IAccountService)ac.getBean("accountService");

依賴注入

依賴注入:Dependency Injection
IOC的作用:降低程序間的耦合(依賴關(guān)系)
依賴關(guān)系的管理:以后都交給spring來維護(hù)
在當(dāng)前類需要用到其他類的對(duì)象,由spring為我們提供堂油,我們只需要在配置文件中說明
依賴關(guān)系的維護(hù):就稱之為依賴注入

依賴注入:能注入的數(shù)據(jù)修档,有三類

基本類型和String
其他bean類型(在配置文件中或者注釋配置過的bean)
復(fù)雜類型/集合類型

注入的方式:有三種

第一種:使用構(gòu)造函數(shù)提供
第二種:使用set方法提供
第三種:使用注解提供

構(gòu)造函數(shù)注入:

使用的標(biāo)簽:constructor.arg
標(biāo)簽出現(xiàn)的位置:bean標(biāo)簽的內(nèi)部
標(biāo)簽中的屬性
type:用于指定要注入的數(shù)據(jù)的數(shù)據(jù)類型,該數(shù)據(jù)類型也是構(gòu)造函數(shù)中某個(gè)或某些參數(shù)的類型
Index:用于指定要注入的數(shù)據(jù)給構(gòu)造函數(shù)中指定索引位置的參數(shù)賦值府框,索引的位置是從0開始的
name:用于指定給構(gòu)造函數(shù)中指定名稱的參數(shù)賦值
value:用于提供基本類型和String類型的數(shù)據(jù)
ref:用于指定其他的bean類型數(shù)據(jù)吱窝,它指的就是在spring的Ioc核心容器 中出現(xiàn)過的bean對(duì)象
優(yōu)勢:在獲取bean對(duì)象時(shí),注入數(shù)據(jù)是必須的操作迫靖,否則對(duì)象無法創(chuàng)建成功院峡。
弊端:改變了bean對(duì)象的實(shí)例化方式,使我們在創(chuàng)建對(duì)象時(shí)系宜,如果用不到這些參數(shù)照激,也必須提供。



只能賦給構(gòu)造器中String類型的一個(gè)值name盹牧,并且如果有多個(gè)String類型俩垃,那么賦值哪一個(gè)也不確定,因此type不適合對(duì)于多個(gè)參數(shù)列表的賦值

set方法注入:

涉及的標(biāo)簽:property
出現(xiàn)的位置:bean標(biāo)簽內(nèi)部
標(biāo)簽的屬性:
name:用于指定注入時(shí)所調(diào)用的set方法名稱
value:用于提供基本類型和String類型的數(shù)據(jù)
ref:用于指定其他的bean類型數(shù)據(jù)汰寓,它指的就是在spring的Ioc核心容器中出現(xiàn)過的bean對(duì)象
優(yōu)勢:創(chuàng)建對(duì)象時(shí)沒有明確的限制口柳,可以直接使用默認(rèn)構(gòu)造函數(shù)
弊端:如果有某個(gè)成員必須有值,則讀取對(duì)象可能set方法沒有執(zhí)行

復(fù)雜類型的注入/集合類型的注入

用于給list結(jié)構(gòu)集合注入的標(biāo)簽:list有滑,array跃闹,set
用于給Map結(jié)構(gòu)集合注入的標(biāo)簽:map,props
結(jié)構(gòu)相同,標(biāo)簽可以互換

注解@:

用于創(chuàng)建對(duì)象的

作用就和在xml配置文件中編寫一個(gè)<baen>標(biāo)簽實(shí)現(xiàn)的功能是一樣的
@Component:
作用:用于把當(dāng)前類對(duì)象存入spring容器中
屬性:value:用于指定bean的id辣卒。當(dāng)我們不寫時(shí)掷贾,它的默認(rèn)值時(shí)當(dāng)前類名,且首字母改小寫荣茫。
@Controller:一般用于表現(xiàn)層
@Service:一般用在業(yè)務(wù)層
@Repository:一般用在持久層
以上三個(gè)注解作用和屬性于component一模一樣想帅,是spring框架為我們提供明確的三層使用的注解,使我們的三層對(duì)象更加清晰

用于注入數(shù)據(jù)的

作用就和在xml配置文件中的bean標(biāo)簽中寫一個(gè)<property>標(biāo)簽的作用一樣

Autowired:
作用:自動(dòng)按照類型注入:只要容器中有唯一的一個(gè)bean對(duì)象類型和要注入的變量類型匹配啡莉,就可以注入成功
如果Ioc容器中沒有任何一個(gè)bean的類型和要注入的變量類型匹配港准,則報(bào)錯(cuò)
如果Ioc容器中有多個(gè)類型匹配時(shí),則再進(jìn)行一次變量名匹配咧欣,當(dāng)變量名與某個(gè)bean的id相同時(shí)才能運(yùn)行

出現(xiàn)位置:可以是變量上浅缸,也可以是方法上
細(xì)節(jié):在使用注解注入時(shí),set方法就不是必須的
Qualifier:
作用:在按照類中注入的基礎(chǔ)之上再按照名稱注入魄咕。它再給類成員注入時(shí)不能單獨(dú)使用衩椒。但是在給方法參數(shù)注入時(shí)可以。
屬性:value哮兰,用來指定注入bean的id毛萌。


Resource:
作用:直接按照bean的id注入。它可以獨(dú)立使用
屬性:name喝滞,用于指定bean的id阁将。

以上三種注入都只能注入其他bean類型的數(shù)據(jù),而基本類型和String類型無法使用上述注解實(shí)現(xiàn)右遭。
Value:
作用:用于注入基本類型和String類型的數(shù)據(jù)
屬性:value做盅,用于指定數(shù)據(jù)的值,它可以使用spring中SpEL(也就是spring的el表達(dá)式)

用于改變作用范圍的

作用就和在bean標(biāo)簽中使用scope屬性實(shí)現(xiàn)的功能一致
Scope:
作用:用于指定bean的作用范圍
屬性:value窘哈,指定范圍的取值吹榴,常用取值:singleton,prototy

和生命周期相關(guān)

作用和在bean標(biāo)簽中使用init-method和destroy-method的作用一致
PreDestroy:
作用:用于指定銷毀方法
PostConstruct:
作用:用于指定初始化方法

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市滚婉,隨后出現(xiàn)的幾起案子腊尚,更是在濱河造成了極大的恐慌,老刑警劉巖满哪,帶你破解...
    沈念sama閱讀 211,948評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異劝篷,居然都是意外死亡哨鸭,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門娇妓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來像鸡,“玉大人,你說我怎么就攤上這事≈还溃” “怎么了志群?”我有些...
    開封第一講書人閱讀 157,490評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長蛔钙。 經(jīng)常有香客問我锌云,道長,這世上最難降的妖魔是什么吁脱? 我笑而不...
    開封第一講書人閱讀 56,521評(píng)論 1 284
  • 正文 為了忘掉前任桑涎,我火速辦了婚禮,結(jié)果婚禮上兼贡,老公的妹妹穿的比我還像新娘攻冷。我一直安慰自己,他們只是感情好遍希,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,627評(píng)論 6 386
  • 文/花漫 我一把揭開白布等曼。 她就那樣靜靜地躺著,像睡著了一般凿蒜。 火紅的嫁衣襯著肌膚如雪禁谦。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,842評(píng)論 1 290
  • 那天篙程,我揣著相機(jī)與錄音枷畏,去河邊找鬼。 笑死虱饿,一個(gè)胖子當(dāng)著我的面吹牛拥诡,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播氮发,決...
    沈念sama閱讀 38,997評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼渴肉,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了爽冕?” 一聲冷哼從身側(cè)響起仇祭,我...
    開封第一講書人閱讀 37,741評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎颈畸,沒想到半個(gè)月后乌奇,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,203評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡眯娱,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,534評(píng)論 2 327
  • 正文 我和宋清朗相戀三年礁苗,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片徙缴。...
    茶點(diǎn)故事閱讀 38,673評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡试伙,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情疏叨,我是刑警寧澤潘靖,帶...
    沈念sama閱讀 34,339評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站蚤蔓,受9級(jí)特大地震影響卦溢,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜昌粤,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,955評(píng)論 3 313
  • 文/蒙蒙 一既绕、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧涮坐,春花似錦凄贩、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,770評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至捷雕,卻和暖如春椒丧,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背救巷。 一陣腳步聲響...
    開封第一講書人閱讀 32,000評(píng)論 1 266
  • 我被黑心中介騙來泰國打工壶熏, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人浦译。 一個(gè)月前我還...
    沈念sama閱讀 46,394評(píng)論 2 360
  • 正文 我出身青樓棒假,卻偏偏與公主長得像,于是被迫代替她去往敵國和親精盅。 傳聞我的和親對(duì)象是個(gè)殘疾皇子帽哑,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,562評(píng)論 2 349