1. 程式人生 > >spring實戰-註解裝配bean

spring實戰-註解裝配bean

spring提供的基於xml的bean裝配並不受所有人的歡迎,實際上很多開發人員排斥太多的xml配置,spring還提供了基於註解的bean申明和裝配,事實上該種方式也是目前最普遍受歡迎的方式

spring-beans.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
	xmlns:p="http://www.springframework.org/schema/p" xmlns:util="http://www.springframework.org/schema/util"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
	http://www.springframework.org/schema/beans/spring-beans.xsd
	http://www.springframework.org/schema/context
	http://www.springframework.org/schema/context/spring-context.xsd
	http://www.springframework.org/schema/util
	http://www.springframework.org/schema/util/spring-util.xsd">
	
	<!-- context:component-scan會掃描制定的包及其子包,並查找出能夠自動註冊為bean的類 -->
	<!-- 它能夠識別的註解包括 @Component通用註解, @Controller控制器註解, @Service服務層註解, @Respository資料層註解 -->
	<!-- 可以通過<context:exclude-filter>和<context:include-filter>來調整掃描行為 -->
	<!-- filter中的type常用有annotation,assingable,regex。 -->
	<!-- annotation表示過濾expression中指定註解的類, -->
	<!-- assingable表示過濾expression中指定類的派生類, -->
	<!-- regex表示指定過濾expression中指定正則表示式匹配的類名的類 -->
	<context:component-scan base-package="com.halfworlders">
		<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service"/>
		<context:include-filter type="annotation" expression="org.springframework.stereotype.Component"/>
	</context:component-scan>
	
</beans>

TestMain

package com.halfworlders.test;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * @Primary 註解 設定首選bean
 * @Qualifier 註解設定限定符
 * @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) 註解設定作用域
*/
class TestMain3 {
	@SuppressWarnings({ "resource", "unused" })
	
	public static void main(String[] args) {
		ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-beans.xml");  
        Object proxy = applicationContext.getBean("proxyInfo");  
        Object connection = applicationContext.getBean("connection");  
        Object service = applicationContext.getBean("service");  
        System.out.println("-----end------");  
	}
}


ProxyInfo

package com.halfworlders.web;

import org.springframework.stereotype.Component;

/*
 * 當為Component註解指定引數時,該Bean的ID就是引數值
 * 如果沒有指定引數,預設就為類名首字母小寫作為ID值
 */
@Component("proxyInfo")
public class ProxyInfo {
	private String ip;
	private int port;
	
	get..set..
}
Config
package com.halfworlders.web;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component
public class Config {
	
	/*
	 * 可以通過Value裝配任何型別的值,包括基本型別等硬編碼的值,但是這樣做並沒有什麼意義
	 * 但是Value註解可以使用SpEL表示式
	 * 特別的是,在專案中我們經常通過Value註解將properties檔案的配置引數注入到系統中
	 */
	@Value("5")
	private int timeOut;

	get...set...
	
}

Connection
package com.halfworlders.web;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;

/**
 * autowired註解注入,必須保證有且只有一個可以匹配的bean,否則會報異常
 * 但是也都有對應的方法,避免異常:1,可選的自動裝配;2,限定歧義性依賴
 */
@Component
public class Connection {

	/*
	 * 基於屬性的註解注入,autowired註解的注入不會受限於private關鍵字
	 * 1,required=false可選的自動裝配,如果沒有可以匹配的bean,這proxyInfo為null值
	 * 2,Qualifier可以幫助限定歧義性依賴,如果有多個可以匹配的bean,可以通過Qualifier制定bean的名字(ID)來注入
	 */
	@Autowired(required=false)
	@Qualifier("proxyInfo")
	private ProxyInfo proxyInfo;
	
	private Config config;
	
	public Connection(){
	}
	

	/*
	 * 基於屬性set函式的註解注入
	 */
	@Autowired
	public void setConfig(Config config) {
		this.config = config;
	}
	
	get...set...

}

Service
package com.halfworlders.web;

import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class Service {
	private Connection connection;
	private List<String> urls;
	private Map<String, String> response;
	
	public Service() {
		
	}
	
	/*
	 * 基於建構函式的註解注入
	 * 當autowired標註多個建構函式時,系統會選擇引數最多的那個構造器
	 */
	@Autowired
	public Service(Connection connection) {
		this.connection = connection;
	}
	
	get...set...
}