为什么要将@Bean添加到我直接调用的方法

时间:2017-08-20 19:09:56

标签: spring

我通过@Configuration和@Bean注释看到了很多关于Spring配置的例子。但我发布通常的做法是将@Bean注释添加到直接调用以填充其他bean的方法中。例如:

@Bean
public Properties hibernateProperties() {
    Properties hibernateProp = new Properties();
    hibernateProp.put("hibernate.dialect",
            "org.hibernate.dialect.H2Dialect");
    hibernateProp.put("hibernate.hbm2ddl.auto", "create-drop");
    hibernateProp.put("hibernate.format_sql", true);
    hibernateProp.put("hibernate.use_sql_comments", true);
    hibernateProp.put("hibernate.show_sql", true);
    return hibernateProp;
}

@Bean public SessionFactory sessionFactory() {
    return new LocalSessionFactoryBuilder(dataSource())
            .scanPackages("com.ps.ents")
            .addProperties(hibernateProperties())
            .buildSessionFactory();}

所以,我想知道在没有@Bean注释的情况下将 hibernateProperties()声明为私有更好。

我想知道这是一个不好/不必要的常见做法,或者背后有原因。

提前致谢!

2 个答案:

答案 0 :(得分:1)

根据Spring Documentation bean之间的依赖注入是一种很好的方法,可以用简单的形式定义bean依赖关系。当然,如果您将hibernateProperties()定义为私有它将起作用,但无法通过Spring容器将其注入应用程序中的其他组件。

根据您的bean依赖多少类来决定,以及是否需要重用它以调用其方法或将其注入其他类。

答案 1 :(得分:0)

使用@Configuration@Bean类中装饰方法意味着该方法的返回值将成为Spring bean。

默认情况下,这些bean是单例(在应用程序的生命周期中只有一个实例)。

在你的例子中,Spring知道hibernateProperties()是一个单独的bean,并且只会创建它。所以这里:

@Bean public SessionFactory sessionFactory() {
    return new LocalSessionFactoryBuilder(dataSource())
            .scanPackages("com.ps.ents")
            .addProperties(hibernateProperties())
            .buildSessionFactory();
}

hibernateProperties()方法不会再次执行,但是bean将从应用程序上下文中获取。如果不使用@Bean注释hibernateProperties(),它将是一个简单的java方法,并且只要它被调用就会执行它。这取决于你想要什么。

提一下,在@Configuration类中进行依赖注入的另一种方法是添加一个参数。像这样:

@Bean public SessionFactory sessionFactory(Properties props) {
        return new LocalSessionFactoryBuilder(dataSource())
                .scanPackages("com.ps.ents")
                .addProperties(props)
                .buildSessionFactory();
    }

当Spring尝试创建sessionFactory()bean时,它将首先在应用程序上下文中查找类型为Properties的bean。