2012-06-19 146 views
2

我有一个注解类为@Configuration(我们称之为StubConfiguration)的类,它有一个注解为@Bean的单一方法。该方法返回一个BeanFactoryPostProcessor实现,它负责注册一些bean。但是,Spring无法解析这个工厂在运行时注册的bean。从配置注释类中注册bean

我的假设是StubConfiguration是由Spring的组件扫描,BeanFactoryPostProcessor被注册,然后调用它的postProcessBeanFactory()方法,随后注册我需要的bean。

我在想这个不对吗?如何使用此后处理注册我需要的beans与我的ApplicationContext

+0

我认为豆依赖性的'BeanFactoryPostProcessor'调用之前可能确定。为什么要使用后处理器注册新bean,而不是直接从'@ Configuration'类创建它们? – matts

+0

@matts:后处理器使用'@ Stub'注释扫描并注册类。否则我想不出一个简单的方法来做到这一点。 –

+0

它是否对这些存根执行任何特殊操作,或者只是告诉Spring将它们添加到应用程序上下文中并像往常一样处理它们? – matts

回答

0

如果您还使用XML应用上下文来声明bean,那么可以告诉Spring执行组件扫描并将@Stub视为Spring组件注释。

<context:component-scan base-package="your.base.package"> 
    <context:include-filter type="annotation" expression="your.stub.package.Stub"/> 
</context:component-scan> 

如果你只使用注释配置应用程序上下文中,检查出this answer一种方式来做到这一点没有XML。

+0

我不确定我是否完全遵循。我有一些Stub类,这些类使用一个'Stub'注释来注释,这个注释也包含这个bean的名字,例如'@Stub( “myStub”)'。然后,例如,我可能想要做一些像'context.getBean(“myStub”,MyStub.class)''。 –

+0

您的项目中是否有一个“applicationContext.xml”文件(或其他XML Spring上下文文件),您可以控制它?上面的'component-scan'标签放在那里,告诉Spring搜索指定的包并找到具有指定注释的类。这些类作为bean添加到应用程序上下文中。 (但是,它们将使用默认的命名策略来命名,它只使用类的名称。)如果您没有Spring应用程序上下文文件,则必须以其他方式完成此操作。 – matts

+0

这可以工作,但事实证明我只是需要将工厂所在的包添加到'component-scan'的'base-package'中。由于它是在一个单独的软件包中,它并没有被Spring收录。添加它会导致在后处理期间注册bean。 –

0

如何让您的@Stub注释扩展@Component注释?像@Service@Repository

您将使用普通的Spring上下文扫描来扫描bean,您可以保留自定义注释,而且不需要手动注册bean。从@Service

例子:

{@Target({ElementType.TYPE}) 
@Retention(RetentionPolicy.RUNTIME) 
@Documented 
@Component 
public @interface Service { 

    /** 
    * The value may indicate a suggestion for a logical component name, 
    * to be turned into a Spring bean in case of an autodetected component. 
    * @return the suggested component name, if any 
    */ 
    String value() default ""; 

}} 
+0

不幸的是修改'Stub'并不是真的可能,因为我没有管理它,但即使是这样,我怎样才能通过它们的名字加载bean?例如,如果我用'@Stub(“myStub”)'注释了一个存根bean,就像我在其他答案的评论中提到的那样。我的后期处理工厂目前使用这个名称值注册了'Stub' bean,以便稍后可以用它来检索它们。 –