用注解來向Spring容器注冊Bean。
需要在applicationContext.xml中注冊:
1 <context:component-scan base-package=”pagkage1[,pagkage2,…,pagkageN]”/>
如:在base-package指明一個包
<context:component-scan base-package="cn.wind"/>
也可以在<context:component-scan base-package=” ”/>中指定多個包,如:
<context:component-scan base-package="cn.wind.dao.impl,cn.wind.service.impl,cn.wind.action"/>
==========
1:@Repository 標注在持久層,即dao,用于標注數據訪問。
2:@Service 標注在業務層,即service,用于標注業務邏輯。
3:@Controller 標注在控制層。
4:@Component當不明確這個類屬于那個層的時候,可以使用@Component進行標注,但不建議使用
5:@Autowired屬性加上@Autowired后不需要getter()和setter()方法,Spring會自動注入。
@Autowired(required=false)表示,如果spring上下文中沒有找到該類型的bean時,才會使用new ServiceImpl();
6:@Qualifier當接口存在兩個實現類的時候必須使用@Qualifier指定注入哪個實現類,否則可以省略,只寫@Autowired。
例如:定義一個交通工具類:Vehicle。此時有兩個子類Bus和Sedan。如果用@Autowired來找Vehicle的話,會有兩個匹配的選項Bus和Sedan。為了限定選項,可以如下
@Autowired @Qualifier("bus") private Vehicle vehicle; @Qualifier("XXX") 中的XXX是 Bean 的名稱,所以 @Autowired 和 @Qualifier 結合使用時,自動注入的策略就從 byType 轉變成 byName 了。
7:形似@Service("xXX"):相當于講這個類定義為一個bean,bean名稱為xXX,默認為首字母小寫
比如在一個Student實現類上加上@Service("student"),括號里面就是給實例化后的Student對象取個名字。這是在你一個接口有多個實現類的情況下區分實現類的方式。
比如Student實現了Person接口,在你的controller里面@Autowired Person時,假如這時Person還有另一個實現類User,為了確定實例化Student還是User, @Service括號里面的東西就有用了,
@Autowired @Qualifier("student") private Person person; 這樣就確定實例化了一個Person指向一個Student對象。
8:@Resource
@Resource的作用相當于@Autowired,只不過@Autowired按byType自動注入,而@Resource默認按 byName自動注入罷了。@Resource有兩個屬性是比較重要的,分是name和type,Spring將@Resource注解的name屬性解析為bean的名字,而type屬性則解析為bean的類型。所以如果使用name屬性,則使用byName的自動注入策略,而使用type屬性時則使用byType自動注入策略。如果既不指定name也不指定type屬性,這時將通過反射機制使用byName自動注入策略。
@Resource裝配順序
1).如果同時指定了name和type,則從Spring上下文中找到唯一匹配的bean進行裝配,找不到則拋出異常
2) 如果指定了name,則從上下文中查找名稱(id)匹配的bean進行裝配,找不到則拋出異常
3) 如果指定了type,則從上下文中找到類型匹配的唯一bean進行裝配,找不到或者找到多個,都會拋出異常
4) 如果既沒有指定name,又沒有指定type,則自動按照byName方式進行裝配;如果沒有匹配,則回退為一個原始類型進行匹配,如果匹配則自動裝配;
9:@PostConstruct,@PreDestroy
這兩個注釋只能應用于方法上,標注了@PostConstruct 注釋的方法將在類實例化后調用,而標注了 @PreDestroy 的方法將在類銷毀之前調用。
@PostConstruct public void init(){ System.out.println("I'm init method using @PostConstrut...."); } @PreDestroy public void dostory(){ System.out.println("I'm destory method using @PreDestroy....."); } 新聞熱點
疑難解答