Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在依赖注入框架(PicoContainer)中注册修饰对象?_Java_Dependency Injection_Inversion Of Control_Decorator_Picocontainer - Fatal编程技术网

Java 如何在依赖注入框架(PicoContainer)中注册修饰对象?

Java 如何在依赖注入框架(PicoContainer)中注册修饰对象?,java,dependency-injection,inversion-of-control,decorator,picocontainer,Java,Dependency Injection,Inversion Of Control,Decorator,Picocontainer,我想用一个JobEnabledCorator对象包装一些实现Job接口的类,该对象确定它是否执行 我很难弄清楚如何在PicoContainer中配置它,以便它知道如何使用JobEnabledCorator包装它们来创建作业实现对象 这在依赖注入框架中可能吗 可以用皮卡集装箱吗 如果是这样,我们将非常感谢您的帮助。您可能需要添加一个“行为”。简而言之,您需要注册一个行为工厂,它创建包装组件适配器的行为。在浏览示例时更容易描述 首先,您需要创建一个容器,类似这样 final MutablePicoC

我想用一个JobEnabledCorator对象包装一些实现Job接口的类,该对象确定它是否执行

我很难弄清楚如何在PicoContainer中配置它,以便它知道如何使用JobEnabledCorator包装它们来创建作业实现对象

这在依赖注入框架中可能吗

可以用皮卡集装箱吗


如果是这样,我们将非常感谢您的帮助。

您可能需要添加一个“行为”。简而言之,您需要注册一个行为工厂,它创建包装组件适配器的行为。在浏览示例时更容易描述

首先,您需要创建一个容器,类似这样

final MutablePicoContainer container = new PicoBuilder()
    .withBehaviors(new JobEnabledDecorating())
    .build();
这意味着,一旦创建了基本对象(在您的例子中是
作业
),您就需要向其添加额外的内容。有许多内置行为,但您需要自己的:
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-";
    }
}

回到我们的容器使用,考虑这个例子。

    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

当然,这是因为容器给了您一个
JobEnabledCorator(MyJob)
对象。

谢谢您的回答。不幸的是,我只能投你一票!这对你很有帮助,这才是最重要的。:-)
before
execute
after