Spring锛?八锛夆€斺€斾娇鐢↗ava绫荤殑褰㈠紡閰嶇疆bean

Spring锛?8锛夆€斺€斾娇鐢↗ava绫荤殑褰㈠紡閰嶇疆bean

18 浣跨敤Java绫荤殑褰㈠紡閰嶇疆bean瀹氫箟

闄や簡浼犵粺鐨勪娇鐢╔ML鏉ラ厤缃簳灞傜殑bean瀹瑰櫒瀹氫箟锛孲pring杩樻敮鎸佷娇鐢ㄥぇ瀹剁啛鎮夌殑Java绫荤殑褰㈠紡鏉ヨ繘琛岄厤缃€備娇鐢↗ava绫荤殑褰㈠紡鏉ヨ繘琛岄厤缃椂鎴戜滑灏嗕娇鐢ㄤ竴涓狫ava绫绘潵浣滀负閰嶇疆鐨勪富浣擄紝骞跺湪绫讳笂浣跨敤@Configuration杩涜鏍囨敞锛岃〃绀哄叾鏄竴涓厤缃被銆傜劧鍚庡皢瀵瑰簲鐨刡ean瀹氫箟閮藉畾涔変负Java閰嶇疆绫讳腑鐨勪竴涓叕鐢ㄦ柟娉曪紝骞跺湪鏂规硶涓婁娇鐢ˊBean杩涜鏍囨敞锛岃〃绀哄叾鏄竴涓猙ean瀹氫箟銆備娇鐢ˊBean杩涜鏍囨敞鐨勬柟娉曞搴旂殑杩斿洖绫诲瀷灏辨槸鐢熸垚鐨刡ean瀹氫箟瀵瑰簲鐨凜lass绫诲瀷锛屽搴旂殑鏂规硶浣撳疄鐜板氨鏄垜浠敤鏉ヤ骇鐢熷搴攂ean瀹氫箟鐨勫疄渚嬬殑杩囩▼锛屽搴旂殑鏂规硶鍚嶅氨鏄痓ean瀹氫箟鐨勯粯璁eanName銆備笅闈㈡垜浠厛鏉ョ畝鍗曠殑鐪嬩竴涓搴旂殑瀹炵幇銆?/p>

@Configuration
public class SpringConfig {

	@Bean
	public Hello hello() {
		return new Hello();
	}
	
}

鍦ㄤ笂闈唬鐮佷腑鎴戜滑灏遍€氳繃@Configuration鏍囨敞浜嗘垜浠殑绫籗pringConfig鏄竴涓猄pring鐨勯厤缃被锛岀劧鍚庡湪鍏朵腑瀹氫箟浜嗕竴涓娇鐢ˊBean杩涜鏍囨敞鐨勬柟娉曪紝Spring浼氬皢鍏朵綔涓轰竴涓猙ean瀹氫箟娣诲姞鍒癰ean瀹瑰櫒涓紝瀵瑰簲beanName涓衡€渉ello鈥濓紝鐒跺悗鐩存帴new涓€涓搴旂殑瀹炰緥浣滀负bean瀹氫箟鐨勫疄渚嬨€備箣鍚庢垜浠氨鍙互浠庤閰嶇疆绫讳骇鐢熺殑bean瀹瑰櫒涓幏鍙栧搴旂殑bean瀹氫箟浜嗭紝瀵瑰簲娴嬭瘯浠g爜鍙互鏄涓嬭繖鏍枫€?/p>

@ContextConfiguration(classes={SpringConfig.class})
@RunWith(SpringJUnit4ClassRunner.class)
public class ConfigurationTest {
	
	@Autowired
	private ApplicationContext context;
	
	@Test
	public void test() {
		System.out.println(context.getBean("hello", Hello.class));
	}

}

18.1 @Bean

鍦ㄤ娇鐢ㄥ熀浜嶫ava绫昏繘琛岄厤缃椂锛屾垜浠彲浠ヤ娇鐢ˊBean鏉ユ爣娉ㄩ厤缃被涓渶瑕佸畾涔変负bean瀹瑰櫒涓竴涓猙ean瀹氫箟鐨勬柟娉曘€傛爣娉ㄥ悗锛岄粯璁や細浠ヨ鏂规硶鐨勫悕绉颁綔涓哄搴攂ean瀹氫箟鐨刡eanName锛屼互鏂规硶鐨勮繑鍥炵被鍨嬩綔涓哄搴攂ean瀹氫箟鐨凜lass绫诲瀷銆?/p>

@Configuration
public class SpringConfig {

	@Bean
	public Hello hello() {
		return new Hello();
	}
	
}

