【Spring】Spring複習之基於註解的IOC和JUnit整合

如果對此文感興趣,可以繼續看下一篇博文,持續更新,新手學習,有問題歡迎指正:
https://blog.csdn.net/renjingjingya0429/article/details/90177176

一、基於註解的IOC配置

常用註解
1. 用於創建對象的(相當於<bean id="" class="’>)

  • @Component

    • 作用:把資源讓Spring 來管理。相當於在XML中配置一個bean。
    • 屬性:value:指定bean的id。如果不指定value屬性,默認bean 的id 是當前類的類名,首字母小寫。
  • @Controller @Service @Repository

他們三個註解都是針對一個的衍生註解,他們的作用及屬性都是一模一樣的。
他們只不過是提供了更加明確的語義化。

  • @Controller:一般用於表現層的註解。
  • @Service:一般用於業務層的註解。
  • @Repository:一般用於持久層的註解。

細節:如果註解中有且只有一個屬性要賦值時,且名稱是 value,value 在賦值是可以不寫。

2. 用於注入數據的(相當於<property name="" red="’> <property name="" value="’>)

  • @Autowired
    • 作用:自動按照類型注入。當使用註解注入屬性時,set 方法可以省略。它只能注入其他bean類型。當有多個類型匹配時,使用要注入的對象變量名稱作爲bean的id,在Spring容器查找,找到了也可以注入成功,找不到就報錯。
  • @Qualifier
    • 作用:在自動按照類型注入的基礎上,再按照Bean的id注入。它在給字段注入時不能獨立使用,必須和@Autowired 一起使用,但是給方法參數注入時,可以獨立使用。
    • 屬性:value:指定bean的id。
  • @Resource
    • 作用:直接按照bean的id注入。它也只能注入其他bean類型。
    • 屬性:name:指定bean 的id 。
  • @Value
    • 作用:注入基本數據類型和String類型數據的。
    • 屬性:value:用於指定值。

3. 用於改變作用範圍的(相當於 )

  • @Scope
    • 作用:指定bean 的作用範圍。
    • 屬性:value:指定範圍的值。取值:Singleton、prototype、request、session、globalsession

4. 和生命週期相關的(相當於)

  • @PostConstruct
    作用:用於指定初始化方法
  • @PreDestory
    作用:用於指定銷燬方法

5. 關於Spring註解和XML的選擇問題

  • 註解的優勢
    配置簡單,維護方便(我們找到類,就相當於找到了對應的配置)。
  • XML的優勢
    修改時,不用改源碼。不涉及源碼重新編譯和部署。
  • Spring管理bean方式的比較
    在這裏插入圖片描述

6. 一些問題

我們基於註解的IOC依然離不開XML 配置文件,能否去掉這個配置文件,所有的配置都使用註解來實現?下面的新註解就可以解決這些問題。

7. 新註解說明

  • @Configuration

    • 作用:用於指定當前類是一個Spring配置類,當創建容器時會從該類上加載註解。獲取容器時需要使用AnnotationApplicationContext(有Configuration註解的類.class)
    • 屬性:
      value:用於指定配置類的字節碼。
  • @ComponentScan

    • 作用:用於指定Spring在初始化容器時要掃描的包。作用和在Spring的XML配置文件中的。<context:component-scan base-package=“com.itheima”/>是一樣的。
  • @Bean

    • 作用:該註解只能寫在方法上,表明使用此方法創建一個對象(將該方法的返回值放入Spring 容器),並且放入Spring 容器。
    • 屬性:name:給當前@Bean註解方法創建的對象指定一個名稱(即bean的id)。
  • @PropertySource

    • 作用:==用於加載.properties文件中的配置。==例如我們配置數據源時,可以把連接數據庫的信息寫到properties 配置文件中,就可以使用此註解指定 properties 配置文件的位置。
    • 屬性:value[ ],用於指定properties文件位置。如果是在類路徑下,需要寫上classpath;
  • @Import

    • 作用:用於導入其他配置類,在引入其他配置類時,可以不用再寫@Configuration 註解。當然,寫上也沒問題。
    • 屬性:value[ ]:用於指定其他配置類的字節碼。
  1. 通過註解獲取容器
ApplicationContext ac = new AnnotationConfigApplicationContext(SpringConfigration.class);

二、Spring整合Junit

1. 第一步:在項目中加入整合Junit的必備jar包。

此處需要注意的是,導入 jar 包時,需要導入一個 spring 中 aop 的 jar 包。

2. 第二步:使用@RunWith註解換原有運行器

/**
* 測試類
*/
@RunWith(SpringJUnit4ClassRunner.class)
public class AccountServiceTest {
}

3. 第三步:使用@ContextConfigration指定Spring配置文件的位置

/**
* 測試類
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations= {"classpath:bean.xml"})
public class AccountServiceTest {
}

@ContextConfigration註解
- location屬性:用於指定配置文件的位置,需要用classpath:表明。
- classes屬性:用於指定註解的類。當不使用XML配置時,需要用此屬性指定註解類的位置

4. 第四步:使用@Autowired給測試類中的變量注入數據

/**
* 測試類
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations= {"classpath:bean.xml"})
public class AccountServiceTest {
@Autowired
private IAccountService as ;
}

5. 爲什麼不把測試類配到 xml 中?
在解釋這個問題之前,先解除大家的疑慮,配到 XML 中能不能用呢?
答案是肯定的,沒問題,可以使用。
那麼爲什麼不採用配置到 xml 中的方式呢?
第一:當我們在 xml 中配置了一個 bean,spring 加載配置文件創建容器時,就會創建對象。
第二:測試類只是我們在測試功能時使用,而在項目中它並不參與程序邏輯,也不會解決需求上的問
題,所以創建完了,並沒有使用。那麼存在容器中就會造成資源的浪費。

所以,基於以上兩點,我們不應該把測試配置到 xml 文件中。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章