• @Configuration和@Component注解的区别


    1.@Configuration和@Component注解的源码如下

    (1)Configuration注解源码如下:

    @Target({ElementType.TYPE})
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @Component
    public @interface Configuration {
        @AliasFor(
            annotation = Component.class
        )
        String value() default "";
        boolean proxyBeanMethods() default true;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    (2)Component注解源码如下:

    @Target({ElementType.TYPE})
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @Indexed
    public @interface Component {
        String value() default "";
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    (3)通过源码可以看出, @Configuration 注解本质上还是 @Component,只不过Configuration注解多了
    boolean proxyBeanMethods() default true;这一行内容。
    ①@Configuration 中所有带 @Bean 注解的方法都会被动态代理(cglib),因此调用该方法返回的都是同一个实例 ②@Conponent 修饰的类不会被代理,每实例化一次就会创建一个新的对象。

    2.Configuration注解的使用细节

    (1)配置类里面使用@Bean标注在方法上给容器注册组件,默认是单实例的
    (2)配置类本身也是组件
    (3)proxyBeanMethods:代理bean的方法
    Full(proxyBeanMethods = true)【保证每个@Bean方法被调用多少次返回的组件都是单实例的】
    Lite(proxyBeanMethods = false)【每个@Bean方法被调用多少次返回的组件都是新创建的】
    组件依赖必须使用Full模式默认。其他默认是否Lite模式

    (4)实例

    @Configuration(proxyBeanMethods = false) //告诉SpringBoot这是一个配置类 == 配置文件
    public class MyConfig {
        @Bean //给容器中添加组件。以方法名作为组件的id。返回类型就是组件类型。返回的值,就是组件在容器中的实例
        public User user(){
            User zhangsan = new User("zhangsan", 18);
            //user组件依赖了Pet组件
            zhangsan.setPet(tomcatPet());
            return zhangsan;
        }
        @Bean("tom")
        public Pet tomcatPet(){
            return new Pet("tomcat");
         } }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    (5)最佳实战
    ①配置 类组件之间无依赖关系用Lite模式加速容器启动过程,减少判断
    ②配置类组件之间有依赖关系,方法会被调用得到之前单实例组件,用Full模式

  • 相关阅读:
    理解Window和WindowManager(一)
    戏说领域驱动设计(廿六)——再谈事务
    DGIOT数字工厂工单结构介绍
    如何在windows环境下编译T
    一文2000字手把手教你自动化测试平台建设分享
    React知识点系列(2)-每天10个小知识
    day35-IO流02
    电子学:第010课——实验 8:继电振荡器
    672.灯泡开关2|数学推理|6个周期|影响开关
    基于SSM+Vue的医院医患管理系统
  • 原文地址:https://blog.csdn.net/y516369/article/details/127598350