濡備笂绀轰緥锛屾垜浠氨鍦ㄥ熀浜嶫ava绫荤殑閰嶇疆涓娇鐢ˊBean娉ㄨВ瀹氫箟浜嗕竴涓猙ean瀹氫箟锛屽叾鐩稿綋浜庢垜浠湪XML閰嶇疆鏂囦欢涓殑濡備笅瀹氫箟銆?/p>

<bean id="hello" class="com.app.Hello"/>

18.1.1 鎸囧畾beanName

榛樿鎯呭喌Spring浼氫互鏂规硶鍚嶇О浣滀负瀵瑰簲bean瀹氫箟鐨刡eanName銆傚鏋滅敤鎴峰笇鏈涙寚瀹氬搴攂ean瀹氫箟鐨刡eanName锛屽垯鍙互閫氳繃@Bean鐨刵ame灞炴€ц繘琛屾寚瀹氥€?/p>

@Bean(name="hello1")
public Hello hello() {
	return new Hello();
}

鎴戜滑涔熷彲浠ラ€氳繃@Bean鐨刵ame灞炴€х粰bean瀹氫箟鎸囧畾澶氫釜鍚嶇О锛岃繖涓椂鍊欏氨鍙互灏唍ame灞炴€т互涓€涓暟缁勭殑褰㈠紡杩涜鎸囧畾銆傚涓嬬ず渚嬩腑鎴戜滑灏辫〃绀哄悓鏃舵寚瀹歜eanName涓衡€渉ello鈥濆拰鈥渉ello1鈥濄€?/p>

@Bean(name={"hello", "hello1"})
public Hello hello() {
	return new Hello();
}

18.1.2 鎸囧畾鐢熷懡鍛ㄦ湡鍥炶皟鏂规硶

鏍规嵁涔嬪墠鏂囩珷鐨勪粙缁嶆垜浠煡閬揵ean鐨勭敓鍛藉懆鏈熷洖璋冩柟娉曞彲浠ラ€氳繃涓夌鏂瑰紡杩涜鎸囧畾锛屼娇鐢↗SR-250鏍囧噯鐨凘PostConstruct鍜孈PreDestroy杩涜鏍囨敞銆佸疄鐜癐nitializationBean鍜孌isposableBean鎺ュ彛鍜岄€氳繃bean瀹氫箟鐨刬nit-method鍜宒estroy-method杩涜鎸囧畾銆傚浜庡墠涓ょ鏂瑰紡鑰岃█锛屼娇鐢ˊBean杩涜閰嶇疆鐨刡ean涔熷彲浠ュ儚鍏跺畠鍩轰簬娉ㄨВ鎴栧熀浜嶺ML閰嶇疆鐨刡ean涓€鏍疯繘琛屽洖璋冦€傚浜庣涓夌鏂瑰紡锛屾垜浠氨闇€瑕侀€氳繃@Bean鐨刬nitMethod鍜宒estroyMethod灞炴€ц繘琛屾寚瀹氾紝瀵瑰簲灞炴€у€煎嵆琛ㄧず瀵瑰簲鐨勫洖璋冩柟娉曞悕绉般€?/p>

	@Bean(initMethod="init", destroyMethod="destroy")
	public Hello hello() {
		return new Hello();
	}

涓婅堪绀轰緥涓垜浠氨閫氳繃initMethod灞炴€ф寚瀹氫簡bean hello鐨勫垵濮嬪寲鍥炶皟鏂规硶涓篿nit()锛岄€氳繃destroyMethod灞炴€ф寚瀹氫簡瀵瑰簲鐨勯攢姣佸墠鍥炶皟鏂规硶涓篸estroy()銆傚叾灏辩浉褰撲簬鎴戜滑鍩轰簬XML閰嶇疆鐨勫涓嬪舰寮忋€?/p>

<bean id="hello" class="com.app.Hello" init-method="init" destroy-method="destroy"/>

18.1.3 鎸囧畾鏄惁鑷姩娉ㄥ叆

鍦ㄤ娇鐢╔ML杩涜閰嶇疆鐨勬椂鍊欙紝鎴戜滑鍙互閫氳繃鍏禷utowire鎸囧畾鏄惁闇€瑕佽繘琛岃嚜鍔ㄦ敞鍏ャ€傚搴旂殑鎴戜滑鍙互鍦ˊBean涓婁娇鐢╝utowire灞炴€ф潵鎸囧畾鏄惁杩涜鑷姩娉ㄥ叆銆傚彲閫夊€兼湁Autowire.NO銆丄utowire.BY_NAME鍜孉utowire.BY_TYPE銆傞粯璁ゆ槸Autowire.NO锛屽嵆涓嶈繘琛岃嚜鍔ㄦ敞鍏ャ€侫utowire.BY_NAME琛ㄧず鎸夊悕绉拌繘琛岃嚜鍔ㄦ敞鍏ワ紝Autowire.BY_TYPE琛ㄧず鎸夌被鍨嬭繘琛岃嚜鍔ㄦ敞鍏ャ€?/p>

	@Bean(autowire=Autowire.BY_TYPE)
	public Hello hello() {
		return new Hello();
	}

