FactoryBeans和Spring 3.0中基于注释的配置
Spring提供了
FactoryBean
接口,允许对bean进行非平凡的初始化。该框架提供了许多工厂bean的实现,并且 - 当使用Spring的XML配置时 - 工厂bean很容易使用。
但是,在Spring 3.0中,我找不到一种令人满意的方法来使用带有基于注释的配置的工厂bean(néeJavaConfig)。
显然,我可以手动实例化工厂bean并自己设置任何所需的属性,如下所示:
@Configuration
public class AppConfig {
...
@Bean
public SqlSessionFactory sqlSessionFactory() throws Exception {
SqlSessionFactoryBean factory = new SqlSessionFactoryBean();
factory.setDataSource(dataSource());
factory.setAnotherProperty(anotherProperty());
return factory.getObject();
}
但是,如果FactoryBean
实现了任何特定于Spring的回调接口,例如InitializingBean
,ApplicationContextAware
,BeanClassLoaderAware
或@PostConstruct
,则会失败。我还需要检查FactoryBean,找出它实现的回调接口,然后通过调用setApplicationContext
,afterPropertiesSet()
等自己实现这个功能。
这对我来说感觉很尴尬和反过来:应用程序开发人员不应该实现IOC容器的回调。
有没有人知道使用Spring Annotation配置的FactoryBeans更好的解决方案?
没有找到相关结果
已邀请:
6 个回复
联海
是
(用于其他方法),但你必须从
注释方法返回
才能触发Spring回调。 它可以通过以下解决方法解决:
关键是对
注释方法的调用被一个方面拦截,该方面执行返回的bean的初始化(在你的情况下为
),因此在
中调用
会返回一个完全初始化的
。
完趣镐
所以Spring将为我们注入myFactory()。getObject()返回的MyBean实例,就像它配置XML一样。 如果您在@Component / @Service等类中使用@Inject / @ Autowire,这也应该有效。
琶竞捆栓
这个jira问题有一些背景知识 在Spring 3.0中,JavaConfig被转移到Spring核心,并决定摆脱ConfigurationSupport类。建议的方法是现在使用构建器模式而不是工厂。 从新的SessionFactoryBuilder中获取的示例
一些背景在这里
僻朵庙惩竣
您声明的任何bean都可以作为参数传递给任何其他@Bean方法(再次调用相同的方法将创建一个不由spring处理的新实例)。 如果声明FactoryBean,则可以使用它创建的bean类型作为另一个@Bean方法的参数,它将接收正确的实例。 你也可以用
任何地方,它也会工作。
冕偷淮款
但我可能不明白你的问题是正确的。因为在我看来你正在尝试一些奇怪的东西 - 退后一步,重新思考你真正需要什么。
疼嘶桐
创建sessionFactoryBean并在其中发生适当的创建后生命周期事件(afterPropertiesSet等)。 请注意,我没有直接将sessionFactoryBean引用为bean。我将sessionFactory自动装入我的其他bean。