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> |