为了账号安全,请及时绑定邮箱和手机立即绑定

@Configuration(注解类) + @Bean(注解方法) 相当于xml配置中bean,那么与@Component, @Repository, @Service, @Controller定义的Bean有什么区别

@Configuration(注解类) + @Bean(注解方法) 相当于xml配置中bean,那么与@Component, @Repository, @Service, @Controller定义的Bean有什么区别

正在回答

3 回答

一楼说得太粗了。这样说,我也可以说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是注入处的范围,不在此)


另外建议题主,可以看看官方文档。这个问题在官方文档中,有明确说明的。


0 回复 有任何疑惑可以回复我~

@Component 是可以用以所有类 @Repository一般用于持久层操作数据库上的 @Service 一般用于业务逻辑里面的实现类,@Controller 一般是用于控制器上的注解 @Bean 一般是跟@Configuration一起用的相当于<beans><bean></bean></beans>


0 回复 有任何疑惑可以回复我~

都是bean,本质上没有什么区别,只是对bean的应用分了类

0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消

@Configuration(注解类) + @Bean(注解方法) 相当于xml配置中bean,那么与@Component, @Repository, @Service, @Controller定义的Bean有什么区别

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信