3

我想用一個JobEnabledDecorator對象來包裝一些實現Job接口的類,以確定它是否執行。如何註冊依賴注入框架(PicoContainer)中的裝飾對象?

我很難搞清楚如何在PicoContainer中配置它,以便它知道使用包裝它們的JobEnabledDecorator創建Job實現對象。

這是可能的依賴注入框架?

PicoContainer中可能嗎?

如果是這樣,任何幫助,將不勝感激。

回答

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)對象。

+0

感謝您的好評。不幸的是,我只能給你一個upvote! – 2009-12-19 18:47:45

+0

這對你很有幫助,那纔是最重要的。 :-) – 2009-12-20 16:45:37