2017-08-20 22 views
0

我已經通過@Configuration和@Bean註釋看到了很多關於Spring配置的示例。但是我發佈了將@Bean註釋添加到直接調用來填充其他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();} 

所以,我想知道是否好轉只是宣佈hibernateProperties()私人沒有@Bean註解。

我想知道這是一個壞/不需要通常的做法或有背後的原因。

在此先感謝!

回答

1

根據Spring Documentation豆間依賴性注入是爲了以簡單的形式來定義bean依賴一個很好的方法。當然,如果你將你的hibernateProperties()定義爲私有的,它將起作用,但它不能通過Spring Container注入應用程序中的其他組件。

取決於有多少類取決於你的bean,也如果你需要重複使用,以調用它的方法,或者注入其他類只是決定。

+0

謝謝!我知道了。 –

0

使用@Bean修飾@Configuration類中的方法意味着該方法的返回值將成爲Spring bean。

默認情況下,那些豆都是單身(僅適用於應用程序的生命一個實例)。

在您的例子春知道hibernateProperties()是一個singleton bean,並創建唯一的。所以在這裏:

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

hibernateProperties()方法將不會被再次執行,但是豆會從應用程序上下文服用。如果你沒有使用@Bean來註釋hibernateProperties(),它將是一個簡單的java方法,它將在調用時執行。這取決於你想要什麼。

就更不用說了,其他的方式做依賴注入的@Configuration類是添加參數。就像這樣:

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

春嘗試創建了一個SessionFactory()豆將首先在應用程序上下文中尋找Properties類型的豆。

+0

謝謝!我知道了。 –

相關問題