Spring-02--注解

基于注解整合時(shí) 先把src--main--resources--bean.xml中的約束改成下面的,導(dǎo)入約束時(shí)需要多導(dǎo)入一個(gè) context名稱空間下的約束。 由于我們使用了注解配置饱溢,此時(shí)不能在繼承 JdbcDaoSupport狰住,需要自己配置一個(gè) JdbcTemplate 。

<?xml version="1.0" encoding="UTF-8"?>
 <beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:context="http://www.springframework.org/schema/context" 
    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.xsd 
        http://www.springframework.org/schema/context
         http://www.springframework.org/schema/context/spring-context.xsd">

<!-- 告知 spring 創(chuàng)建容器時(shí)要掃描的包 配置所有需要標(biāo)簽而不是在beans的約束中民假,
      而是一個(gè)名為context名稱空間的約束中 這樣它才能掃描到目錄下面的每個(gè)文件的注解 -->
  <context:component-scan base-package="com.itheima"></context:component-scan>   
 <!-- 配置 dbAssit -->
  <bean id="dbAssit" class="com.itheima.dbassit.DBAssit">
   <property name="dataSource" ref="dataSource"></property> 
 </bean>   
 <!-- 配置數(shù)據(jù)源 -->
  <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
   <property name="driverClass" value="com.mysql.jdbc.Driver"></property>
   <property name="jdbcUrl" value="jdbc:mysql:///spring_day02"></property>
   <property name="user" value="root"></property>
   <property name="password" value="1234"></property>
  </bean> 
</beans>

以往的XML配置:

 <bean id="accountService" class="com.itheima.service.impl.AccountServiceImpl">
      scope="" init-method="" destroy-method="">
      <property name=""  value="" 或者ref=""><property>
</bean>

用于創(chuàng)建對(duì)象:相當(dāng)于在XML中編寫(xiě)了一個(gè)<bean>標(biāo)簽實(shí)現(xiàn)的功能一樣意鲸。
@Component:把當(dāng)前類對(duì)象存入到spring容器中 讓spring來(lái)管理, 相當(dāng)于XML中配置一個(gè)bean算色。
為了更加清晰 于是Spring提供了以下3個(gè)注解 效果與Component是一樣的
@Controller:一般用于表現(xiàn)層的注解
@Service:一般用在業(yè)務(wù)層的注解
@Repository:一般用于在持久層的注解


注意
如果注解里有一個(gè)value屬性抬伺,那么這個(gè)屬性是可以不寫(xiě)的,如果有兩個(gè)屬性灾梦,那么value就得寫(xiě)峡钓,例如: @Component(value="accountService") 等同于 @Component("accountService")
value:用于指定bean的ID,當(dāng)我們不寫(xiě)時(shí)斥废,它的默認(rèn)值是當(dāng)前類名且首字母改小寫(xiě)椒楣。


用于注入數(shù)據(jù)的:相當(dāng)于在XML中的<bean>中編寫(xiě)了一個(gè)<property>標(biāo)簽是一樣的
@Autowired:自動(dòng)按照類型注入 只要容器中有唯一的一個(gè)bean對(duì)象類型和要注入的變量類型匹配就可以注入成功
@Qualifier:按照類型的注入基礎(chǔ)之上再按名稱注入 它在給類成員注入時(shí)不能單獨(dú)使用 ,必須配合和@Autowired使用牡肉。但是給方法參數(shù)注入時(shí)可以
@Resource:直接按照bean的id注入 它可以獨(dú)立使用 name屬性是bean的id 例如:@Resource(name=accountDao)


注意:
Value:用于注入基本類型和String類型的數(shù)據(jù)
value屬性:用于指定數(shù)據(jù)的值捧灰。它可以使用spring中SpEL (也就是spring中的EL表達(dá)式)
SpEL的寫(xiě)法:${表達(dá)式}


用于改變作用范圍的:相當(dāng)于在<bean>標(biāo)簽中使用了scope一樣。
Scope:與于指定bean的作用范圍
屬性:value:指定范圍的取值统锤,常用取值:singleton(默認(rèn))(單例)和prototype(多例)

和生命周期相關(guān)的:相當(dāng)于在<bean>標(biāo)簽中使用了init-menthoddestriy-menthod一樣毛俏。
PreDestroy:指定銷毀方法。
PostConstruct:指定初始化方法饲窿。


Spring新注解

@Configurtion:指定當(dāng)前類是一個(gè)spring配置類(配置類的意思就是它的作用和bean.xml是一樣的)
@ComponentScan:通過(guò)注解指定是Spring在創(chuàng)建容器時(shí)要掃描的包煌寇。。作用和在 spring 的 xml 配置文件中的:<context:component-scan base-package="com.itheima"/>是一樣的逾雄。
實(shí)例代碼:

@Configuration 
@ComponentScan("com.itheima") 
        public class SpringConfiguration { 
  
    } 

@Bean:該注解只能寫(xiě)在方法上阀溶,用于把當(dāng)前方法的返回值作為bean對(duì)象存入到Spring的ioc容器中,name:給當(dāng)前@Bean 注解方法創(chuàng)建的對(duì)象指定一個(gè)名稱(即 bean 的 id)。

