问答详情
源自:4-5 Spring Bean装配之基于Java的容器注解说明——@Bean

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

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

提问者:夜还没黑 2017-04-12 20:59

个回答

  • 血夜之末
    2020-10-14 15:47:20

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


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


  • 想好好学习的懒人
    2019-07-16 10:48:53

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


  • jeff_zhao
    2017-04-13 16:06:55

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