微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

我想用JobEnabledDecorator对象包装许多实现Job接口的类,该对象确定它是否执行.

我无法弄清楚如何在picocontainer中配置它,以便它知道用JobEnabledDecorator包装它们来创建Job实现对象.

这在依赖注入框架中是否可行?

picocontainer有可能吗?

如果是这样,任何帮助将不胜感激.

解决方法

你可能想要添加一个“行为”.简而言之,您需要注册一个行为工厂,它创建包装组件适配器的行为.通过一个例子来描述它更容易.

首先,你想要创建一个容器,就像这样.

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-";
    }
}

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)对象.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