当前位置: 首页 > 面试题库 >

Spring 3.0中的FactoryBeans和基于注释的配置

杨慎之
2023-03-14
问题内容

Spring提供了FactoryBean允许对bean进行非简单初始化的接口。该框架提供了许多工厂bean的实现,并且-
在使用Spring的XML配置时-工厂bean易于使用。

但是,在Spring 3.0中,我找不到在基于注释的配置(néeJavaConfig)中使用工厂bean的令人满意的方式。

显然,我可以手动实例化工厂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特定的回调接口,如InitializingBeanApplicationContextAwareBeanClassLoaderAware,或@PostConstruct例如。我还需要通过调用来检查的FactoryBean,找出回调接口它实现了,那么实现这个功能我自己setApplicationContextafterPropertiesSet()等等。

这让我感到尴尬和背对背:应用程序开发人员不必实现IOC容器的回调。

有谁知道从Spring Annotation配置中使用FactoryBeans的更好解决方案?


问题答案:

据我了解,您的问题是您想要的结果sqlSessionFactory()SqlSessionFactory(供其他方法使用),但是您必须SqlSessionFactoryBean@Bean-annotated方法返回才能触发Spring回调。

可以通过以下解决方法解决:

@Configuration 
public class AppConfig { 
    @Bean(name = "sqlSessionFactory")
    public SqlSessionFactoryBean sqlSessionFactoryBean() { ... }

    // FactoryBean is hidden behind this method
    public SqlSessionFactory sqlSessionFactory() {
        try {
            return sqlSessionFactoryBean().getObject();
        } catch (Exception ex) {
            throw new RuntimeException(ex);
        }
    }

    @Bean
    public AnotherBean anotherBean() {
        return new AnotherBean(sqlSessionFactory());
    }
}

关键是,对@Bean-annotated方法的调用被执行返回的bean初始化的一个方面(FactoryBean在您的情况下)拦截,因此对sqlSessionFactoryBean()in的调用sqlSessionFactory()返回完全初始化的FactoryBean



 类似资料:
  • 我最近的目标是构建一个Spring Boot应用程序,但不需要任何XML配置文件(或尽可能少),因此我希望避免使用一些XML文件(即web.XML),特别是对于一些bean定义部分。 更难的部分来了。 我想使用@AutoWired注释将一个SessionFactory bean注入到类中,但每次尝试启动应用程序时,我都得到: unsatisfiedDependencyException:创建名为“

  • 问题内容: 在最近我从事的一些大型项目中,选择其中一种(XML或注释)似乎变得越来越重要。随着项目的发展,一致性对于可维护性非常重要。 我的问题是:与基于注释的配置相比,基于XML的配置有哪些优势?与基于XML的配置相比,基于注释的配置有哪些优势? 问题答案: 注释有其用途,但它们不是杀死XML配置的灵丹妙药。我建议将两者混合! 例如,如果使用Spring,则将XML用于应用程序的依赖注入部分是完

  • 我最近在使用作为Spring Boot applications(v2.2)开发的微服务,在我的公司,我们使用Keycloak作为授权服务器。我们之所以选择它,是因为我们需要复杂的策略、角色和组,我们还需要用户托管授权(UMA)来在用户之间共享资源。 有没有一种方法可以在控制器级别使用某种注释?类似于下面的伪代码:

  • 从Spring 2.5开始,可以使用annotations配置依赖注入。 因此,不是使用XML来描述bean连接,而是可以通过在相关的类,方法或字段声明上使用注释将bean配置移动到组件类本身。 在注入XML之前执行注释注入。 因此,对于通过两种方法连接的属性,后一种配置将覆盖前者。 默认情况下,Spring容器中未打开注释接线。 因此,在我们使用基于注释的布线之前,我们需要在Spring配置文件

  • 我已将我的Spring应用程序配置如下: 我使用组件扫描来选择@配置。我的问题是Spring会为B注入豆子吗

  • 问题内容: 最近,在我们的团队中,我们开始讨论在代码中使用spring注释来定义spring依赖关系。当前,我们正在使用context.xml定义依赖项。您能给我一些关于这两种方法的线索吗?何时更好地使用? 编辑:我知道这似乎是对更一般的问题的重复问题,但是我对仅依赖注入的注解和配置的影响感兴趣,我相信与一般问题相比,注解和配置的影响会有所不同。 问题答案: 在阅读了此处的一些相关文章并在团队中进