IT袋

当前位置:主页 > 对比评测 >

@Configuration和@Component区别

@Configuration和@Component区别

时间:2024-01-19 13:40:55 来源:IT袋 作者:马勇
导读:@Configuration和@Component区别,一篇方法教程,与您分享@Configuration和@Component区别的内容,具体详情如下: 可能有人会这样回答; @Component与@Configuration注解代码层面分析 @Target(ElementType.TYPE)@Retention(Re

@Configuration和@Component区别

一篇方法教程,与您分享@Configuration和@Component区别的内容,具体详情如下:

可能有人会这样回答;

  • @Component与@Configuration注解代码层面分析
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Indexed
public @interface Component {
 String value() default "";
}
Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Configuration {
 @AliasFor(annotation = Component.class)
 String value() default "";
 boolean proxyBeanMethods() default true;
}

从定义来看, @Configuration 注解本质上还是 @Component,因此 @ComponentScan 能扫描到@Configuration 注解的类

@Configuration和@Component区别

思考;@Component和@Configuration作为配置类的差别?

1. @Component和@Configuration作为配置类的差别

官方文档区别:@Component注解类中使用@Bean注解和在@Configuration中使用是不同的。在@Component注解注册到 Spring 中的 Bean 是不会使用 CGLIB进行增强,而@Configuration 注解注册到 Spring 中的 Bean 是一个 CGLIB 代理的 Bean

通过如下案例进行分析,分别向 Spring 容器中注入两个 Bean,MyConfig01 和 MyConfig02,其中,MyConfig01 上添加的是 @Configuration 注解而 MyConfig02 上添加的则是 @Component 注解。

@Configuration
public class MyConfig01 {
}
@Component
public class MyConfig02 {
}

测试

@SpringBootTest
public class DiffTest {
    @Test
    public void test1() {
        AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(DiffApplication.class);
        MyConfig01 myConfig01 = ctx.getBean("myConfig01", MyConfig01.class);
        MyConfig02 myConfig02 = ctx.getBean("myConfig02", MyConfig02.class);
        System.out.println("myConfig01 = " + myConfig01);
        System.out.println("myConfig02 = " + myConfig02);
    }
}

最终打印结果如下

myConfig01 = com.zbbmeta.config.MyConfig01$$EnhancerBySpringCGLIB$$2944909f@2e0fdbe9
myConfig02 = com.zbbmeta.config.MyConfig02@16a3cc88

从上面这段代码中,我们可以得出来两个结论:

  • @Configuration 注解也是 Spring 组件注解的一种,通过普通的 Bean 扫描也可以扫描到 @Configuration。
  • @Configuration 注解注册到 Spring 中的 Bean 是一个 CGLIB 代理的 Bean,而不是原始 Bean,这一点和 @Component 不一样,@Component 注册到 Spring 容器中的还是原始 Bean。

可能一些文章讲到这里就结束了,可是在这里再给大家引出一个Spring概念,@Configuration 注解的 Full 模式和 Lite 模式

2. @Configuration 注解的 Full 模式和 Lite 模式

相关阅读