如果對此文感興趣,可以繼續看下一篇博文,持續更新,新手學習,有問題歡迎指正:
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[ ]:用於指定其他配置類的字節碼。
- 通過註解獲取容器
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 文件中。