おそらく「振る舞い」を追加したいと思うでしょう。簡単に言うと、コンポーネント アダプターをラップするビヘイビアを作成するビヘイビア ファクトリを登録する必要があります。例を見ていくと説明が簡単になります。
まず、コンテナを作成します。
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)
オブジェクトを渡したからです。