涓婅堪绀轰緥琛ㄧず鎸夌収绫诲瀷瀵逛緷璧栫殑bean杩涜鑷姩娉ㄥ叆銆傚叾绛夊悓浜庡涓媂ML瀹氫箟銆?/p>

<bean id="hello" class="com.app.Hello" autowire="byType"/>

18.1.4 鎸囧畾Scope

閫氳繃@Bean杩涜瀹氫箟鐨刡ean瀵瑰簲鐨凷cope榛樿涔熸槸singleton鐨勶紝鐢ㄦ埛濡傛灉甯屾湜鏇存敼杩欑榛樿绛栫暐锛屽垯闇€瑕佸湪@Bean瀵瑰簲鐨勬柟娉曚笂浣跨敤@Scope鏍囨敞杩涜瀹氫箟锛屽叿浣撶敤娉曚笌鎴戜滑涔嬪墠浠嬬粛鐨勫湪鍩轰簬娉ㄨВ閰嶇疆bean瀹氫箟鏃舵槸涓€鏍风殑銆傚涓嬭〃绀烘垜浠畾涔夊搴旂殑Scope涓簆rototype銆?/p>

	@Bean
	@Scope("prototype")
	public Hello hello() {
		return new Hello();
	}

濡傛灉闇€瑕佽浠g悊锛屽彲浠ユ寚瀹歱roxyMode銆?/p>

	@Bean
	@Scope(value="prototype", proxyMode=ScopedProxyMode.TARGET_CLASS)
	public Hello hello() {
		return new Hello();
	}

18.1.5 渚濊禆娉ㄥ叆

瀵逛簬澶勪簬鍚屼竴涓娇鐢ˊConfiguration杩涜鏍囨敞鐨勯厤缃被涓殑bean娉ㄥ叆锛屾垜浠彲浠ョ洿鎺ラ€氳繃鏂规硶璋冪敤鐨勫舰寮忔潵鑾峰彇瀵瑰簲鐨刡ean瀹炰緥浠ヨ繘琛屾敞鍏ャ€傚涓嬬ず渚嬩腑鎴戜滑灏遍€氳繃璋冪敤world()鏂规硶鑾峰彇浜嗕竴涓猈orld瀹炰緥锛岀劧鍚庢敞鍏ョ粰浜咹ello鐨勫疄渚嬨€?/p>

	@Bean
	public Hello hello() {
		Hello hello = new Hello();
		hello.setWorld(this.world());
		return hello;
	}
	
	@Bean
	public World world() {
		return new World();
	}

涔熷彲浠ュ儚涔嬪墠浠嬬粛鐨勪娇鐢ˊAutowired鎴朄Inject鏍囨敞杩涜鑷姩娉ㄥ叆锛屽嵆鍦ㄥ搴旂殑bean瀵瑰簲鐨凜lass绫讳腑杩涜瀹氫箟銆傚涓嬬ず渚嬩腑鎴戜滑灏遍€氳繃@Autowired瀹氫箟浜唚orld闇€瑕佽繘琛岃嚜鍔ㄦ敞鍏ャ€傚浜庝娇鐢↗ava绫昏繘琛岄厤缃殑鎯呭喌锛孲pring浼氳嚜鍔ㄦ壂鎻忓搴旂殑娉ㄨВ浠ュ畬鎴愬搴旂殑bean瀹氫箟銆?/p>

public class Hello {
	
	@Autowired
	private World world;

}

