@Resource註解

來源:互聯網
上載者:User

標籤:

@Resource 註解被用來啟用一個命名資源(namedresource)的依賴注入,在JavaEE應用程式中,該註解被典型地轉換為綁定於JNDI context中的一個對象。Spring確實支援使用@Resource通過JNDIlookup來解析對象,預設地,擁有與@Resource註解所提供名字相匹配的“beanname(bean名字)”的Spring管理對象會被注入。在下面的例子中,Spring會向加了註解的setter方法傳遞bean名為“dataSource”的Spring管理對象的引用。

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

直接使用@Resource註解一個域(field)同樣是可能的。通過不暴露setter方法,代碼愈發緊湊並且還提供了域不可修改的額外益處。正如下面將要證明的,@Resource註解甚至不需要一個顯式的字串值,在沒有提供任何值的情況下,網域名稱將被當作預設值。

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

該方式被應用到setter方法的時候,預設名是從相應的屬性衍生出來,換句話說,命名為‘setDataSource‘的方法被用來處理名為‘dataSource‘的屬性。

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註解的依賴進行JNDIlookup,那也只要將CommonAnnotationBeanPostProcessor的‘alwaysUseJndiLookup‘標識設定為true就可以了(預設值是false)。

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

另一個選擇是,啟用指定為‘resource-ref-mappings’的依據全域JNDI名的尋找,在@Resource註解內提供‘mappedName’屬性。即使目標對象實際上是一個JNDI資源,仍然推薦引入一個Spring管理對象,這樣可以提供一個間接層並且因此降低耦合程度。自Spring2.0開始添加命名空間以來,定義一個委託Spring處理JNDIlookup的bean也變得愈發簡練:

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

這個方法的優點在於間接層帶來了巨大的部署彈性。比如說,一個單獨的系統測試環境應該不再需要JNDI註冊。在這種情況下,在系統測試組態中可以提供如下的bean定義:

<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串連屬性從一個屬性檔案(propertiesfile)解析而來,在這個屬性檔案裡,關鍵字與提供的${預留位置}互相對應,這需要註冊一個名為PropertyPlaceholderConfigurer的BeanFactoryPostProcessor實現來完成。這是具體化那些屬性(通常是針對特定環境的屬性)常用的技術,這些屬性可能比其他配置修改得更為頻繁。

<beanclass="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<propertyname="location"value="classpath:jdbc.properties"/>
</bean>

Srping2.5中新加入了‘context’命名空間,這個命名空間讓我們能夠得到更為簡潔的方式來實現屬性預留位置(propertyplaceholder)的配置:

<context:property-placeholder location="classpath:jdbc.properties"/>

@Resource註解(轉)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.