@Configuration(注解類) + @Bean(注解方法) 相當(dāng)于xml配置中bean,那么與@Component, @Repository, @Service, @Controller定義的Bean有什么區(qū)別
@Configuration(注解類) + @Bean(注解方法) 相當(dāng)于xml配置中bean,那么與@Component, @Repository, @Service, @Controller定義的Bean有什么區(qū)別
@Configuration(注解類) + @Bean(注解方法) 相當(dāng)于xml配置中bean,那么與@Component, @Repository, @Service, @Controller定義的Bean有什么區(qū)別
2017-04-12
舉報
2020-10-14
一樓說得太粗了。這樣說,我也可以說golang和Java本質(zhì)沒什么區(qū)別,只是語言理念不同。
二樓從應(yīng)用的角度,解釋了一樓提出的分類問題。
當(dāng)然,我也懶得詳細(xì)說明,簡單粘貼以前寫的一份隨筆記錄:
“
但從官方文檔來看,兩者還意味著bean加載方式的不同。
(@Bean也需要標(biāo)注在@Configuration標(biāo)注的類中,@Configuration繼承@Component)
雖然Component注解也會當(dāng)做配置類,但是并不會為其生成CGLIB代理Class。而@Configuration標(biāo)注的配置類,會通過CGLIB代理Class(詳見ConfigurationClassPostProcessor#enhanceConfigurationClasses),所以每次都是獲取IOC容器中的固定的bean。
@Bean就得看所在類是@Component標(biāo)注,還是@Configuration標(biāo)注了。
在配置類的方法間調(diào)用時,如果類時@component標(biāo)注的,每次調(diào)用獲取的都是新的實(shí)體;而如果是@configuration標(biāo)注的話,每次調(diào)用返回的是同一個實(shí)體Bean。其他方面都是相同,可以無差別使用(裝配注入等)。
這是因為@Configuration標(biāo)注下的@Bean調(diào)用函數(shù)使用都是代理對象,獲取的都是從IOC容器里獲取的bean,因此都是同一個。而@Component標(biāo)注下的@Bean下只是普通的函數(shù)方法調(diào)用,因此每次調(diào)用后,都不是同一個。
(另外,bean最早注冊進(jìn)入IOC容器,也還是反射方式。并且@Scope是注入處的范圍,不在此)
”
另外建議題主,可以看看官方文檔。這個問題在官方文檔中,有明確說明的。
2019-07-16
@Component 是可以用以所有類 @Repository一般用于持久層操作數(shù)據(jù)庫上的 @Service 一般用于業(yè)務(wù)邏輯里面的實(shí)現(xiàn)類,@Controller 一般是用于控制器上的注解 @Bean 一般是跟@Configuration一起用的相當(dāng)于<beans><bean></bean></beans>
2017-04-13
都是bean,本質(zhì)上沒有什么區(qū)別,只是對bean的應(yīng)用分了類