1.接上面組件掃描常用標註的補充
@Scope("singleton") 指定作用域
程序默認就是單例的,prototype爲多例。驗證方法:
Card card = app.getBean(Card.class);
Card card2 = app.getBean(Card.class);
System.out.println(card==card2);
返回ture爲單例,false爲多例!
@PostConstruct 指定初始化方法
要想構造方法起作用必須在構造方法前加上這個標註!
//構造初始化方法
@PostConstruct
public void init() {
this.point="A";
}
@PreDestroy 指定銷燬方法
銷燬函數,起作用必須加上此標註,且程序的作用域必須是單例的
驗證方法必須使用來獲取對象,還要記得關閉!!
AbstractApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
app.close();
@PreDestroy
public void destory() {
System.out.println("game over");
}
2 和DI相關的標註
@Value 用來解決基本值的注入問題 如果要注入複雜值 則需要結合EL表達式
可以用在 成員變量 set方法
@Autowired 用來解決複雜值的裝配問題
可以用在 成員變量 set方法 構造方法
優先使用類型進行匹配 如果類型有衝突 則啓用名字進行裝配
對組件的依賴是強依賴(依賴的組件必須存在 否則報錯)
可以使用required屬性指定是false 組件之間變成弱依賴性
也可以指定set方法參數名字查找需要結合@Qualifier
@Qualifier 不能用在構造方法上 如果找不到對應的組件 也不會啓用類型查找
@Resource 是JavaEE(JDK)規範的標籤非Spring框架的;也可以作用於字段或者setter方法;必須要求有匹配的對象;
找bean的方式:
1),首先按照set方法的名字去找,如果找到,就使用setter或者字段注入;
2),如果按照名字找不到,再按照類型去找,但如果找到多個匹配類型,報錯;
3),可以直接使用name屬性指定bean的名稱;但是,如果指定的name,就只能按照name去找,如果找不到,就不會再按照類型去找;
弄清楚有四個和組件創建相關的標註有3組和組件裝配的標註