@Configuration(注解类) + @Bean(注解方法) 相当于xml配置中bean,那么与@Component, @Repository, @Service, @Controller定义的Bean有什么区别
@Configuration(注解类) + @Bean(注解方法) 相当于xml配置中bean,那么与@Component, @Repository, @Service, @Controller定义的Bean有什么区别
@Configuration(注解类) + @Bean(注解方法) 相当于xml配置中bean,那么与@Component, @Repository, @Service, @Controller定义的Bean有什么区别
2017-04-12
一楼说得太粗了。这样说,我也可以说golang和Java本质没什么区别,只是语言理念不同。
二楼从应用的角度,解释了一楼提出的分类问题。
当然,我也懒得详细说明,简单粘贴以前写的一份随笔记录:
“
但从官方文档来看,两者还意味着bean加载方式的不同。
(@Bean也需要标注在@Configuration标注的类中,@Configuration继承@Component)
虽然Component注解也会当做配置类,但是并不会为其生成CGLIB代理Class。而@Configuration标注的配置类,会通过CGLIB代理Class(详见ConfigurationClassPostProcessor#enhanceConfigurationClasses),所以每次都是获取IOC容器中的固定的bean。
@Bean就得看所在类是@Component标注,还是@Configuration标注了。
在配置类的方法间调用时,如果类时@component标注的,每次调用获取的都是新的实体;而如果是@configuration标注的话,每次调用返回的是同一个实体Bean。其他方面都是相同,可以无差别使用(装配注入等)。
这是因为@Configuration标注下的@Bean调用函数使用都是代理对象,获取的都是从IOC容器里获取的bean,因此都是同一个。而@Component标注下的@Bean下只是普通的函数方法调用,因此每次调用后,都不是同一个。
(另外,bean最早注册进入IOC容器,也还是反射方式。并且@Scope是注入处的范围,不在此)
”
另外建议题主,可以看看官方文档。这个问题在官方文档中,有明确说明的。
举报