我想用一個JobEnabledDecorator對象來包裝一些實現Job接口的類,以確定它是否執行。如何註冊依賴注入框架(PicoContainer)中的裝飾對象?
我很難搞清楚如何在PicoContainer中配置它,以便它知道使用包裝它們的JobEnabledDecorator創建Job實現對象。
這是可能的依賴注入框架?
PicoContainer中可能嗎?
如果是這樣,任何幫助,將不勝感激。
我想用一個JobEnabledDecorator對象來包裝一些實現Job接口的類,以確定它是否執行。如何註冊依賴注入框架(PicoContainer)中的裝飾對象?
我很難搞清楚如何在PicoContainer中配置它,以便它知道使用包裝它們的JobEnabledDecorator創建Job實現對象。
這是可能的依賴注入框架?
PicoContainer中可能嗎?
如果是這樣,任何幫助,將不勝感激。
您可能需要添加「行爲」。簡言之,您需要註冊一個行爲工廠,創建包裝組件適配器的行爲。通過一個例子來描述時更容易描述。
首先,你要創建一個容器,像這樣。
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)
對象。
感謝您的好評。不幸的是,我只能給你一個upvote! – 2009-12-19 18:47:45
這對你很有幫助,那纔是最重要的。 :-) – 2009-12-20 16:45:37