本篇內(nèi)容:
- 1窜锯、使用注解定義bean
- 2、包掃描注解
- 3芭析、自動(dòng)裝配Bean
Spring成功啟動(dòng)的主要事項(xiàng):Bean定義信息衬浑,Bean實(shí)現(xiàn)類,Spring本身放刨。
一工秩、定義Bean
- 采用基于xml的配置,Bean定義信息和Bean實(shí)現(xiàn)本省是分離的进统,采用基于注解的配置文件助币,bean定義信息通過在bean實(shí)現(xiàn)類上標(biāo)注注解實(shí)現(xiàn)。
@Component("userDao")
public class UserDao{}
說明:
- 使用@Component注解對實(shí)體進(jìn)行標(biāo)注螟碎,Spring容器自動(dòng)將當(dāng)前類賬號成容器管理的Bean眉菱。
Spring還提供了3個(gè)功能基本和@Component等效的注解分別用于Dao,Service掉分,Controller
- 1俭缓、@Repository:用于對dao實(shí)現(xiàn)類標(biāo)注
- 2、@Service:對Service實(shí)現(xiàn)類標(biāo)注
- 3酥郭、@Controller用于對Controller實(shí)現(xiàn)類標(biāo)注
注意:
- 可以用@Component代替此3個(gè)注解华坦,不統(tǒng)一使用一個(gè)注解是為了看出Bean的真實(shí)身份。
二不从、包掃描注解定義的Bean
- Spring的context命名空間提供了通過掃描包以應(yīng)用注解定義Bean的方式惜姐。
1、xml配置包掃描
<context:component-scan base-package=""/>
說明:
- context:component-scan:包掃描標(biāo)簽
- base-package:基礎(chǔ)包椿息,Spring掃描基礎(chǔ)包所有類歹袁,并從類的注解詳細(xì)中獲取Bean的定義信息。
2寝优、掃描特定類可以添加(resource-pattern)屬性過濾
<context:component-scan base-package="" resource-pattern="anno/*.class"/>
說明:
- resource-pattern="anno/*.class":Spring僅會掃描基類包annon子包中的類
3条舔、目錄下多種匹配
- 如果掃描基礎(chǔ)包下需要包含和需要排除的類同時(shí)存在可以使用filter
<context:component-scan base-package="" resource-pattern="anno/*.class">
<context:incloud-filter type="regex" expression="com\.smart\.anno.*" />
<context:exclude-filter type="aspectj" expression="com.smart..*Controller+" />
</context:component-scan>
- context:incloud-filter:表示需要包含的目標(biāo)類
- context:exclude-filter :表示需要排除的目標(biāo)類
type類型說明:
3.1、annotation:采用目標(biāo)類是否標(biāo)注了某個(gè)注解進(jìn)行過濾
- 示例:com.smart.XxxAnnotation
- 說明:所有標(biāo)注了XxxAnnotation的類乏矾,
3.2孟抗、assignable:采用目標(biāo)類首付繼承或擴(kuò)展了某個(gè)特定的類進(jìn)行過濾
- 示例:com.smart.XxxService
- 說明:所有繼承或擴(kuò)展XxxService的類
3.3、aspectj:采用AspectJ表達(dá)式進(jìn)行過濾
- 示例:com.smart..*Service+
- 說明:所有類名以Service結(jié)束及繼承妻熊,或擴(kuò)展他們的類
3.4夸浅、regex:采用正則表達(dá)式根據(jù)目標(biāo)類的類名進(jìn)行過濾
- 示例:com.smart.anno..*
- 說明:所有com.smart.anno類下的包
3.5、custom:采用接口方式過濾
示例:com.smart.XxxTyoeFilter
說明:采用XxxTyoeFilter代碼方式實(shí)現(xiàn)過濾扔役,前提是必須實(shí)現(xiàn)TyoeFilter接口
過濾類型中除了custom類型外帆喇,aspectj的過濾表達(dá)能力是最強(qiáng)的,可以輕易實(shí)現(xiàn)其他類型的表達(dá)規(guī)則亿胸。
4坯钦、user-default-filters屬性
- 屬性的默認(rèn)值位true:表示默認(rèn)對標(biāo)注@Component预皇,@Controller,@Service婉刀,@Reposity的Bean進(jìn)行掃描
三吟温、自動(dòng)裝配Bean
1、使用@Autowired進(jìn)行自動(dòng)注入
@Service
public class LoginService{
@Autowired
private LoginDao loginDao;
}
說明
- @Service注解將LoginService標(biāo)注為一個(gè)Bean
- @Autowired注入一個(gè)LoginDao實(shí)體Bean
- @Autowired默認(rèn)按照類型匹配方式從容器中查找匹配的Bean突颊,當(dāng)只有一個(gè)匹配的Bean時(shí)鲁豪,Spring將其注入@Autowired標(biāo)記的變量中
2、使用@Autowired的required屬性
- 如果容器中沒有和標(biāo)注變量類型匹配的Bean律秃,Spring容器啟動(dòng)時(shí)會拋出異常爬橡,如果希望Spring不拋出異常可以添加required屬性
@Service
public class LoginService{
@Autowired(required=false)
private LoginDao loginDao;
}
說明
- Autowired的required屬性為true
3棒动、使用@Qualifier指定注入Bean的名稱
- 如果容器中存在多個(gè)匹配的Bean時(shí)糙申,采用@Qualifier屬性限定Bean的名稱
@Service
public class LoginService{
@Autowired
private LoginDao loginDao;
@Autowired
@Qualifier("userDao")
private UserDao userDao;
}
說明:
- 指定UserDao的實(shí)例對象在當(dāng)前當(dāng)前類注入的bean名稱為"userDao"
4、對類方法進(jìn)行標(biāo)注
- @Autowired可以對類采用變量和方法的參數(shù)進(jìn)行標(biāo)注
@Service
public class LoginService{
private LoginDao loginDao;
private UserDao userDao;
//自動(dòng)將LoginDao傳給方法入?yún)? @Autowired
public void setLoginDao(LoginDao loginDao){
this.loginDao = loginDao;
}
//自動(dòng)將名為userDao的實(shí)體傳給方法入?yún)? @Autowired
@Qualifier("userDao")
public void setUserDao(UserDao userDao){
this.userDao = userDao;
}
}
- 如果一個(gè)方法有多個(gè)入?yún)⒋遥J(rèn)情況下Spring會自動(dòng)選擇匹配入?yún)㈩愋偷腂ean進(jìn)行注入
- Spring允許對方法入?yún)?biāo)注@Qualifier來指定注入Bean的名稱
@Autowired
public void init(@Qualifier("userDao")UserDao userDao,LoginDao loginDao){
this.userdao = userDao;
this.loginDao =loginDao;
}
- 一般Spring中的bean都是單實(shí)例對象柜裸,一般不需要特別指定Bean實(shí)例的名稱,來按名稱注入
5粱锐、對集合類進(jìn)行標(biāo)注
- 如果對類中集合類的變量或方法入?yún)⑦M(jìn)行@Autowired標(biāo)注疙挺,那么Spring會將容器中類型匹配的所有Bean都自動(dòng)注入進(jìn)來。
public class ListComponent{
@Autowired(required=false)
private List<Plugin> plugins;
@Autowired
private Map<String,plugin> pluginMaps;
public List<Plugin> getPlugins(){
return plugins;
}
}
說明:
- plugins注入:Spring會將容器中所有類型為Plugin的Bean注入到這個(gè)變量中
- pluginMaps:將Plugin類型的Bean注入Map中卜范,key是Bean的名字衔统,value是對應(yīng)的bean
@Component
@Order(value = 1)
public class OnePlugin implements Plugin{}
說明:
- @Order(value = 1):指定此實(shí)體對象的加載順序鹿榜,值越小優(yōu)先被加載海雪。
6、對延遲依賴注入的支持
- 在Spring容器啟動(dòng)時(shí)舱殿,在Bean上標(biāo)記了@Lazy及@Autowired注解的屬性不會立即注入屬性值奥裸,而是延遲到調(diào)用此屬性時(shí)才會注入
@Lazy
@Repository
public class Login{}
@Service
public class LoginService {
@Lazy
@Autowired(required=false)
public void setLogin(LoginDao loginDao){}
}
- 對Bean實(shí)施延遲依賴注入,@Lazy注解必須同時(shí)標(biāo)注在屬性及目標(biāo)Bean上沪袭,缺一不可湾宙。