@Resource註解

@Resource 註解被用來激活一個命名資源(named resource)的依賴注入,在JavaEE應用程序中,該註解被典型地轉換爲綁定於JNDI context中的一個對象。 Spring確實支持使用@Resource經過JNDI lookup來解析對象,默認地,擁有與@Resource註解所提供名字相匹配的「bean name(bean名字)」的Spring管理對象會被注入。 在下面的例子中,Spring會向加了註解的setter方法傳遞bean名爲「dataSource」的Spring管理對象的引用。java

@Resource(name="dataSource")
public void setDataSource(DataSource dataSource) {
this.dataSource = dataSource;
}

直接使用@Resource註解一個域(field)一樣是可能的。經過不暴露setter方法,代碼愈發緊湊而且還提供了域不可修改的額外益處。正以下面將要證實的,@Resource註解甚至不須要一個顯式的字符串值,在沒有提供任何值的狀況下,域名將被看成默認值。spring

@Resource
private DataSource dataSource; // inject the bean named 'dataSource'

該方式被應用到setter方法的時候,默認名是從相應的屬性衍生出來,換句話說,命名爲'setDataSource'的方法被用來處理名爲'dataSource'的屬性。app

private DataSource dataSource;
@Resource
public void setDataSource(DataSource dataSource) {
this.dataSource = dataSource;
}

@Resource沒有顯式提供名字的時候,若是根據默認名字找不到對應的Spring管理對象,注入機制會回滾至類型匹配(type-match)。若是恰好只有一個Spring管理對象符合該依賴的類型,那麼它會被注入。經過設置CommonAnnotationBeanPostProcessor 的‘fallbackToDefaultTypeMatch’屬性爲「false」(默認值是「true」)能夠禁用這一特性。測試

<bean class="org.springframework.context.annotation.CommonAnnotationBeanPostProcessor">
<property name="fallbackToDefaultTypeMatch" value="false"/>
</bean>

正如上文所提到的,在解析標有@Resource註解的依賴時,Spring支持JNDI-lookup。如若要強制對全部使用@Resource註解的依賴進行JNDI lookup,那也只要將CommonAnnotationBeanPostProcessor'alwaysUseJndiLookup' 標識設置爲true就能夠了(默認值是false)。this

<bean class="org.springframework.context.annotation.CommonAnnotationBeanPostProcessor">
<property name="alwaysUseJndiLookup" value="true"/>
</bean>

另外一個選擇是,激活指定爲‘resource-ref-mappings’的依據全局JNDI名的查找,在@Resource註解內提供‘mappedName’屬性。即便目標對象其實是一個JNDI資源,仍然推薦引入一個Spring管理對象,這樣能夠提供一個間接層而且所以下降耦合程度。自Spring2.0開始添加命名空間以來,定義一個委託Spring處理JNDI lookup的bean也變得愈發簡練:url

<jee:jndi-lookup id="dataSource" jndi-name="java:comp/env/jdbc/petclinic"/> 

這個方法的優勢在於間接層帶來了巨大的部署彈性。好比說,一個單獨的系統測試環境應該再也不須要JNDI註冊。在這種狀況下,在系統測試配置中能夠提供以下的bean定義:spa

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"
p:driverClassName="${jdbc.driverClassName}"
p:url="${jdbc.url}"
p:username="${jdbc.username}"
p:password="${jdbc.password}"/>

順便提一下,上面的例子中,實際的JDBC鏈接屬性從一個屬性文件(properties file)解析而來,在這個屬性文件裏,關鍵字與提供的${佔位符}互相對應,這須要註冊一個名爲PropertyPlaceholderConfigurerBeanFactoryPostProcessor實現來完成。這是具體化那些屬性(一般是針對特定環境的屬性)經常使用的技術,這些屬性可能比其餘配置修改得更爲頻繁。.net

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location" value="classpath:jdbc.properties"/>
</bean>

Srping2.5中新加入了‘context’命名空間,這個命名空間讓咱們可以獲得更爲簡潔的方式來實現屬性佔位符(property placeholder)的配置:對象

<context:property-placeholder location="classpath:jdbc.properties"/>
相關文章
相關標籤/搜索