我通过@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()声明为私有更好。
我想知道这是一个不好/不必要的常见做法,或者背后有原因。
提前致谢!
答案 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。