3

Job インターフェイスを実装するいくつかのクラスを、実行するかどうかを決定する JobEnabledDecorator オブジェクトでラップしたいと考えています。

PicoContainer でこれを構成する方法を理解するのに苦労しているので、それらをラップする JobEnabledDecorator を使用して Job 実装オブジェクトを作成することがわかります。

これは依存性注入フレームワークで可能ですか?

PicoContainerで可能ですか?

もしそうなら、助けていただければ幸いです。

4

1 に答える 1

7

おそらく「振る舞い」を追加したいと思うでしょう。簡単に言うと、コンポーネント アダプターをラップするビヘイビアを作成するビヘイビア ファクトリを登録する必要があります。例を見ていくと説明が簡単になります。

まず、コンテナを作成します。

final MutablePicoContainer container = new PicoBuilder()
    .withBehaviors(new JobEnabledDecorating())
    .build();

これは、基本的なオブジェクトが作成されたら (あなたの場合は)、Jobそれに何か特別なものを追加したいということです。組み込みのビヘイビアは多数ありますが、独自のビヘイビアが必要ですJobEnabledDecorating

public class JobEnabledDecorating extends AbstractBehaviorFactory {
    @Override
    public ComponentAdapter createComponentAdapter(
        final ComponentMonitor componentMonitor, final LifecycleStrategy lifecycleStrategy,
        final Properties componentProperties, final Object componentKey,
        final Class componentImplementation, final Parameter... parameters) throws PicoCompositionException 
    {
        return componentMonitor.newBehavior(
            new JobEnabledDecorated(
                super.createComponentAdapter(
                    componentMonitor, lifecycleStrategy, componentProperties, 
                    componentKey, componentImplementation, parameters
                )
            )
        );
    }
}

ファクトリはJobEnabledDecorated、インスタンスを提供するコンポーネント アダプターをラップすることによって動作を作成します。実際の作業は、この動作で行われます。

public class JobEnabledDecorated extends AbstractBehavior<Job> {
    public JobEnabledDecorated(final ComponentAdapter<Job> delegate) {
        super(delegate);
    }

    @Override
    public Job getComponentInstance(final PicoContainer container, final Type into)
            throws PicoCompositionException {
        final Job instance = super.getComponentInstance(container, into);
        return new JobEnabledDecorator(instance);
    }

    @Override
    public String getDescriptor() {
        return "JobEnabledDecorator-";
    }
}

getComponentInstanceジョブを要求し、デコレータを追加して、このラップされたオブジェクトを新しいインスタンスとして返します。ここに独自のロジックを追加する必要があります。

public interface Job {
    void execute();
}

public class JobEnabledDecorator implements Job {
    private Job delegate;

    public JobEnabledDecorator(final Job delegate) {
        this.delegate = delegate;
    }

    @Override
    public void execute() {
        System.out.println("before");
        delegate.execute();
        System.out.println("after");
    }
}

public class MyJob implements Job {
    @Override
    public void execute() {
        System.out.println("execute");
    }
}

コンテナーの使用法に戻り、次の例を考えてみましょう。

    final MutablePicoContainer container = new PicoBuilder()
        .withBehaviors(new JobEnabledDecorating())
        .build();

    container.addComponent(Job.class, MyJob.class);

    final Job job = container.getComponent(Job.class);
    job.execute();

これを実行すると、次のように出力されます。

before
execute
after

これはもちろん、コンテナーがJobEnabledDecorator(MyJob)オブジェクトを渡したからです。

于 2009-12-18T20:55:38.837 に答える