2012-03-05 29 views
1

这里的情况是我有一个具有动态实现的接口。这些实现需要在运行时实例化并通过注入接口来使用:如何在Spring中引用它们时动态创建依赖项实现?

public interface Configuration { 
    void doStuff(); 
} 

public interface ExampleConfiguration extends Configuration { 
    void doStuff(); 
} 

ExampleConfiguration具有动态生成的实现。即,没有ExampleConfigurationImpl类。这被证明是难以融入春天,因为我想有这些生成实现自动注入:

@Autowired 
private ExampleConfiguration config; 

我下楼加入了BeanPostProcessor的道路,但它看起来像未解决的依赖性不经过那里(我会期待)。

从本质上讲,是有办法,试图解决缺少的依赖有助于工厂将被调用(与上下文信息,如DependencyDescriptor实例)?将有多个接口扩展配置接口。

Spring版本是3.0.3。

回答

2

你有没有尝试过FactoryBean

public class ExampleConfigurationFactoryBean implements FactoryBean<ExampleConfiguration> { 
    @Override 
    public ExampleConfiguration getObject() throws Exception { 
     return //...magic here 
    } 

    @Override 
    public Class<?> getObjectType() { 
     return ExampleConfiguration.class; 
    } 

    @Override 
    public boolean isSingleton() { 
     return true; 
    } 
} 

我不知道你是如何实际创建这些动态豆(我怀疑参与一些动态代理),但在魔这里占位符插入你的逻辑。应该管用。您可以使用FactoryBean,好像有在你的XML目标类型:

<bean id="exampleConfigurationFactoryBean" class="ExampleConfigurationFactoryBean"/> 
<bean id="someBean"> 
    <!-- exampleConfiguration is of ExampleConfiguration type --> 
    <property name="exampleConfiguration" ref="exampleConfigurationFactoryBean"/> 
</bean> 

Spring将调用getObject()要求时。

+0

+1/2 - 你能表现出'applicationContext.xml'需要建立在XML和引用工厂bean? – 2012-03-05 22:39:28

+0

@DavidHarkness:看到我的更新。 – 2012-03-05 22:49:06

+0

所以我没有遵循工厂bean的方法,但问题是扩展配置的接口有多种情况。我需要一个工厂bean,用于配置的每个扩展。 – Zack 2012-03-05 23:29:29

1

我假设你已经有了一些方法来实际制造的实例?好了,所有你需要做的是使该工厂变成一个bean本身并添加注释权:

@org.springframework.context.annotation.Configuration 
public class ConfigBean { 
    @org.springframework.context.annotation.Bean 
    public ExampleConfiguration getObject() throws Exception { 
     return //...magic here 
    } 
} 

你使用通常的春季技术挂接到你需要的任何配置。 (我假设你正在使用<context:component-scan><context:annotation-config> ...)

+0

这种方法唯一的问题是我需要为每个基本接口的实现创建一个新的方法。 – Zack 2012-03-05 23:28:05

相关问题