spring實戰-註解裝配bean
阿新 • • 發佈:2019-01-06
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...
}