@PropertySource:用于加載.properties 文件中的配置鸦泳。例如我們配置數(shù)據(jù)源時(shí)银锻,可以把連接數(shù)據(jù)庫(kù)的信息寫(xiě)到 properties 配置文件中,就可以使用此注解指定 properties 配置文件的位置.value[]:用于指定 properties 文件位置做鹰。如果是在類路徑下击纬,需要寫(xiě)上 classpath:

@PropertySource("classpath:jdbc.properties") 
      public class JdbcConfig{

   }

@Import:用于導(dǎo)入其他配置類,在引入其他配置類時(shí)钾麸,可以不用再寫(xiě)@Configuration 注解更振。當(dāng)然,寫(xiě)上也沒(méi)問(wèn) 題,value[]:用于指定其他配置類的字節(jié)碼饭尝。

@Import({ JdbcConfig.class})
     public class SpringConfiguration {

   } 

Spring 整合 Junit

在測(cè)試類中肯腕,每個(gè)測(cè)試方法都有以下兩行代碼:

  ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");  IAccountService as = ac.getBean("accountService",IAccountService.class); 

這兩行代碼的作用是獲取容器,如果不寫(xiě)的話钥平,直接會(huì)提示空指針異常乎芳。所以又不能輕易刪掉。

junit 是無(wú)法實(shí)現(xiàn)的,因?yàn)樗约憾紵o(wú)法知曉我們是否使用了 spring 框架奈惑,更不用說(shuō)幫我們創(chuàng)建 spring 容器了吭净。不過(guò)好在,junit 給我們暴露 了一個(gè)注解肴甸,可以讓我們替換掉它的運(yùn)行器寂殉。 這時(shí),我們需要依靠 spring 框架原在,因?yàn)樗峁┝艘粋€(gè)運(yùn)行器友扰,可以讀取配置文件(或注解)來(lái)創(chuàng)建容器。我 們只需要告訴它配置文件在哪就行了.
第一步:導(dǎo)入spring整合的junit的jar包坐標(biāo)庶柿。
第二步:使用junit提供的一個(gè)注解把原有的main方法替換村怪,替換成spring提供的@Runwith

@RunWith(SpringJUnit4ClassRunner.class) 
      public class AccountServiceTest { 
        }

第三步:告訴spring的運(yùn)行器,spring和ioc創(chuàng)建是基于xml還是注解 并說(shuō)明位置浮庐。

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations= {"classpath:bean.xml"}) 
    public class AccountServiceTest { 

  } 

@ContextConfiguration注解:
locations 屬性:用于指定配置文件的位置甚负。如果是類路徑下,需要用 classpath:表明
classes 屬性:用于指定注解的類审残。當(dāng)不使用 xml 配置時(shí)梭域,需要用此屬性指定注解類的位置。

第四步:使用@Autowired 給測(cè)試類中的變量注入數(shù)據(jù)

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations= {"classpath:bean.xml"}) 
    public class AccountServiceTest {
      @Autowired 
       private IAccountService as ;
 }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末搅轿,一起剝皮案震驚了整個(gè)濱河市病涨,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌璧坟,老刑警劉巖既穆,帶你破解...
    沈念sama閱讀 221,198評(píng)論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異雀鹃,居然都是意外死亡幻工,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門(mén)褐澎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人伐蒋,你說(shuō)我怎么就攤上這事工三。” “怎么了先鱼?”我有些...
    開(kāi)封第一講書(shū)人閱讀 167,643評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵俭正,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我焙畔,道長(zhǎng)掸读,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,495評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮儿惫,結(jié)果婚禮上澡罚,老公的妹妹穿的比我還像新娘。我一直安慰自己肾请,他們只是感情好留搔,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,502評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著铛铁,像睡著了一般隔显。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上饵逐,一...
    開(kāi)封第一講書(shū)人閱讀 52,156評(píng)論 1 308
  • 那天括眠,我揣著相機(jī)與錄音,去河邊找鬼倍权。 笑死掷豺,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的账锹。 我是一名探鬼主播萌业,決...
    沈念sama閱讀 40,743評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼奸柬!你這毒婦竟也來(lái)了生年?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,659評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤廓奕,失蹤者是張志新(化名)和其女友劉穎抱婉,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體桌粉,經(jīng)...
    沈念sama閱讀 46,200評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蒸绩,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,282評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了铃肯。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片患亿。...
    茶點(diǎn)故事閱讀 40,424評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖押逼,靈堂內(nèi)的尸體忽然破棺而出步藕,到底是詐尸還是另有隱情,我是刑警寧澤挑格,帶...
    沈念sama閱讀 36,107評(píng)論 5 349
  • 正文 年R本政府宣布咙冗,位于F島的核電站,受9級(jí)特大地震影響漂彤,放射性物質(zhì)發(fā)生泄漏雾消。R本人自食惡果不足惜灾搏,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,789評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望立润。 院中可真熱鬧狂窑,春花似錦、人聲如沸范删。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,264評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)到旦。三九已至旨巷,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間添忘,已是汗流浹背采呐。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,390評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留搁骑,地道東北人斧吐。 一個(gè)月前我還...
    沈念sama閱讀 48,798評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像仲器,于是被迫代替她去往敵國(guó)和親煤率。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,435評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容