Java EEでは、Dependency Injectionによってリソースやオブジェクトを取得できますが、Dependency Injectionでは以下のような問題があります。
Java EEコンテナで管理されるコンポーネントのみで使用可能
Dependency Injectionは、Java EEコンテナによって依存リソース/オブジェクトの注入が行われます。そのため、Java EEコンテナによって管理されるコンポーネントのみで使用可能であり、任意のクラスで使用できる方法ではありません。
プロパティはコードへ直接記述
Dependency Injectionの際にアノテーションにプロパティを記述する場合、その記述はソースに直接記述することになります。そのため、プロパティを変更するとJavaソースのコンパイルが必要になります。
lookupの場合には、参照名とJNDI名の対応付けはdeployment descriptorで変更できるため、実際の環境を意識せずに使用することができます。
上記のような問題を解決するためには、従来と同様にJNDIのlookupによってリソースやオブジェクトの取得を行います。
以下に、いくつか例を示します。
EJBのローカルインタフェースのlookup
以下のようにEJBのローカルインタフェースをlookupします。
lookupの例
InitialContext ic = new InitialContext(); Calc calc = (Calc)ic.lookup("java:comp/env/Calc"); |
lookupのためのdeployment descriptorの記述例
<ejb-local-ref> <ejb-local-ref-name>Calc</ejb-local-ref-name > <local>sample.Calc</local> <ejb-link>ejb1.jar#CalcBean</ejb-link> </ejb-local-ref > |
JMS Destinationのlookup
以下のようにJMS Destinationをlookupします。
lookupの例
InitialContext ic = new InitialContext(); Queue queue = (Queue)ic.lookup("java:comp/env/jms/myQueue"); |
lookupのためのdeployment descriptorの記述例
<message-destination-ref> <message-destination-ref-name>jms/myQueue</message-destination-ref-name> <message-destination-type>javax.jms.Queue</message-destination-type> <message-destination-usage>Produces</message-destination-usage> <message-destination-link>myDestination</message-destination-link> </message-destination-ref > ... <message-destination> <message-destination-name>myDestination</message-destination-name> <mapped-name>testQueue</mapped-name> </message-destination> |
JDBCリソースのlookup
以下のようにJDBCリソースをlookupします。
lookupの例
InitialContext ic = new InitialContext(); DataSource symfo = (DataSource)ic.lookup("java:comp/env/jdbc/Symfo"); |
lookupのためのdeployment descriptorの記述例
<resource-ref> <res-ref-name>jdbc/Symfo</res-ref-name> <res-type>javax.sql.DataSource</res-type> <res-auth>Container</res-auth> <mapped-name>SymfoTestServer</mapped-name> </resource-ref> |