鍐嶆潵鐪嬩竴涓ず渚嬶紝鍦ㄤ笅闈㈢殑绀轰緥涓紝鎴戜滑璋冪敤浜嗕袱娆orld()鏂规硶锛屽垎鍒幏鍙栧搴旂殑bean瀹炰緥娉ㄥ叆hello鍜宐eanA銆傚洜涓篠pring榛樿鐢熸垚鐨刡ean瀹炰緥鏄痵ingleton绫诲瀷鐨勶紝涓轰簡瀹炵幇杩欑鏈哄埗锛屽垯鍦ㄧ涓€娆¤皟鐢╳orld()浜х敓浜嗙涓€涓疄渚嬪悗锛孲pring浼氬皢瀵瑰簲鐨勫璞$紦瀛樿捣鏉ワ紝寰呬笅娆″啀璋冪敤world()鏂规硶鑾峰彇瀹炰緥鏃跺垯鐩存帴鑾峰彇缂撳瓨璧锋潵鐨勯偅涓疄渚嬨€傛墍浠ュ浜庡涓嬭繖绉嶆儏鍐碉紝瀹為檯涓奡pring涔熷彧浼氫骇鐢熶竴涓猈orld瀹炰緥銆係pring鐨勮繖绉嶅熀浜嶫ava绫婚厤缃殑鍗曚緥bean鏈哄埗鏄€氳繃CGLIB鍔ㄦ€佺敓鎴愮被鏉ュ疄鐜扮殑锛屽湪绯荤粺鍚姩鏃讹紝Spring灏嗛€氳繃CGLIB鏋勫缓鎵€鏈変娇鐢ˊConfiguration杩涜鏍囨敞鐨凜lass鐨勫瓙绫伙紝鍦ㄥ瓙绫昏皟鐢ㄧ埗绫诲搴旀柟娉曚骇鐢熷搴旂殑bean瀹炰緥涔嬪墠锛屼細鍏堜粠瀛愮被鐨勭紦瀛樹腑鑾峰彇锛屽彧鏈夊湪鍙栦笉鍒扮殑鎯呭喌涓嬫墠浼氳皟鐢ㄧ埗绫讳骇鐢熸柊鐨勫疄渚嬶紝浜х敓浜嗗搴旂殑瀹炰緥鍚庡氨灏嗗叾缂撳瓨鍒板搴旂殑缂撳瓨涓€傚彟澶栵紝閴翠簬Spring鐨勮繖绉嶆満鍒跺氨瑕佹眰鎴戜滑瀵瑰簲鐨凧ava閰嶇疆Class涓嶆槸final鍨嬬殑锛屼笖瀛樺湪涓€涓棤鍙傛瀯閫犳柟娉曘€?/p>

@Configuration
public class SpringConfig {

	@Bean
	public Hello hello() {
		Hello hello = new Hello();
		hello.setWorld(world());
		return hello;
	}
	
	@Bean
	public World world() {
		return new World();
	}
	
	@Bean
	public BeanA beanA() {
		BeanA beanA = new BeanA();
		beanA.setWorld(world());
		return beanA;
	}
	
}

18.1.6 浣跨敤lookup-method

鍦ㄤ箣鍓嶄粙缁峏ML閰嶇疆鏃讹紝鎴戜滑鏇句娇鐢╨ookup-method鐨勬柟寮忎互瑙e喅鍗曚緥bean寮曠敤澶氫緥bean鐨勯棶棰樸€傚湪浣跨敤鍩轰簬Java杩涜閰嶇疆鏃跺鏋滄垜浠篃甯屾湜浠ヨ繖鏍风殑鏂瑰紡鏉ヨВ鍐冲崟渚媌ean寮曠敤澶氫緥bean鐨勬儏鍐碉紝鍒欐垜浠彲浠ラ€氳繃濡備笅鏂瑰紡杩涜瑙e喅銆傛墦涓瘮鏂规垜浠湁涓€涓崟渚媌ean锛屽搴旂被Hello锛屽叾闇€瑕佸紩鐢ㄤ竴涓渚嬬殑bean World锛岄偅涔堟垜浠氨鍙互鍦℉ello涓畾涔変竴涓叕鐢ㄧ殑鏂规硶浠ヨ幏鍙朩orld瀹炰緥锛岀劧鍚庢瘡娆¢渶瑕佷娇鐢╓orld瀹炰緥鏃堕兘閫氳繃璇ユ柟娉曡幏鍙栵紝濡備笅鐨刧etWorld()鏂规硶灏辨槸杩欎釜鍔熻兘銆?/p>

public class Hello {
	
	public void doSomething() {
		World world = this.getWorld();
		System.out.println(world);
		//...
	}
	
	public World getWorld() {
		return null;
	}

}

鐒跺悗鎴戜滑鍦ㄥ畾涔塇ello瀵瑰簲鐨勫崟渚媌ean鏃讹紝鍙互new涓€涓尶鍚嶇殑Hello绫荤殑瀛愮被锛岀劧鍚庡湪鍏朵腑閲嶅啓getWorld()鏂规硶锛屽搴旀柟娉曚綋鍒欐槸閫氳繃@Configuration鏍囨敞鐨勯厤缃被鐨勫搴旀柟娉曡幏鍙栦竴涓渚嬬殑World瀹炰緥銆傝繖鏍锋垜浠湪鍗曚緥鐨刪ello涓瘡娆¤皟鐢╣etWorld()鏂规硶鏃堕兘浼氫粠bean瀹瑰櫒涓幏鍙栧埌涓€涓叏鏂扮殑World瀹炰緥銆?/p>

@Configuration
public class SpringConfig {

	@Bean
	public Hello hello() {
		Hello hello = new Hello() {
			public World getWorld() {
				return world();
			}
		};
		return hello;
	}
	
	@Bean
	@Scope("prototype")
	public World world() {
		return new World();
	}
	
}