This is a cache of http://dbflute.seasar.org/ja/lastaflute/lastadi/dixmlexp.html. It is a snapshot of the page at 2024-03-19T01:04:48.667+0000.
Di xml の Expression | <strong>dbflute</strong>

Di xml の Expression

Nashorn JavaScript

Di xml 上のプロパティはコンポーネントの expression のパーサーとして、Javaに組み込まれている、JavaScriptエンジン Nashorn を使っています。

これにより、依存ライブラリなしで Di xml を利用することができます。

一方で、OgNL や groovy などに比べて若干表現力は落ちる可能性があります。 ですが、Di xml での expression は、ちょっとした生成ロジックの補佐に徹して、あまり複雑になり過ぎないようにする方がよいと考えています。 例えば、LastaFluteであれば、環境依存のコンフィグのようなものは、_env.properties で管理することをオススメしています。

ですが、Di xml でのニーズを完全に把握し切れていませんので、ユーザーの方々のフィードバックや利用状況を考慮しながら、バランスよく対応していきたいと思います。

e.g. Di xml vaious pattern  @Dixml
<components&gt;
    <include path="lastaflute.xml"/&gt;
    <include condition="#exists('#path')" path="trial_option.xml"/&gt;
    <include condition="#SMART == 'alwaysNotMatch'" path="rdb.xml"/&gt;

    <component name="sea" class="org.docksidestage.mylasta.trial.TrialDiSea"/&gt;
    <component name="land" class="org.docksidestage.mylasta.trial.TrialDiLand"/&gt;
    <component name="parks"&gt;[sea, land]</component&gt;
    <component name="maihama" class="org.docksidestage.mylasta.trial.TrialDiMaihama"&gt;
        <property name="parkList"&gt;parks</property&gt;
    </component&gt;

    <component name="expSea" class="org.docksidestage.mylasta.trial.TrialExpSea"&gt;
        <property name="simpleString"&gt;"dockside"</property&gt;
        <property name="simpleInteger"&gt;3</property&gt;
        <postConstruct name="addStringList"&gt;
            <arg&gt;["a","b"]</arg&gt;
        </postConstruct&gt;
        <postConstruct name="addStringMap"&gt;
            <arg&gt;{"sea.over": "land.oneman"}</arg&gt;
        </postConstruct&gt;
        <postConstruct name="addIntArray"&gt;
            <arg&gt;(int[])[1,2]</arg&gt
        </postConstruct&gt;
        <postConstruct name="addStringArray"&gt;
            <arg&gt;(String[])["sea" ,  "land" ]</arg&gt;
        </postConstruct&gt;
        <postConstruct name="addType"&gt;
            <arg&gt;@org.dbflute.Entity@class</arg&gt;
        </postConstruct&gt;
        <postConstruct name="addStaticFinal"&gt;
            <arg&gt;@jp.sea.SeaPark@STATIC_DEF</arg&gt;
        </postConstruct&gt;
        <postConstruct name="addStaticMethod">
            <arg&gt;@jp.sea.SeaPark@callStatic()</arg&gt;
        </postConstruct&gt;
        
        <postConstruct name="addConfigProp"&gt;
            <arg&gt;provider.config().getJdbcUrl()</arg&gt;
        </postConstruct&gt;
        <postConstruct name="addCipher"&gt;
            <arg&gt;lastaflute_core.primaryCipher</arg&gt;
        </postConstruct&gt;
    </component&gt;

    <component name="expPark"&gt;
        provider.config().isDevelopmentHere()
            ? "new org.docksidestage.mylasta.trial.TrialSwitchableSea()"
            : "new org.docksidestage.mylasta.trial.TrialSwitchableLand()"
    </component&gt;
    <component name="switchingMaihama" class="org.docksidestage.mylasta.trial.TrialSwitchingMaihama"/&gt;
</components&gt;

Simple Literal

e.g. Di xml simple literal  @Dixml
<property name="simpleString"&gt;"dockside"</property&gt;
<property name="simpleInteger"&gt;3</property&gt;
<postConstruct name="addStringList"&gt;
    <arg&gt;["a","b"]</arg&gt;
</postConstruct&gt;
<postConstruct name="addStringMap"&gt;
    <arg&gt;{"sea.over": "land.oneman"}</arg&gt;
</postConstruct&gt;

Reflection Literal

e.g. Di xml reflection literal  @Dixml

<postConstruct name="addType"&gt;
    <arg&gt;@org.dbflute.Entity@class</arg&gt;
</postConstruct&gt;
<postConstruct name="addStaticFinal"&gt;
    <arg&gt;@jp.sea.SeaPark@STATIC_DEF</arg&gt;
</postConstruct&gt;
<postConstruct name="addStaticMethod">
    <arg&gt;@jp.sea.SeaPark@callStatic()</arg&gt;
</postConstruct&gt;
<postConstruct name="addConfigProp"&gt;
    <arg&gt;provider.config().getJdbcUrl()</arg&gt;
</postConstruct&gt;

Component Reference

e.g. Di xml reflection literal  @Dixml
<component name="sea" class="org.docksidestage.mylasta.trial.TrialDiSea"/&gt;
<component name="land" class="org.docksidestage.mylasta.trial.TrialDiLand"/&gt;
<component name="parks"&gt;[sea, land]</component&gt;
<component name="maihama" class="org.docksidestage.mylasta.trial.TrialDiMaihama"&gt;
    <property name="parkList"&gt;parks</property&gt;
</component&gt;

...
<component name="expSea" class="org.docksidestage.mylasta.trial.TrialExpSea"&gt;
    ...
    <postConstruct name="addConfigProp"&gt;
        <arg&gt;provider.config().getJdbcUrl()</arg&gt;
    </postConstruct&gt;
    <postConstruct name="addCipher"&gt;
        <arg&gt;lastaflute_core.primaryCipher</arg&gt;
    </postConstruct&gt;
    ...
</component&gt;

リスト内のコンポーネント参照は、すべての要素がコンポーネントである必要があります。

同じファイル内、もしくは、include先のコンポーネントを参照できます。その世界の中でユニークなコンポーネント名であれば、そのまま記述できます。 ユニークではない、もしくは、紛れがおきないようにしたいとかであれば、lastaflute_core.primaryCipher というように、namespaceを指定します。

Condition Operand

e.g. Di xml reflection literal  @Dixml
<include condition="#exists('#path')" path="trial_option.xml"/&gt;
<include condition="#SMART == 'alwaysNotMatch'" path="rdb.xml"/&gt;

...

<component name="switchedPark"&gt;
    provider.config().isDevelopmentHere()
        ? "new org.docksidestage.mylasta.trial.TrialSwitchableSea()"
        : "new org.docksidestage.mylasta.trial.TrialSwitchableLand()"
</component&gt;

"xmlファイルが存在していたら include する" を、#exists() を使うことで定型的に書けます。

conditionの中で、'==' 演算子も利用できます。#SMART は、'cool', 'hot', 'warm' の三つのどれか。(Exampleでは、絶対にヒットしないようになっています)

三項演算子で new するときは、new部分をダブルクォーテーションで囲います。 三項演算子で切り替えたコンポーネントも、他のコンポーネントと同様に、@Resource の private フィールドでDIできます。

TODO jflute もっと整理する。